CityEngine建模示例教程6:Basic Shape Grammar之Part 2:简单建筑物贴纹理

 

本节内容开始对之前构建的建筑贴上纹理。使用的规则是在上一节的基础上进行修改。作者也是在学习中,内容中如有不对的地方,欢迎大家指正。

1.        开始贴纹理之前,先在规则的最前面对要使用的纹理进行定义。

// textures

frontdoor_tex         = "facade/shopdoor.tif"

wall_tex     = "facade/brickwall2.tif"

dirt_tex     = "facade/dirtmap.15.tif"

roof_tex     = "roof/roof.tif"

由于要使用的窗户的纹理有9种不同的纹理,这些纹理存放在assets/façade文件夹中。在使用的时候,我们这里定义随机获取其中一个窗户纹理,这样窗户的纹理就是随机的了。

randomWindowTexture = fileRandom("*facades/textures/window.*.tif")

2.        为建筑物的正面和侧面定义纹理

Frontfacade -->

    setupProjection(0, scope.xy 1.5, 1, 1)

    setupProjection(2, scope.xy, scope.sx, scope.sy)

    split(y){ groundfloor_height : Groundfloor | { ~floor_height: Floor }* }

Sidefacade -->

    setupProjection(0, scope.xy, 1.5, 1, 1)

    setupProjection(2, scope.xy, scope.sx, scope.sy) 

    split(y){ groundfloor_height: Floor | { ~floor_height: Floor }* }

添加红色部分的代码,setupProjection()定义面在scope的xy平面使用color和dirt图片(由通道0和通道2代表)。在使用color map时,纹理图片将以1.5m×1m进行重复贴模。而使用dirt map时,将会在scope的x、y方向平铺。

其中setupProjection()命令有以下几种:

setupProjection(uvSet, axesSelector, texWidth, texHeight)

setupProjection(uvSet, axesSelector, texWidth, texHeight, widthOrigin, heightOrigin)

setupProjection(uvSet, axesSelector, texWidth, texHeight, widthOrigin, heightOrigin, uwFactor)

(1)uvset代表的是不同的纹理图层:

     
  

uv-set

  
  

Texture Layer

  

0

colormap

1

bumpmap

2

dirtmap

3

specularmap

4

opacitymap

5

normalmap

(2)axesSelector定义哪个轴分别代表u和v轴,可选的参数有:

scope.xy, scope.xz, scope.yx, scope.yz, scope.zx, scope.zy  以scope的轴定义

world.xy, world.xz, world.yx, world.yz, world.zx, world.zy  以world的轴定义

(3)texWidthtexHeight分别代表纹理的宽度和长度。如果值小于0,则认为可以对纹理做镜像显示,~符号表示值大小可以浮动,‘符号表示相对值。

(4)widthOriginheightOrigin分别代表距离u方向和v方向的偏移

(5)uwFactor设置w轴值相对于u轴的系数,默认为0

3.        添加Roof规则

Roof -->

    setupProjection(0, scope.xy, scope.sx, scope.sy)   

    texture(roof_tex)

    projectUV(0)

其中projectUV()命令含义如下:

命令:projectUV(uvSet)

指定纹理应用于哪个uvset。

4.        为窗户和门指定纹理:

Window -->

    s('1,'1,0.4)

    t(0,0,-0.25)

    texture(randomWindowTexture)

    i(window_asset) 

Door -->

    s('1,'1,0.1)

    t(0,0,-0.5)

    texture(frontdoor_tex) 

    i("builtin:cube")  

5.        定义Wall和SolidWall的纹理

Wall -->

    color(wallColor)

    texture(wall_tex) 

    set(material.dirtmap, dirt_tex)

    projectUV(0) projectUV(2)

 

SolidWall -->

    color(wallColor)

    s('1,'1,0.4)

    t(0,0,-0.4)

    texture(wall_tex) 

    set(material.dirtmap, dirt_tex)

    i("builtin:cube:notex")  

    projectUV(0) projectUV(2)

为Wall和SolidWall定义使用的纹理,使用set()命令定义在material.dirtmap属性,使用dirt_tex纹理。然后定义了将纹理贴在color和dirt通道。

set(attribute, bool value)

set(attribute, float value)

set(attribute, string value)

set命令将一个值指定给当前shape的一个属性。属性分为两类,一种是builtin属性,就是内置属性,例如material的属性。另一种是在规则文件中生命的属性。

最终结果如下图:

原文地址:https://www.cnblogs.com/esrichina/p/2643640.html