现在的位置: 首页 > 综合 > 正文

利用CityEngine的规则文件制作标注

2018年09月24日 ⁄ 综合 ⁄ 共 1283字 ⁄ 字号 评论关闭

      有很多朋友问到如何生成带建筑名称、道路名称标注的模型,现在通过编写规则文件、制作字符库图片的方式实现标注名称的动态改变,在此与大家分享。欢迎各位对规则改进升级,增强规则文件的使用范围。

英文标注

      

       在CityEngine2014和CityEngine 2014.1版本创建工作空间时,Esri制作了英文标注的规则文件(…\ESRI.lib\rules\General\Text.cga),可以直接利用该规则文件实现英文字符的标注。

      值得注意的是由于国内使用的电脑一般采用的是中文操作系统,直接打开规则时会看到如下图的错误:

这个规则本身没有出错,错误是由字符编码造成的,在文件导航窗口的规则文件上右键选择“Properties”,按下图做修改:
这个时候错误提示就消失了,规则文件可正常使用。如下:

中文标注

     

   或许有很多朋友迫不及待的想问能否用此方法制作中文字符的标注呢?答案是肯定的,为了帮助大家理解Esri中国为大家提供了一个中文标注的示例(下载地址:ChineseText),可根据自己的需要进行修改和扩展,修改和扩展的方法如下:

字符库的增减:字符库以图片的方式存储在工程的贴图库目录下”… \assets\General\Text\alphabet_lowercase_letters.png”如:

        可通过修改图片的方式增减增减字符的数量。用户根据需要设置图片的大小与图处中字符的行列数。

规则中字符库的增减:在规则文件中通过自定义函数“getNbr(Pre)”函数的方式记录图片中字符的位置,其顺序上自左向右、自下向上,其中左下角的字符记录的数值为0。如下:

修改规则文件中记录图片行列数的语句:在规则文件中修改规则Letters(myString,mySize)中用到setupProjection(0,scope.xy,'26,'3),其中的26代表一行有26个字符,3代表图片中有3行字符,示例代码如下:

Letters(myString,mySize) -->
	s(mySize,1,mySize) t(0,-1,0) 
	i("builtin:cube") 
	comp(f){ top: setupProjection(0,scope.xy,'26,'3) projectUV(0)
				  PrintLetters(myString,len(myString)) }

在规则文件中修改规则LetterTexture(myLetterNbr)中用到的translateUV(0,myLetterNbr%26/26,floor(myLetterNbr/26)%3/3),其中26和3代表的意义与上文中所指一样,不再赘述。

LetterTexture(myLetterNbr) -->
	texture(alphabetFolder + getTextureFile(myLetterNbr))
	translateUV(0,myLetterNbr%26/26,floor(myLetterNbr/26)%3/3)

然后就可以使用该规则,并通过修改Text属性实现字符的自动变化如下图:

抱歉!评论已关闭.