• 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的属性。另一种是在规则文件中生命的属性。

    最终结果如下图:

  • 相关阅读:
    [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等
    ubuntu下设置开机自启动项
    【JSP】Cookie的使用及保存中文,并用Cookie实现购物车功能
    汉语-词语:笑面虎
    汉语-词语:阴险
    汉语-词语:奸猾
    汉语-词语:奸诈
    汉语-词语:厚道
    汉语-词语:忠厚
    汉语-词语:狡猾
  • 原文地址:https://www.cnblogs.com/esrichina/p/2643640.html
Copyright © 2020-2023  润新知