小言_互联网的博客

cityengine规则建模实例

228人阅读  评论(0)

以下是cityengine建模实例代码
必要的文字性说明都在代码注释中标明了

/**
 * File:    myrule3.cga
 * Created: 20 Feb 2021 08:45:29 GMT
 * Author:  86159
 */

version "2019.0"
//以上是新建规则rule文件自带的代码

const groundwall_tex="assets/groundwall.png"
const wall_tex="assets/wall.png"
const door_tex="assets/door.png"
const window_tex="assets/window.png"

//定义纹理图片为常量,“”部分是图片文件路径

attr height=24
Lot-->
   extrude(height)  Building
   
Building-->
   comp(f) {
    front : Frontfacade |
             side  : Sidefacade  |
             top   : Topfacade    }
//组件分离函数分离各个面并命名
   attr groundfloor_height=5.5
   attr floor_height=4.5
   attr tile_width=4

Frontfacade-->
   split(y) {
    groundfloor_height : Groundfloor|
              {
   ~floor_height     : UPEfloor}*  }       
//纵向切割,一楼底层,其他上层楼重复切割得出
              
UPEfloor-->
   split(x){
     1           : Wall|
            {
   ~tile_width  : Tile}*|
              1          : Wall    }
//横向切割出墙面和房间格
              
Groundfloor-->
   split(x){
   {
   ~tile_width  :  GroundTile}*|
             5            :  EntranceTile|          
            {
   ~tile_width  :  GroundTile}* } 
//横向切割出一楼墙面和房间格   

Tile-->
   split(x){
   ~1 :  Wall                                         |
            2  :  split(y){
    1 : Wall| 1.5 : Window| ~1 : Wall} |
            ~1 :  Wall                                          }
//对房间格进行纵向切割,分出窗户以及窗户上下的墙面   

GroundTile-->
   split(x){
    ~1 : GroundWall|
             2  : split(y){
    1 : GroundWall | 1.5 : Window | ~1 : GroungWall}* |
             ~1 : GroundWall                                                   }
//对一楼房间格进行纵向切割,分出窗户以及窗户上下的墙面 

Sidefacade-->
   split(y){
    groundfloor_height : Sidefloor|
             {
   ~floor_height     : Floor}*   }
//对侧墙分割出一楼大厅的部分,其余为整面侧墙,不进行楼层分割

Sidefloor-->
   split(x){
    1             :  GroundWall   |
             {
   ~tile_width  :  GroundTile}* |
             1             :  GroundWall    }
//对一楼大厅侧面进行横向切割,分出墙和房间格
//再根据之前对GroundTile的定义可以直接得出带窗户的房间



//以下是对各个部件进行贴图的操作
//其中门窗会涉及到伸缩,使用平移函数t(tx,ty,tz)即可
GroundWall-->
   setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(groundwall_tex)
   projectUV(0)


Wall-->
   setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(wall_tex)
   projectUV(0)

Window-->
   t(0,0,-0.25)
   setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(window_tex)
   projectUV(0)

 EntranceTile-->
    t(0,0,-0.25)
   setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(door_tex)
   projectUV(0)

Floor-->
   setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(wall_tex)
   projectUV(0)
   
Topfacade-->
   setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(wall_tex)
   projectUV(0)
/*
 setupProjection(0,scope.xy,scope.sx,scope.sy)
   texture(wall_tex)
   projectUV(0)
 这一段代码是纹理贴图核心规则代码
 */

此图是我找的纹理图片的存放位置路径

显然我的纹理图片都是我瞎找的,其实就是我在我的电脑壁纸上面抠的不同位置的图()咳咳,将就看吧。下次注意(bushi


转载:https://blog.csdn.net/qq_53411079/article/details/114155845
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场