XGRIDSドキュメント
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • 简体中文
  • English
  • 繁體中文
  • 日本語
  • Deutsch
  • Español
  • Italiano
  • Français
  • Русский
  • Polski
  • Nederlands
  • Lixel PortalCam シリーズ

    • PortalCam P1

      • 製品概要
      • デバイスの基本操作
      • LCC Scan App の使用
      • メンテナンスとお手入れ
      • FAQ
  • Lixel K シリーズ

    • Lixel K1

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標のポイントクラウドデータを取得する
      • マップフュージョン
      • 典型的なシーンにおける経路計画の推奨
      • 注意事項
      • FAQ
    • Lixel K2

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標のポイントクラウドデータを取得
      • マップフュージョン
      • 典型的なシーンにおける経路計画の推奨
      • 注意事項
      • FAQ
  • Lixel L シリーズ

    • Lixel L2 Pro

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標のポイントクラウドデータを取得する
      • 実時計測機能
      • 付録
      • FAQ
    • Lixel L3

      • 製品概要
      • デバイスの基本操作
      • デバイスのアクティベーションと接続
      • デバイス収集
      • 絶対座標点群データの取得
      • 付録
  • アクセサリー

    • Stick Light

      • 取り付けガイド
      • 基本操作
      • よくある質問
  • Lixel Studio

    • バージョンと著作権
    • インストールとアクティベーション
    • ソフトウェアインターフェース
    • ファイル操作
    • プロジェクト処理
    • ツール
    • 2D 作図
    • 業界応用
    • 設定
    • デバイス接続
    • よくある質問
  • Lixel CyberColor

    • LCC Studio

      • はじめに
      • バージョンと更新
      • ダウンロードとインストール
      • インターフェース概要とナビゲーション
      • 再構築前の準備
      • モデル再構築
      • 単一モデル再構築
      • 地図合成
      • 空地融合
      • 航空撮影再構築
      • マイモデル
      • その他の機能
      • 設定とアカウント
      • Converter
      • 動画再構築
      • よくある質問 / FAQ
    • LCC Scene Editor

      • バージョンと更新情報
      • アカウントとサインイン
      • 製品概要とホーム画面
      • エディター画面
      • ナビゲーションモード
      • ファイル
      • 設定
      • 編集
      • ウィンドウ
      • グローバルツールバー
      • アセットとプロパティ
      • 左ツールバー
      • ビューポイント
      • ポータル
      • スカイボックス
      • アノテーション
      • 測定
      • フライスルー
      • シーンレポート
      • 3D レイアウト
      • ミニマップ
      • プレビューモード(Viewer)
      • ヘルプ
      • よくある質問(FAQ)
      • スポーンポイント
    • LCC Model Editor

      • バージョンと更新
      • ユーザーガイド
      • 概要とインターフェース
      • ファイル操作
      • セレクター
      • モデルの編集
      • 測定
      • カラーグレーディング
      • アセット管理
      • 設定とヘルプ
      • よくある質問
    • Capture Guide

      • 概要
      • 撮影デバイス概要
      • 一般的な撮影の原則
      • 屋内シーンの撮影
      • 屋外シーンの撮影
      • 大規模撮影(マップフュージョン)
      • 空地マップフュージョン撮影
      • オブジェクト撮影
      • 人物撮影
      • ビデオ再構築撮影
      • HD Enhancement
      • 制御点(Lixel P1)
      • FAQ とトラブルシューティング
    • LCC Studio Linux

      • 製品概要説明
      • 基本アーキテクチャマニュアル
      • インストールと展開説明書
      • コンテナ起動パラメータ説明書
      • CodeMeter オフラインライセンス展開説明書
      • APIコマンドセット
      • 付録-開発者データマニュアル
      • 付録-エラーコード一覧
      • シングルノードマルチGPUクラスタ展開QuickStart
    • 活用テクニック

      • 複数の大規模 3DGS モデルの統合ワークフロー
    • バージョン履歴
  • プラグインと SDK

    • Unreal

      • 概要
      • クイックスタート - Windows
      • クイックスタート - Linux
      • クイックスタート - Quest3
      • エディションとライセンス
      • レンダリング
      • Tiled ラスタライズ(実験的機能)
      • 画面調節
      • 法線とライティング
      • シーン編集
      • パフォーマンスパラメーター
      • パフォーマンス最適化ガイド
      • サードパーティおよびエンジンプラグインとの連携
      • プロキシメッシュ
      • 読み込みアニメーション
      • コリジョン
      • ナビゲーションシステム対応
      • Single layer water 対応
      • ローカライズ
      • よくある質問
      • トラブルシューティング
      • ログと診断
      • お問い合わせ
      • ベストプラクティス

        • LixelStudio メッシュで 3DGS をリライティングする
      • API リファレンス

        • ALCCActorBase
        • ULCCComponentBase
        • ULCCComponent
        • ULCC2Component
        • SOG / SPZ / PLY Actors
        • ALCC2ProxyMesh
        • ALCCClippingVolume
        • ALCCSectionPlane
        • ALCCLoadVolume
        • ULCCUtilLibrary
        • Enums
        • Structs
      • 更新履歴

        • v3.4.0
        • v3.3.1
        • v3.0.0
        • v2.2.1
        • v1.0.0
        • v0.9.0
        • v0.8.0
        • v0.7.1
        • v0.6.1
        • v0.5.2
        • v0.4.1
        • v0.4.0
        • v0.3.0
        • v0.0.5
        • v0.0.4
        • v0.0.3
        • v0.0.2
        • v0.0.1
    • Unity

      • Unity SDK の概要
      • 技術的特徴
      • 開発環境の要件
      • PC クイックスタートガイド
      • プロジェクト設定の最適化ガイド
      • Pico 4 Ultra 開発ガイド
      • Pico 4 Ultra PC ストリーミングガイド
      • Quest 3 開発ガイド
      • Quest 3 PC ストリーミングガイド
      • OpenXR 開発ガイド
      • Pico 4 Ultra Business Streaming ガイド
      • 用語集
      • FAQ
      • お問い合わせ
      • 機能開発ガイド

        • 複数シーン混合レンダリング開発ガイド
        • 影の受光開発ガイド
        • リアルタイムライティング開発ガイド
        • マルチカメラレンダリング開発ガイド
        • 高解像度画像レンダリング開発ガイド
        • LCC / LCC2 データ形式互換性開発ガイド
        • 読み込みエフェクト開発ガイド
        • Mip レンダリングモード切り替え開発ガイド
        • エッジ・コーナースナップ開発ガイド
        • 投影デカール開発ガイド
        • ビデオ投影デカール開発ガイド
        • ハイライト開発ガイド
        • リアルタイムクリッピング開発ガイド
        • カラー調整開発ガイド
        • シーン Mesh データ取得開発ガイド
        • エディターモード開発ガイド
        • レンダリングパフォーマンスパラメータ設定ガイド
        • アプリケーションとデータの同梱パッケージ開発ガイド
        • コリジョンシステム開発ガイド
        • macOS 開発の権限問題ガイド
        • iOS デバイスのコンパイル・パッケージ化開発ガイド
      • API リファレンス

        • LCCManager
        • Renderer
        • データ型
      • 変更履歴

        • v2.3.0
        • v2.2.10
        • v2.2.0
        • v2.1.19
        • v2.0.14
    • Web

      • はじめに
      • レンダリング性能最適化ガイド
      • グラフィックス設定
      • よくある質問
      • API リファレンス

        • LCCRender::clearIndexDB
        • LCCRender::dispose
        • LCCRender::load
        • LCCRender::setCamera
        • LCCRender::unload
        • LCCRender::update
        • LCCObject::checkRenderNextFrame
        • LCCObject::clearRenderNextFrame
        • LCCObject::ecef2Prj
        • LCCObject::getBounds
        • LCCObject::getEnvInstancedMesh
        • LCCObject::getInstancedMesh
        • LCCObject::getLodInfos
        • LCCObject::getOriginPosition
        • LCCObject::getProjectionCoordinateSystemInfos
        • LCCObject::hasCollision
        • LCCObject::hasEnvironment
        • LCCObject::hasShcoef
        • LCCObject::intersectsCapsule
        • LCCObject::intersectsRayExt
        • LCCObject::intersectsRayFromOriginExt
        • LCCObject::intersectsSphere
        • LCCObject::lowerToBottom
        • LCCObject::prj2Ecef
        • LCCObject::raiseToTop
        • LCCObject::raycast
        • LCCObject::raycastFromOrigin
        • LCCObject::setAlpha
        • LCCObject::setClipBox
        • LCCObject::setClipPlane
        • LCCObject::setEndLod
        • LCCObject::setLodAutoLevelUp
        • LCCObject::setMaxDistance
        • LCCObject::setMaxNodeSplats
        • LCCObject::setMaxSplats
        • LCCObject::setOriginPosition
        • LCCObject::setPointsColor
        • LCCObject::setRenderState
        • LCCObject::setRotation
        • LCCObject::setScale
        • LCCObject::setSemantic
        • LCCObject::setSemanticColor
        • LCCObject::setSmooth
        • LCCObject::setStartLod
        • LCCObject::setTranslation
        • LCCObject::setVisible
        • LCCObject::togglePointsDisplayMode
        • LCCObject::useEnvironment
        • LCCObject::useShcoef
      • 更新履歴

        • v0.6.3
        • v0.6.2
        • v0.6.1
        • v0.6.0
        • v0.5.5
        • v0.5.4
        • v0.5.3
        • v0.5.2
        • v0.5.1
        • v0.5.0
        • v0.4.1
        • v0.4.0
        • v0.3.1
        • v0.3.0
        • v0.2.0

シーン Mesh データ取得開発ガイド

LCC データを再構築する際、LCC Unity SDK はコリジョンに使用する Mesh データも生成します。コリジョン検出に加えて、SDK はこの Mesh データを 抽出 して Unity の Mesh オブジェクトに変換し、可視化する機能を提供しており、エクスポートや NavMesh のベイクなどのシナリオに便利です。

以下では、全 Mesh データの同期取得と、指定範囲の Mesh データをオンデマンドで取得する手順を完全な例で説明します。

環境の準備

Unity で新しいシーンを作成します。Unity はデフォルトで Main Camera と Directional Light を作成します。

Main Camera をセットアップする

Hierarchy ウィンドウで Main Camera を選択し、Inspector ウィンドウでそのプロパティを以下のとおり設定します。

Main Camera のプロパティを設定

Main Camera のプロパティを設定

LCCManager を作成する

Hierarchy ウィンドウの空の領域を右クリックし、ポップアップメニューから Create Empty を選択して空の GameObject を作成し、LCCManager と名前を付け、その Transform を正規化し、Add Component で LCCManager スクリプトを追加します。

LCCManager GameObject を作成し LCCManager スクリプトを追加

LCCManager GameObject を作成し LCCManager スクリプトを追加

LCCRenderer を作成する

Hierarchy ウィンドウの空の領域を右クリックし、Create Empty を選択して空の GameObject を作成し、LCCRenderer と名前を付け、その Transform を Rotation.x = -90、Scale.x = -1 に設定します。

LCCRenderer を作成し Transform を設定

LCCRenderer を作成し Transform(Rotation.x = -90、Scale.x = -1)を設定

注:

LCCRenderer GameObject の Transform 設定(Rotation.x = -90、Scale.x = -1)は、LCC データ座標系にアライメントするためのものです。座標系アライメントの詳細は Unity SDK の概要 の「LCC データの座標系」を参照してください。

データの前提条件

Mesh データ取得が有効になる前提条件は、シーンが対応するコリジョン Mesh データを保持していること(LCC Studio で再構築する際に生成されます)です。また、この機能には以下の制約があります。

  • PC / Mac のみ、かつ ローカルデータソースのみ 対応(HTTP データソースは非対応)。
  • メインスレッドでのみ呼び出せます。
  • ネイティブ形式データ(PLY / SOG / SPZ / splat / ksplat)はコリジョン Mesh データを保持しません。関連メソッドを呼び出すと null が返ります。

以前のバージョンで再構築されたデータにはコリジョンデータが含まれない場合があり、その場合は GetMeshes() を呼び出すと null が返ります。

全 Mesh データの同期取得

全 Mesh データの同期取得とは、シーン内の すべての コリジョン Mesh ブロックのジオメトリデータを一度に読み取ることで、Renderer.GetMeshes() メソッドで実現します。

Meshes.cs という名前の新しい C# スクリプトを以下のコードで作成します。

using System.Collections.Generic;
using LCCCore;
using UnityEngine;
using UnityEngine.Rendering;

public class Meshes : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    private LCCCore.Renderer m_renderer;
    private bool m_isLoaded = false;
    private Camera m_camera;

    private const string kContainerName = "LCCVisualizedMeshes";

    void Start()
    {
        m_camera = Camera.main;
        m_isLoaded = false;
        m_manager.SetPlatformType(PlatformType.PC);

        m_renderer = m_manager.GetRender(this.transform);
        m_renderer.Load(m_FilePath,
            p => Debug.Log($"[Meshes] 読み込み進捗: {p:P1}"),
            () =>
            {
                Debug.Log($"[Meshes] ファイルを読み込みました: {m_FilePath}");
                m_isLoaded = true;
                m_manager.SetAutoFov(false);
            },
            e => Debug.LogError($"[Meshes] ファイル読み込みエラー: {e}")
        );
    }

    public void onGetAllMeshes()
    {
        if (!m_isLoaded || m_renderer == null)
        {
            Debug.LogWarning("[Meshes] データの読み込みが完了していないため、Mesh を取得できません。");
            return;
        }

        var meshes = m_renderer.GetMeshes();
        if (meshes == null || meshes.Count == 0)
        {
            Debug.LogWarning("[Meshes] Mesh を取得できませんでした(データにコライダーが含まれていない可能性があります)。");
            return;
        }

        VisualizeMeshes(meshes);
    }

    private void VisualizeMeshes(List<LCCMeshBlock> meshes)
    {
        // 以前の可視化結果をクリーンアップして蓄積を防ぐ
        Transform root = m_renderer.Transform;
        Transform old = root.Find(kContainerName);
        if (old != null) Destroy(old.gameObject);

        var container = new GameObject(kContainerName).transform;
        container.SetParent(root, false);

        Material material = CreateVisualMaterial();

        for (int i = 0; i < meshes.Count; i++)
        {
            LCCMeshBlock block = meshes[i];
            if (block.vertices == null || block.vertices.Length == 0) continue;
            if (block.triangles == null || block.triangles.Length < 3) continue;

            var go = new GameObject(string.IsNullOrEmpty(block.id) ? $"MeshBlock_{i}" : block.id);
            go.transform.SetParent(container, false);

            var mesh = new Mesh { name = go.name };
            // 1 ブロックの頂点数は 65535 を超える可能性があるため、32 ビットインデックスを使用する必要がある。さもないとジオメトリが壊れる
            mesh.indexFormat = IndexFormat.UInt32;
            mesh.vertices = block.vertices;
            mesh.triangles = block.triangles;
            mesh.RecalculateNormals();
            mesh.RecalculateBounds();

            var mf = go.AddComponent<MeshFilter>();
            mf.sharedMesh = mesh;

            var mr = go.AddComponent<MeshRenderer>();
            mr.sharedMaterial = material;
        }

        Debug.Log($"[Meshes] GameObject を作成し、{meshes.Count} 個の Mesh ブロックを可視化しました。");
    }

    private Material CreateVisualMaterial()
    {
        Shader shader = Shader.Find("Universal Render Pipeline/Lit")
            ?? Shader.Find("Standard")
            ?? Shader.Find("Diffuse");
        if (shader == null) return null;

        var mat = new Material(shader) { color = new Color(0.7f, 0.7f, 0.7f, 1f) };
        // コリジョンメッシュの三角形の巻き順は一貫しているとは限らない。完全表示のため背面カリングを無効化
        mat.SetFloat("_Cull", (float)CullMode.Off);
        return mat;
    }
}

注:

  • GetMeshes() は 同期的な重い操作 です。ディスクからの読み取り、解析、メモリ割り当てを同期的に行います。大規模シーン(例:262 ブロックのデータセット)では、大量のディスクデータを読み取り、数 GB から数十 GB のマネージメモリを割り当てる必要がある場合があります。一度呼び出して結果を自分でキャッシュしてください。毎フレーム呼び出さないでください。
  • vertices / boundsLocal は オブジェクトローカル座標系 なので、可視化 GameObject を Renderer.Transform の下にアタッチすると自動的にアライメントされます。
  • 1 ブロックの頂点数は 65535 を超える場合があります(実測最大 390,656)。独自の Mesh を構築する前に mesh.indexFormat = IndexFormat.UInt32 を設定する必要があります。さもないとジオメトリが壊れます。
  • コリジョンメッシュの三角形の巻き順は一貫しているとは限りません。この例では完全表示のため背面カリングを無効化しています(_Cull = Off)。

スクリプトを LCCRenderer GameObject にアタッチし、Inspector で LCCManager GameObject を Manager プロパティへドラッグし、File Path を入力します。

次に Button を作成し、onGetAllMeshes() メソッドをその onClick イベントに関連付けます。

実行後、Button をクリックするとシーン内のすべてのコリジョン Mesh を確認できます。

全 Mesh データを同期取得して可視化

ボタンをクリックすると全コリジョン Mesh データを可視化

Mesh データのオンデマンド取得

オンデマンド取得とは、全 Mesh データを一度に読み取るのではなく、指定した部分の Mesh データのみを読み取ることで、大きな I/O とメモリオーバーヘッドを回避します。以下では、カメラ周辺の一定範囲内の Mesh ブロックを読み取る例を説明します。

まず GetMeshBlockInfos() で全ブロックのメタデータ(ワールド空間のバウンディングボックスを含む)を取得し、ワールド座標で レンダリングカメラ中心からブロック BBOX 表面までの距離 を計算し、距離が 100 m 未満のブロック ID をフィルタリングし、その後パラメータ付きの GetMeshes(ids) でそれらのブロックのみを読み取ります。

Meshes.cs に以下のメソッドを追加します。

public void onRequireMeshes()
{
    if (!m_isLoaded || m_renderer == null)
    {
        Debug.LogWarning("[Meshes] データの読み込みが完了していないため、Mesh を取得できません。");
        return;
    }

    // 1. 全ブロックメタデータのゼロ I/O 読み出し。カメラから BBOX 表面までの距離で 100 m 以内のブロックをフィルタ
    var infos = m_renderer.GetMeshBlockInfos();
    if (infos == null || infos.Count == 0)
    {
        Debug.LogWarning("[Meshes] Mesh 情報を取得できませんでした(データにコライダーが含まれていない可能性があります)。");
        return;
    }

    Vector3 camPos = m_camera.transform.position;
    var ids = new List<string>();
    foreach (var info in infos)
    {
        // カメラが BBOX 内にある場合、ClosestPoint はカメラ自身を返し距離は 0 になるため、それも選択される
        if (calculateMinDistanceToAABB(info.boundsWorld, camPos) < 100f)
            ids.Add(info.id);
    }

    if (ids.Count == 0)
    {
        Debug.LogWarning("[Meshes] カメラから 100 m 以内に Mesh ブロックがありません。");
        return;
    }

    // 2. フィルタされたブロックのみを ID で読み込み、可視化
    var meshes = m_renderer.GetMeshes(ids);
    if (meshes == null || meshes.Count == 0)
    {
        Debug.LogWarning("[Meshes] ID による Mesh の取得に失敗しました。");
        return;
    }

    VisualizeMeshes(meshes);
    Debug.Log($"[Meshes] カメラから 100 m 以内の {ids.Count} 個のブロックを選択し、{meshes.Count} 個を可視化しました。");
}

// 点から AABB 表面までの最短距離を計算(点が AABB 内の場合は 0 を返す)
private static float calculateMinDistanceToAABB(Bounds _aabb, Vector3 _point)
{
    Vector3 p = _aabb.ClosestPoint(_point);
    return Vector3.Distance(p, _point);
}

注:

  • GetMeshBlockInfos() は ゼロ I/O・ゼロ解析 の操作で、メモリ上に既にあるメタデータのみを読み取ります。自由に呼び出せます。
  • 距離フィルタは boundsWorld(ワールド空間のバウンディングボックス)を使用し、カメラ中心は Camera.transform.position を取ります。
  • Bounds.ClosestPoint で点から AABB 表面までの最短距離を計算します。カメラが BBOX 内にある場合、ClosestPoint はカメラ自身を返し距離は 0 になるため、そのブロックも選択されます。
  • 例のフィルタ半径 100f(単位:メートル)は必要に応じて調整できます。

Button を作成し、onRequireMeshes() をその onClick イベントに関連付けます。

実行後、ボタンをクリックするとカメラから 100 m 以内の Mesh ブロックを確認できます。

カメラから 100 m 以内の Mesh データをオンデマンドで取得して可視化

カメラから 100 m 以内の Mesh データをオンデマンドで取得

重要な手順

シーン Mesh データを取得して可視化するための重要な手順は以下のとおりです。

  1. SetPlatformType などの事前設定を完了し、GetRender + Load で LCC シーンを読み込みます。
  2. データがコリジョン Mesh データを保持していることを確認します(ネイティブ形式や以前のバージョンで再構築されたデータにはない場合があります)。
  3. 全量取得:GetMeshes() で全ブロックを一度に読み取り、繰り返し呼び出しを避けるため結果を自分でキャッシュします。
  4. オンデマンド取得:まず GetMeshBlockInfos() でブロックのワールドバウンディングボックスを取得し、カメラ距離で ID をフィルタし、GetMeshes(ids) で対象ブロックのみを読み取ります。
  5. 可視化時は、ローカル座標にアライメントするため GameObject を Renderer.Transform の下にアタッチし、IndexFormat.UInt32 で Mesh を構築します。

Mesh 取得 API

以下のメソッドはすべて Renderer にあり、シーン読み込み完了後 に呼び出す必要があり、データがコリジョン Mesh データを保持している必要があります。

GetMeshBlockInfos

// 戻り値: List<LCCMeshBlockInfo> → コリジョン Mesh ブロックのメタデータ。Mesh がないか取得不可の場合は null
public List<LCCMeshBlockInfo> GetMeshBlockInfos()

全コリジョン Mesh ブロックのメタデータ(ID、ワールド/ローカルバウンディングボックス、頂点数、面数)を返します。ゼロ I/O・ゼロ解析で、メモリ上に既にあるメタデータのみを読み取ります。

使用例:

var infos = renderer.GetMeshBlockInfos();
foreach (var info in infos)
{
    Debug.Log($"{info.id}: verts={info.vertexCount}, faces={info.faceCount}, bbox={info.boundsWorld.size}");
}

注:

  • PC / Mac のみ + ローカルデータソース。メインスレッドのみ。
  • 典型的な使い方:まず各ブロックのワールド BBox を取得し、必要な ID を選び、GetMeshes(ids) でそれらのブロックのみを読み取ります。
  • ネイティブ形式(PLY / SOG / SPZ / splat / ksplat)には Mesh がなく、null を返します(正常であり、ログは出力されません)。

GetMeshes

// 戻り値: List<LCCMeshBlock> → 全コリジョン Mesh ジオメトリデータ。取得不可の場合は null
public List<LCCMeshBlock> GetMeshes()

全コリジョン Mesh ブロックのジオメトリデータ(頂点 + 三角形インデックス、ローカル座標系)を同期的に返します。これは重い操作(同期ディスク読み取り + 解析 + 割り当て)なので、一度呼び出して自分でキャッシュし、毎フレーム呼び出さないでください。

使用例:

var meshes = renderer.GetMeshes();
foreach (var block in meshes)
{
    // block.vertices / block.triangles はオブジェクトローカル座標系
}

注:

  • PC / Mac のみ + ローカルデータソース。メインスレッドのみ。
  • 大規模シーンでは、一度に大量のマネージメモリを割り当てるのを避けるため、GetMeshBlockInfos() で ID を選び + GetMeshes(ids) を使用します。
  • 1 ブロックの頂点数は 65535 を超える場合があります。独自の Mesh を構築する前に mesh.indexFormat = IndexFormat.UInt32 を設定する必要があります。

GetMeshes(ID 指定)

// 戻り値: List<LCCMeshBlock> → 指定 ID のコリジョン Mesh ジオメトリデータ。ヒットがない場合は null
public List<LCCMeshBlock> GetMeshes(IEnumerable<string> _ids)

指定した ID のコリジョン Mesh ブロックのジオメトリデータ(ローカル座標系)を同期的に返します。ID は GetMeshBlockInfos() が提供します。

パラメータ型説明
_idsIEnumerable<string>対象ブロック ID コレクション(GetMeshBlockInfos() が提供)

使用例:

var ids = new List<string> { "block-0", "block-3" };
var meshes = renderer.GetMeshes(ids);

注:

  • 不明な ID は警告付きでスキップされます。重複 ID は重複排除されます(ディスクから繰り返し読み取りません)。戻り順は ID の走査順(重複排除後)です。
  • null、空入力、ヒットなしの場合は警告付きで null を返します。
  • その他の制約は GetMeshes() と同じです。

LCCMeshBlockInfo データ構造

public struct LCCMeshBlockInfo {
    public string id;           // ノード ID。LCCMeshBlock.id に対応
    public Bounds boundsWorld;  // ワールド空間 AABB。ID の選択に使用
    public Bounds boundsLocal;  // ローカル空間 AABB
    public int vertexCount;     // 頂点数
    public int faceCount;       // 面数
}
フィールド型説明
idstringノード ID。LCCMeshBlock.id に対応
boundsWorldBoundsワールド空間 AABB。ID の選択に使用
boundsLocalBoundsローカル空間 AABB
vertexCountint頂点数
faceCountint面数

LCCMeshBlock データ構造

public struct LCCMeshBlock {
    public string id;           // ノード ID
    public Vector3[] vertices;  // 頂点。ローカル座標系
    public int[] triangles;     // 三角形インデックス。1 三角形あたり 3 個
    public Bounds boundsLocal;  // 頂点と同じ空間のバウンディングボックス
}
フィールド型説明
idstringノード ID
verticesVector3[]頂点配列。オブジェクトローカル座標系
trianglesint[]三角形インデックス。1 三角形あたり 3 個
boundsLocalBounds頂点と同じ空間のバウンディングボックス

注:

vertices / boundsLocal はどちらも オブジェクトローカル座標系 です。Unity で可視化するには、Mesh を保持する GameObject を Renderer.Transform の下にアタッチして自動的にアライメントします。1 ブロックの頂点数は 65535 を超える場合があります。独自の Mesh を構築する前に mesh.indexFormat = IndexFormat.UInt32 を設定する必要があります。