チュートリアル 3: マップ制御

チュートリアル データ

チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。

概要

都市のモデルは膨大な数のオブジェクトで構成されており、これらのオブジェクトの属性をひとつひとつ設定していくのはコストも労力もかかり、不可能です。本チュートリアルでは、CGA ルール パラメーターの使用方法とスカイライン、土地利用のコントロールについて学習します。

演習
Part 1: CGA ルール パラメーター
Part 2: 都市のスカイラインを制御する
Part 3: 建物の土地利用タイプをマップで制御する

Part 1: CGA ルール パラメーター

本チュートリアルでは、最初に CGA ルール パラメーターがどのように使用されるのかを学習します。

  1. Scene フォルダーから、mapcontrolTutorial_01.cej シーンを開きます。
    開いたシーンにはすでに、2 つのマップ レイヤー (Heightmap と Water) および区画のシェープ付きの道路ネットワーク レイヤーが含まれています。
    この時点では、区画 (Lot) を 1 つ選択して[Inspector] ([Window] メニュー → [Inspector]) ウィンドウの中でその属性を確認しても、パラメーターが割り当てられていない (ルール パラメーターに何もない) はずです。そこで、区画にルール ファイルをアサインして、どのように変わるかを確認します。

  2. [Scene Editor] ウィンドウの中で Streetnetwork レイヤーを右クリック → [Select Object] を選択します。

  3. [Inspector] ウィンドウで、[Shapes] タブ → [Rule File…] をクリックし、ルール ファイルとして simpleBuildingShells_01.cga を選択します。

  4. 再度 1 つの区画を選択します。この時点では、[Inspector] ウィンドウには属性 height が表示されます。

    これらはどこから来たのでしょうか?ルール ファイルをシェープ (この場合は区画) に割り当てると、ルール ファイルの属性は区画のルール パラメーターとして目に見える状態になります。ソース カラムの Rule アイテムは値がルール ファイルから取得されたことを示しています。

  5. [Inspector] ウィンドウの 中にあるルール ファイルのリンク (simpleBuildingShells_01) をクリックし、割り当てられたルール ファイルを開きます。

  6. ルール ファイルの最上部には属性 height が定義されています。
    この値はルール ファイルにおいて建物の高さを定義するために使用されます。

    // height value
    attr height = 80
    
  7. 区画を再選択し、[Generate] ボタンをクリックして建物を生成します。高さ 80 メートルの建物が生成されます。

  8. ここで [Inspector] ウィンドウの中の height 値を 80 から 150 に変更します。
    属性接続エディターを開くと、ソースが Rule-defined value から User-defined value (ユーザー定義の値) に変化していることが分かります。
    建物に対するルール パラメーター height は [Inspector] ウィンドウで設定された値によって抑制されています。他の触れていない区画はまだルール ファイルの height 値を使用しています。

  9. 建物を再度生成し、建物の高さが変化したかを確認してください。このチュートリアルの Part 1 が完了した時点では、シーンは下図のようになっているはずです。

  10. mapcontrolTutorial_02.cej を開くと、模範のシーンを確認することができます。

Part 2: 都市のスカイラインを制御する

※スカイライン = 丘や都市などの空を背景とした輪郭。

チュートリアルの設定

Part 1 から行っている場合はそのまま続けてください。Part 2 から始める場合はシーン mapcontrolTutorial_02.cej を開いてください。

スカイライン マップ

現在の設定でルール ファイルをアサインしていくつかの建物を生成すると、下図のような都市になるはずです。

ルール ファイルでは、建物は 80 メートルと定義されていますが、すべての建物が 80 メートルでは、あまり説得力のある都市にはなりませんので、スカイラインの見栄えを良くしましょう。
Part 2 では Part 1 で行ったように CGA シェープ属性を手動で設定する代わりに、スカイライン マップを使用してすべての建物の高さを一度に変更します。下図の小さい画像は湖を青で表した地形マップです。

上図のスカイライン マップの赤チャンネル (バンド) は、このエリアの建物の高さを表しています。スカイライン マップを地形マップと比較すると、これから湖の縁に沿ってスカイラインを形成しようとしていることが分かると思います。また、左上方に別の市街部ができることも分かります。

  1. 新規マップ レイヤーを作成します。[Layer] メニュー → [New Map Layer…] → [Mapping] を選択します。

  2. Mapping file として、maps フォルダーから skylineMap.png ファイルを選択します。

  3. [Keep ratio] (縦横比を維持) ボタンをオフに切り替えます。

  4. X および Y size を 3000 に設定します。

  5. [Alignment] ボタンが中心 (黒い四角が中央にある状態) に設定されていることを確認します (中央に設定されていない場合、アイコンをクリックすると、alignment のモードを変更できます)。

  6. [Mappings] の [Attribute] のあたりを右クリック → [Add Row…] を選択して新規マッピング属性を作成します。

  7. [Attribute] の欄に “skylineValue” という名前を付けます。

  8. 画像の赤チャンネル (バンド) が高さ (height) として解釈されるようにしたいので、[Channel] ドロップダウンから [red] を選択します。

  9. 建物の高さは 20 (0% red) と 200 (100% red) メートルの間で変化させたいので、Minimum 値として 20 を、 Maximum 値として 200 を入力します。

  10. [Finish] をクリックすると、[Scene Editor] ウィンドウに Mapping レイヤーが表示されます。[Inspector] ウィンドウの [Name] でレイヤー名を Skyline Map に変更します。

  11. [Inspector] ウィンドウで、作成した新規マップ レイヤーの elevation offset 値を調整し、より見栄えの良い位置にくるようにします。alpha 値を使用すると透過の設定をすることができます。
    ここで、ルール ファイル中に存在する属性名 height を選択することで、スカイライン マップによるルール パラメーターの制御が可能になります。

  12. ルール ファイルを区画に再適用し、CityEngine にこの関連付けを認識させます。

  13. すべての区画を選択します。

  14. [Inspector] ウィンドウにて、ルール属性 height のドロップダウンから [Connect Attribute] を選択します。[Attribute Connection Editor] が起動します。

  15. [Layer attribute] を選択し、Skyline Map レイヤーと属性 skylineValue を選択します。

    ソース ファイルをスカイライン レイヤーに設定すると値に「?」記号が付与されます。これは選択アイテムに異なる値が含まれている (すべての区画に異なる高さ値が与えられている) ことを意味します。

  16. 1 つの区画を選択して再度 [Inspector] ウィンドウを確認します。height の値はスカイライン マップの値に関連付けられているはずです。

  17. ここで、スカイライン マップの赤いエリア周辺の区画をいくつか選択し、建物を生成します。

    これで建物の高さに強弱がつき、大分見栄えが良くなりますが、さらに CGA グラマーによる高度なテクニックを使用して見栄えを改善します。
    [Navigator] ウィンドウの rule フォルダーから simpleBuildingShells_02.cga をダブルクリックして開きます。以下の関数を確認します。

    バリエーションを加味した建物の高さ計算

    // calc height with variation
    getHeight(area) = 
     case area > 600 : rand(0,40)+height
     case area > 200 : rand(0,40)+height/2
     else: rand(15,30)
    

    スカイライン マップから、直接建物の高さに値を割り当てる代わりに、上記のユーザー定義関数を使用します (CGA ルールと関数についての詳細は、チュートリアル 6 の「基本的なシェープグラマー」をご参照ください)。

    この関数では、以下の項目が設定されています。

    • 面積の大きな区画のみに高いビルを生成する。
    • スカイラインにバリエーションを加えるためにスカイライン マップの値にランダム値を追加する
  18. [Scene Editor] ウィンドウ → Streetnetwork レイヤーを右クリック → [Select] → [Select Objects] を選択し、すべての区画 (Lot) レイヤーを選択します。

  19. [Scene Editor] ウィンドウ → Streetnetwork レイヤーを選択 → [Inspector] ウィンドウの [Rule File…] で [Assign] ボタンをクリックし、ルール ファイル simpleBuildingShells_02.cga を選択します。
    ここまでのステップで、シーンは下記の図になっているはずです。

Part 3: 建物の土地利用タイプをマップで制御する

チュートリアルの設定

Part 2 から行っている場合はそのまま続けてください。Part 3 から始める場合はシーン mapcontrolTutorial_03.cej を開きます。

建物の土地利用タイプ属性の制御

都市はしばしば特定の土地利用タイプによりエリアが分かれている場合があります。ここでは 3つの異なる土地利用タイプに対する属性を設定する方法を紹介します。下図は商業地区が青、工業地区が赤、住宅地が緑色で示されたマップです。

土地利用マップレイヤーの作成

マップ レイヤーを作成する前にルール ファイル simpleBuildingShells_03.cga を確認します。この中には以下のような 3 つの CGA 属性があります。

// land use types
attr t_industrial = 0
attr t_commercial = 0
attr t_residential = 0

これから作成するマップレイヤーには、これらと名前が一致した属性を持たせなければなりません。

  1. [Scene Editor] ウィンドウで Skyline Map レイヤーを非表示にします。

  2. [Layer] メニュー → [New Map Layer…] → [Mapping] をクリックして新規マップ レイヤーを作成します。

  3. Mapping File として maps フォルダーにあるファイル areatypes.png を選択します。

  4. [Keep ratio] ボタンをオフに切り替えます。

  5. X-SizeZ-Size を 3000 に設定します。

  6. [Alignment] が中央に設定されていることを確認します。

  7. [Mappings] の [Attribute] のあたりを右クリック → [Add Row…] を選択して新規マッピング属性を作成します。

  8. マッピング属性を 3 つ作成します。

    • 最初の属性の名前を “t_industrial” とし、[Channel] ドロップダウンから red を選択します。
    • 二番目の属性の名前を “t_residential” とし、[Channel] ドロップダウンから green を選択します。
    • 三番目の属性の名前を “t_commercial” とし、[Channel] ドロップダウンから blue を選択します。

    これらのパラメーターは後で再取得されることになります。したがって、Minimum および Maximum のデフォルト値の 0 および 1 のままにしておけば、この後の利用のためにも良い汎用的な割り当てとなります。

  9. [Finish] をクリックし、マップ レイヤーを作成します。

  10. [Inspector] ウィンドウの [Name] で、レイヤー名を 「LandUseMap」(土地利用マップ) に変更します。

  11. [Inspector] ウィンドウにて、新しく作成したマップ レイヤーの表示オフセットを調整し、見やすい場所に移動します。透過したい場合は alpha 値を調整します。

  12. 作成したマップ レイヤーを選択し、[Inspector] ウィンドウで属性をチェックします。
    3 つの CGA 属性が正しくマッピングされているかどうかを確認します。もし後でマップ レイヤーの設定を変更したい場合もこのビューアを使用します。

    LandUseMap の値を評価します。

  13. [Scene Editor] ウィンドウ → Streetnetwork レイヤーを右クリック → [Select] → [Select Objects] を選択し、すべての区画 (Lot) レイヤーを選択します。

  14. [Scene Editor] ウィンドウ→ Streetnetwork レイヤーを選択 → [Inspector] ウィンドウの [Rule File…] で [Assign] ボタンをクリックし、ルール ファイル simpleBuildingShells_03.cga を選択します。

  15. Attribute Connection Editor で、各 LandUse (土地利用) の属性パラメーターのソースが Landuse Type レイヤーに設定されていることを確認します。

    再度ルール ファイル simpleBuildingShells_03.cga を確認し、色の宣言や関数 functionlanduseTypeColor を確認してください。

    土地利用のカラータイプ:

    // color declarations
    red = "#ffaaaa"
    green = "#aaffaa"
    blue = "#aaaaff"
    white = "#ffffff"
    

    土地利用のカラータイプ:

    // Functions
    landuseTypeColor = 
           case t_industrial > t_commercial && t_industrial > t_residential : red
           case t_commercial > t_industrial && t_commercial > t_residential : blue
           case t_residential > t_industrial && t_residential > t_commercial : green
           else : white
    

    この関数は土地利用 (Landuse) マップから取得される値を解析しそれに対応する色を返します。もしマップ由来のカラー チャンネル値が他のチャンネルの値よりも大きければそれに対応する土地利用マップの色、つまり、工業地区の建物には赤、商業地区の建物には青、住宅地の建物には緑が返されます。color 演算子 color(landuseTypeColor) は、内部で landuseTypeColor 関数を呼び出しており、生成された建物に色が適用されます。

  16. すべての建物を生成します。

  17. シーン mapcontrolTutorial_04.cej を開いて、建物を生成すれば、本チュートリアルの最終結果の模範のシーンを確認することができます。