zoukankan      html  css  js  c++  java
  • 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的属性。另一种是在规则文件中生命的属性。

    最终结果如下图:

  • 相关阅读:
    Reusable action with query database
    Oracle实现分组统计记录
    Oracle行列转换的几种实现方法
    junit私有方法测试
    Junit实现抽象类测试(二)
    C++的性能C#的产能?! .Net Native 系列《二》:.NET Native开发流程详解
    C++的性能C#的产能?! .Net Native 系列向导
    c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥
    辞职敬礼
    WPF 心路历程
  • 原文地址:https://www.cnblogs.com/esrichina/p/2643640.html
Copyright © 2011-2022 走看看