Blender MMAP + Plateau再現

このページは?

  • 2022年度のアルバイトさんが作成してくれた内容です。お気づきの点がございましたら、 koizumi.naoya@uec.ac.jpにご連絡下さい。
  • MMAPという光学素子でできる空中像をProject PLATEAUの都市モデルの中で再現することで、空中像を使ったデジタルサイネージのCG動画を製作する例を紹介しています
  • 以下のような動画を書き出します

  • 使用ソフト・使用モデルなど
    • Blender:3DCGソフト
    • Project PLATEAU:都市の3Dモデル
    • MMAPs Module:BlenderでMMAPsを再現するアドオン

準備

Blender・MMAPsを生成するアドオンのインストール

  1. Project PLATEAUのモデルをダウンロードします

  2. ダウンロードしたzipファイルを適当な場所に展開します

    • 展開すると次のようになります

    Untitled


Project PLATEAUのモデルについて

Plateauとは?

  • 国土交通省が公開している日本の都市の3Dモデルです
  • https://www.mlit.go.jp/plateau/
  • 都市計画や災害対策などに使用されるそうです

ファイル形式

  • FBX, OBJなど複数ありますが、今回はFBXを使用しています

LOD1・LOD2について

  • LOD1は、テクスチャが貼られていません(建物がただの白い箱です)
  • LOD2は、テクスチャが貼られています
    • ただしLOD2のモデルが公開されている地域は限られています
    • LOD1よりも重いです

ダウンロードしたファイルの中身について

  • bldg:建物のモデルです

    Untitled

  • brid:橋のモデル(高速道路の高架橋・鉄道橋含む)です

    Untitled

  • dem:地形(地面)で、テクスチャは無いようです

    Untitled

  • tran:道路で、テクスチャは無いようです

  • PDFファイル

    • 格子状に区切られた地図が描かれています
    • 格子に記載されている番号がその地域のモデル番号です
    • 例えば国立競技場であれば、「53394517_****.fbx」にモデルが入っています
    • ピンク色の区域が、LOD2(テクスチャが張られているモデル)に対応している地域です

以下、(任意)と書かれた項目は実施してもしなくてもよい手順です


PLATEAUのモデルをBlenderで読み込む

  1. File → Import → FBX (.fbx)を押します

    Untitled

  2. FBXファイルを選択します

    1. 読み込みたいPLATEAUのfbxファイルを選択します
      • この例では、LOD2の「53393595_bldg_6677.fbx」を使用しています
    2. 右下のImport FBXを押してインポートします
      • 読み込みには長時間かかる場合があります

    Untitled

  3. 読み込み完了しても一見何もないように見えますが、縮小すると以下のイメージのように都市モデルの塊を見つけることができます

    Untitled

    • このように原点から離れた位置にモデルが読み込まれるのは、PLATEAUの複数の区域のfbxファイルをインポートしても重ならないようになっているためだと思われます
    • したがって、複数のPLATEAUのfbxファイルを読み込みたい場合は、手順4に進む前にfbxファイルごとに手順2, 3の作業を繰り返します
  4. (任意)原点から離れたモデルを中心近くへ移動します

    • 原点から離れた位置にモデルがあると扱いづらいので、以下の手順で原点近くに移動します

      1. 右上の座標軸のイメージの中から青色の「z」のマークを押し、真上からの視点に切り替えます
      2. 3D Viewport(真ん中の画面)上でAキーを押し、すべてのオブジェクトを選択します。
      3. キーボードの「Gキー」を押すとモデルが移動できるので、原点近くに移動します

      Untitled

    1. さらに、そのままだとモデルが小さいので、大きさを変更します

      1. すべてのオブジェクトを選択した状態で3D Viewport上のObject→Apply→Locationを押します

        Untitled

      2. SキーやScaleの値を変えることで大きさを100倍程度にします

        Untitled

  5. 右上のViewport Shadingから「Display in Material Preview mode」などを押すことでモデルを確認できます

    Untitled


PLATEAUのモデルを加工する(任意)

  • 今回のサンプル動画では、一部の建物の看板を撤去し、その位置にMMAPsを配置しています
  • このように建物を加工する時は、次のような手順で実施することができます

オブジェクトを削除する方法

  • オブジェクトを選択し、右クリック → Deleteを押します

    Untitled

メッシュの一部を切り取る方法

  1. 加工したいメッシュを選択します

    1. 今回の例では、この建物の上側の看板を撤去します

    Untitled

  2. Tabキーを押して、「Edit Mode」に切り替えます

  3. 画面左上の小さなボタンが「Vertex select」になっていることを確認し、移動したい頂点を選択します

    Untitled

  4. Gキーを2回押して任意の位置に頂点を移動し、不要な部分を除去します

    Untitled

  5. 各頂点、各メッシュに対して同様の作業をします

    Untitled


PLATEAUのオブジェクトを結合する(任意)

なぜオブジェクトを結合するか?

  • PLATEAUのFBXファイルは、1つの建物につき数個から数十個のオブジェクト・メッシュで構成されています
  • したがって、合計のオブジェクト数が非常に多くなってしまっています
  • これらのを一つに結合することで、動作を軽くできる可能性があります
  • 建物の量によっては、この作業に非常に長い時間(数時間)を要する場合があります
  • この作業を行った後でBlenderからFBXをエクスポートすることで、Unityでも扱いやすい都市モデルを得られます

結合手順

  1. あらかじめ加工しておきたい(看板撤去など)建物があれば、加工を済ませます

  2. 上のタブの一番右にある「Scripting」をクリックします

    Untitled

  3. Window →Toggle System Consoleをクリックして、システムコンソールを起動します

    Untitled

    1. 次のようなシステムコンソール画面が起動します

      Untitled

  4. 「New」を押して、新しいスクリプトファイルを作ります

    Untitled

  5. 以下のプログラムをコピー&ペーストします

    # 参考サイト https://bluebirdofoz.hatenablog.com/entry/2018/04/23/000846
    
    # Blender Python (BPY)をインポート
    import bpy
    
    # 指定したオブジェクトの子オブジェクトをすべて結合する
    def join_children_object(check_obj):
        # 引数のオブジェクトを選択状態にする
        check_obj.select_set(True)
        # 引数のオブジェクトの子オブジェクトの一覧を取得する
        children_objs = check_obj.children
    
        last_obj = None  # 最後のオブジェクトを記録するための変数
        # すべての子オブジェクトについて
        for children_obj in children_objs:
            if (children_obj == None):
                break
            # 子オブジェクトを選択する
            children_obj.select_set(True)
            # 最後のオブジェクトを更新
            last_obj = children_obj
        # 最後のオブジェクトをアクティブオブジェクトにする
        bpy.context.view_layer.objects.active = children_obj
        # 引数として渡された親オブジェクトは選択解除(親とは結合しない)
        check_obj.select_set(False)
        # オブジェクトを結合
        bpy.ops.object.join()
        # 結合したオブジェクト名を親と同じ名前にする
        last_obj.name = check_obj.name
        # 結合したオブジェクトは選択解除
        last_obj.select_set(False)
        return
    
    def select_join(collection_name='Collection'):
        # 結合したいオブジェクトの含まれるCollectionを選択
        check_obj = bpy.data.collections[collection_name]
        print(check_obj)
        # Collectionに含まれるオブジェクト一覧を取得
        children_objs = check_obj.objects
        # Collectionに含まれるすべてのオブジェクトについて
        for children_obj in children_objs:
            # MESHオブジェクトはスルー
            if children_obj.type == 'MESH' or children_obj.type == None:
                continue
            print(children_obj)
            # そのオブジェクトの子オブジェクトをすべて結合
            join_children_object(children_obj)
        return
    
    # 以下にPLATEAUのモデルが含まれているCollectionの名前を入力
    collection_name = "Collection"
    
    # collection下のオブジェクトを結合
    select_join(collection_name)
    print("Finish")
  6. プログラムを少しだけ書き換えます

    1. プログラムの下のほうに「collection_name = “Collection”」となっている箇所があります。ここを、PLATEAUのオブジェクトが入っているCollection名に書き換えます。
    2. 例えば、PLATEAUのモデルが以下のように”Collection”の中に入っている場合は、書き換える必要はありません。

      Untitled

  7. Run Scriptボタンを押します

    1. Run Scriptボタンを押してから完了するまでに数時間かかる場合があります

    Untitled

    • 実行中、Blenderは「応答なし」となりますが、システムコンソール画面が更新されていれば正常に動作しています
  8. 正常に終了すると、システムコンソールに「Finish」と出力されます

    Untitled

  9. 次のように、モデルの量が削減されていることが確認できます

    Untitled


BlenderにMMAPsを配置する

MMAPsのアドオンの詳細は以下のページを参考にしてください

https://www.media.lab.uec.ac.jp/?p=2569

MMAPsの生成・移動

  1. 「準備」の手順でMMAPsを生成するアドオンが正常にインストールされていると、3D Viewportの右側に「MMAPs」のタブが現れるため、それを選択します。

    Untitled

  2. Launchをクリックして、MMAPsを生成します

    1. パラメータはそのままでいいと思います
    2. この作業には時間がかかる場合があります
  3. MMAPsが生成されます

    Untitled

  4. Gキー(移動)やRキー(回転)、Sキー(大きさ)を利用して、任意の位置へ移動します

    Untitled

ディスプレイの作成・VCFの生成

  1. Add → Mesh → Plane で、平面を生成します

    Untitled

  2. Sキーで、任意のディスプレイの大きさに変更します

    1. MMAPsの半分くらいの大きさでいいと思います
    2. 大きさは後でも変更できます

    Untitled

  3. 画像を貼り付けます

    1. Planeを選択した状態で、右の Material Properties → New を押します

      Untitled

    2. Surface → Emissionの左の丸 → Image Texture を押します

      Untitled

    3. Openを押す → 画像ファイルの選択 → Open Image を押します

      Untitled

      Untitled

    4. 画像のように、Planeに画像が適用されます

      Untitled

  4. (任意)VCFの生成

    • VCFを利用することで、迷光を減らすことができます

      1. 3D Viewport の右側のタブから、「VCF」をクリックします

      Untitled

    1. 「VCF of Display parameters」のMbtaを0.0にしてから、Launchを押します

      • VCFの生成には時間がかかる場合があります

      Untitled

    2. 下の図のように、DisplayVCFを選択した状態でSキーを押し、大きさがPlaneとだいたい同じくらいになるように変更します

      Untitled

    3. ここで、以下の動画のように、ディスプレイを横から見たときに画像が見えなくなるか確認します。

      vcf_video.mp4

  5. Planeを選択(VCFを生成した場合はDisplayVCFも一緒に選択)して、G(移動)、R(回転)、S(拡大縮小)キーでMMAPsの下あたりへ移動します

    • MMAPsとディスプレイのなす角が45度程度になると良いと思います

    Untitled

  6. Viewport shadingを「Display render preview」に切り替え、MMAPsの正面から見たときに空中像がレンダリングされていることを確認します

    • 右側の「Render Properties」のRender Engineが「Cycles」になっていることを確認します

    Untitled

  7. HDRIなどを適当に設定するとそこそこいい感じになると思います

    1. VCFなし

      Untitled

    2. VCFあり

      Untitled