テクスチャの適用

概要

高度なCGA では区画を整理したり、屋根の種類を増やしたりして日本の住宅地に見られる戸建て住宅を模した形状を作成しましたが、今回はその仕上げとして、建物モデルにテクスチャを貼り付けてより見栄えの良いものにします。

演習
テクスチャ画像の準備
テクスチャ貼り付け
今回作成した CGA

テクスチャ画像の準備

テクスチャに使用する画像は、サンプルデータを使用すれば作るまでもありませんが、残念ながら、日本の住宅地の作成に適用できそうなものはあまりありません。
ESRIジャパンが作成した屋根と建物の外観 (ファサード) のテクスチャ画像を ArcGIS Online のページよりダウンロードします。

ダウンロードが完了したら、Zip ファイルを 解凍し、CE2021_ZeroProject/assets/house フォルダーを MyProject プロジェクトの assets フォルダ ー の中にコピーしてください。
また、CE_ZeroProject/rules フォルダーには参考用として CGA の作成からテクスチャの適用で作成した CGA ルールのサンプル ファイルが格納されています。

プロジェクトの存在するワークスペースは、インストール後、初めて CityEngine を起動したときに設定しています。
使用しているワークスペースがどこにあるかわからない場合は、[Navigator] ウィンドウ でプロジェクト フォルダーを右クリック → [Properties] → [Resource] → [Location] に記述してあるパスを確認してください。

屋根のテクスチャ

[Navigator] ウィンドウの中で MyProject プロジェクトの中の assets → house フォルダーを開きます。
rooftile から始まる .jpg ファイルをダブル クリックして選択すると、プレビュー表示されます。

建物前面のテクスチャ

同様に house フォルダーの house_texture… も確認します。
これらは実際の家の写真を Crop Image ツールで正面から見た形に整形し、画像編集ソフトで壁などをきれいに塗りつぶすなどの加工をして作成しました。

テクスチャの変数化

これらのファイルをランダムに選択して変数に格納するため、CGA の中の attr roofcolor = ・・・と attr wallcolor = ・・・の行を以下の 2 行で置き換えます。

const roof_texture_file = fileRandom("house/rooftile*.jpg")
const wall_texture_file = fileRandom("house/house_texture*.jpg")

屋根の分解

屋根にテクスチャを適用するための準備として、Roof ルールを以下のように書き換えます。
comp(f) オペレーションを使用して屋根を要素分割し、屋根の上面のみを取り出して Rooftop ルールに送ります。
Triangle は、切妻屋根の下の三角形の部分ですが、この後何のルールにも渡さないという事で、末尾に「.」を付けます。

Roof-->
    40%:
        roofGable(20,1,1)
        comp(f){vertical:Triangle.|horizontal:NIL|all:Rooftop}
    40%:
        roofHip(20,1)
        comp(f){horizontal:NIL|all:Rooftop}
    else:
        roofShed(10)
        comp(f){top:Rooftop|vertical:Triangle.|horizontal:NIL}

テクスチャ貼り付け

モデル上の面へのテクスチャの貼り付けは、基本的に setupProjection、texture、 projectUV という 3 つのオペレーションで行います。
既に記載している Wall ルールを一旦削除した後、以下の 2 つのルールを CGA の末尾に追加します。

屋根へのテクスチャ貼り付け

Rooftop-->
    setupProjection(0,scope.xy,10,10) #対象図形の xy 面に 10x10m のサイズでテクスチャ画像を並べ、これを UV セット 0 として設定する
    texture(roof_texture_file) #テクスチャとして roof_texture_file に格納された画像 (パス) を使用する
    projectUV(0) #UV セット 0 のテクスチャ貼り付けを実行する

壁へのテクスチャ貼り付け

Wall-->
    setupProjection(0, scope.xy, scope.sx, scope.sy) #テクスチャのサイズを対象図形のサイズと同じにする
    texture(wall_texture_file)
    projectUV(0)

この記述では、建物の幅や高さにあわせて壁のテクスチャが引き伸ばされます。
それを防ぎたい場合は、setupProjection の第 3 、第 4 引数を屋根の場合のよう定数にします。

CGA が書けたら保存し、再度 [Scene] ウィンドウにて Blocks レイヤーを右クリック → [Select Objects] ですべての区画を選択後、モデルの生成 ([Generate models of selected shapes] ボタン) をしてみましょう。

だいぶ日本の住宅地っぽくなったのではないでしょうか?
今回、作成したモデルは直方体の箱に屋根を付けただけのシンプルなものでしたが、テクスチャを貼るだけでも一気にリアリティが増します。
対象図形の分割や UV セット、サイズ設定、マテリアル設定など、ここでは紹介しきれない機能がまだまだ豊富にあります。
また、窓枠やバルコニーなど細部のモデリングもルールで記述することができます。

今回作成した CGA

attr Height = rand(5,10)
const roof_texture_file = fileRandom("house/rooftile*.jpg")
const wall_texture_file = fileRandom("house/house_texture*.jpg")

Lot-->
    offset(-2,inside)  #敷地外周を2m後退して庭を作る
    innerRectangle(edge) {shape : Footprint | remainder :NIL} #フットプリントの形状を長方形にする
Footprint-->
    case geometry.area() < 50: NIL #50平米より狭い場合は消去
    else: 
        extrude(Height)
        House
House-->
    comp(f){top: Roof | side: Wall} #シェープをトップ (屋根) とサイド (壁) に分割
Roof-->
    40%:
        roofGable(20,1,1)
        comp(f){vertical:Triangle.|horizontal:NIL|all:Rooftop}
    40%:
        roofHip(20,1)
        comp(f){horizontal:NIL|all:Rooftop}
    else:
        roofShed(10)
        comp(f){top:Rooftop|vertical:Triangle.|horizontal:NIL}
Rooftop-->
    setupProjection(0,scope.xy,10,10) #対象図形の xy 面に 10x10m のサイズでテクスチャ画像を並べ、これを UV セット 0 として設定する
    texture(roof_texture_file) #テクスチャとして roof_texture_file に格納された画像 (パス) を使用する
    projectUV(0) #UV セット 0 のテクスチャ貼り付けを実行する
Wall-->
    setupProjection(0, scope.xy, scope.sx, scope.sy) #テクスチャのサイズを対象図形のサイズと同じにする
    texture(wall_texture_file)
    projectUV(0)