【第19回】3Dモデルを自在に操る!iDesktopXの3Dシーン構築・編集テクニック

こんにちは!GIS導入支援コンサルタントのippuku_timeです。

「5分で分かるSuperMap iDesktopX製品・機能紹介シリーズ」、第19回です。前回は、iDesktopXの基本的な「3Dビジュアライゼーション」機能で、2Dデータから3Dシーンを立ち上げる方法を見ました。今回はさらに一歩踏ль込み、3Dモデルをより詳細に、そして自在に作成・編集するための高度な「3D地理シーンの構築・編集」機能について解説します。これはまさに、デジタルツインを自らの手で育て上げるためのテクニックです。

【第19回】3Dモデルを自在に操る!iDesktopXの3Dシーン構築・編集テクニック


3D GISの価値は、単に現実世界を眺めるだけでなく、そこに新しい計画を加えたり、既存のオブジェクトを修正したり、さらには3D空間ならではの解析を行ったりすることで飛躍的に高まります。iDesktopXは、そのための包括的なツールセットを提供します。

図 GISインターフェース上での精密な3Dモデル編集のイメージ


1. ルールベースモデリング:2Dから精密な3Dへ

回の「クイックモデリング」は単純な押し出しでしたが、「ルールベースモデリング」はより詳細なモデルを作成するための機能群です。
(1) 建物の構築:
2Dの建物ポリゴン(フットプリント)から、壁の高さ、軒の出、屋根の形状や勾配などをパラメータで指定して、リアルな建物を自動生成します。
(2) ロフト (Loft):
複数の断面形状を、指定した経路(パス)に沿ってつなぎ合わせ、滑らかな3D形状を作成します。地下鉄のトンネルや、複雑な形状の橋梁などをモデリングするのに非常に強力です。
(3) テクスチャの抽出と貼付:
航空写真などの画像から、建物の屋上部分のテクスチャを自動で切り出して、作成した3Dモデルの屋根に貼り付けることができます。これにより、モデルのリアリティが格段に向上します。

2. モデルの軽量化と最適化

BIMモデルや詳細な3D都市モデルは、データ量が非常に大きくなりがちです。これらをGIS環境でスムーズに扱うためには、データの最適化が欠かせません。
(1) BIMの軽量化:
BIMモデルから、解析や可視化に不要な内部の構造(壁の中の鉄筋など)を取り除き、外殻だけを抽出する「外殻抽出」や、モデルの見た目を損なわない範囲でポリゴン数を削減する「メッシュ単純化」といった機能で、データを大幅に軽量化します。
(2) メッシュ操作:
3Dモデルの品質を向上させるための基本的な編集ツールです。重複した頂点や面を削除したり、面の向きがバラバラになっているのを修正(トポロジー修正)したりすることで、クリーンで安定したモデルデータを作成します。

3. モデル編集と3Dボリューム分析

既存の3Dモデルを編集したり、その体積を対象とした解析を行ったりする機能です。
(1) 3Dブール演算:
複数の3Dモデルを対象に、集合演算を行う非常に強力な機能です。
① 和 (Union): 2つの建物を1つに結合します。
② 差 (Difference): あるモデルから別のモデルの形状をくり抜きます。例えば、地形モデルから建物の基礎部分を掘削するシミュレーションが可能です。
③ 積 (Intersection): 2つのモデルが重なり合う部分だけを抽出します。
(2) 3Dバッファ:
点、線、面から3次元的なバッファを作成します。例えば、地下鉄の路線(3Dライン)から半径30mの円筒状バッファを作成し、建設工事が影響を及ぼす可能性のある範囲を3次元的に特定するといった解析が可能です。

4. 地形と写真測量モデルの専門的な操作

(1) TIN地形操作:
TIN(不規則三角網)で表現された地形データに対して、穴あけ(建物の基礎部分など)、クリッピング(特定の範囲の切り出し)、インセット(道路や河川モデルを地形に綺麗にはめ込む)といった操作が可能です。
(2) 写真測量モデルの操作:
Project PLATEAUなどで提供されるリアルな3D都市モデル(写真測量モデル)に対しても、同様の編集機能が提供されています。不要なオブジェクト(通行中の車や、撮影エラーで生じた浮遊物など)を削除したり、テクスチャを修正したりすることで、モデルの品質を向上させることができます。

まとめ

今回は、3Dモデルを自在に作成・編集するためのiDesktopXの高度な機能群をご紹介しました。単純な2Dデータからの詳細な3Dモデル作成、BIMなどの大規模データの最適化、そして3Dブール演算や3Dバッファといった高度な編集・解析まで、iDesktopXはデジタルツインの構築から維持管理、そして高度なシミュレーションまで、3D GISのライフサイクル全体をサポートする強力なツールセットを提供します。

次回は、**第20回「さらに深く!3Dデータ処理の専門技術」**です。モデル、地形、点群といった各種3Dデータの、より専門的な変換や処理機能について解説します。お楽しみに!

付録:サンプルコード(Python)

iDesktopXのPython IDEを使い、3D空間解析の基本である「3Dバッファ」を作成するサンプルコードです。ここでは、仮想的な地下鉄路線(3Dライン)の周囲に円筒状のバッファを作成します。

Python


# -*- coding: utf-8 -*-

from PySuperMap import *
from PySuperMap.Analyst import *
from PySuperMap.Data import *
from PySuperMap.Realspace import *

def create_3d_buffer_sample():
    """
    3Dラインデータセットに対して3Dバッファを作成するサンプル
    """
    try:
        # ワークスペースとデータソースを取得
        workspace = Workspace()
        datasource = workspace.get_datasource("Minato_Data_3D")
        if datasource is None:
            print("3Dデータソース 'Minato_Data_3D' が見つかりません。")
            return

        # 入力となる3Dラインデータセットを取得 (例: "Subway_Line")
        line3d_dataset = datasource.get_dataset("Subway_Line")
        if line3d_dataset is None or line3d_dataset.get_type() != DatasetType.LINE3D:
            print("3Dラインデータセット 'Subway_Line' が見つかりません。")
            return
           
        print("3Dバッファ分析を開始します...")

        # 1. 3Dバッファ分析のパラメータを設定
        buffer_param_3d = BufferAnalystParameter3D()
       
        # バッファ半径を設定 (単位はデータセットの座標系に依存)
        buffer_param_3d.set_radius(30.0) # 30メートルの円筒バッファ
       
        # バッファの端点のスタイルを設定
        buffer_param_3d.set_end_type(BufferEndType.ROUND)

        # 2. 3Dバッファ分析を実行
        # 結果はモデルデータセットとして生成される
        result_dataset_name = "Subway_Buffer_30m"
        result_dataset = GeoAnalysis.create_buffer3d(
            line3d_dataset, datasource, result_dataset_name, buffer_param_3d
        )

        if result_dataset is not None:
            print(f"3Dバッファが完了し、結果がモデルデータセット '{result_dataset_name}' として保存されました。")
           
            # 結果をアクティブなシーンに追加して可視化 (オプション)
            scene_control = workspace.get_active_scene_control()
            if scene_control is not None:
                scene = scene_control.get_scene()
                layer = scene.get_layers().add_dataset(result_dataset)
               
                # スタイルを設定して半透明にする
                style = GeoStyle3D()
                fill_symbol = FillSymbol3D()
                fill_symbol.set_fore_color(Color(0, 0, 255)) # 青色
                fill_symbol.set_alpha(0.5) # 50%透過
                style.set_fill_symbol(fill_symbol)
                layer.set_style3d(style)
               
                scene.refresh()
                print("結果をアクティブなシーンに追加しました。")
        else:
            print("3Dバッファ分析に失敗しました。")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == '__main__':
    create_3d_buffer_sample()

コメント

このブログの人気の投稿

【11月リリース予定】SuperMap iServer 2025 プレビュー:WebGIS体験を刷新する新機能とは?

「GIS」っていまだに「地理情報システム」の略?時代の変化と共に、その本当の意味を再定義してみた

「国土数値情報」を考える:それは日本のGISを支える“共通の土台”である