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

コリジョンシステム開発ガイド

LCC Unity SDK はコリジョンシステムを内蔵しており、コライダー構築とコリジョン検出の高速化、つまりコリジョン性能問題の解決に重点を置いています。Unity の Collider システムは、超大規模シーンでのリアルタイム検出を処理できません。

LCC Unity SDK は自前のコリジョンシステムを使用し、Unity の MeshCollider コンポーネントや関連機能に依存しなくなったため、Unity シーン内の GameObject に直接作用させることはできません。XGrids(LCC Studio)が生成する公式 LCC データ形式は、再構築時にコリジョンに使用する Mesh データを同時に生成し、SDK はこのコリジョンデータを使ってシーンコリジョンを高速かつ効率的に構築します。自前のコリジョンシステムであるため、コリジョン機能を使用するには SDK が提供する対応メソッドを呼び出す必要があります。

注:

SDK 内蔵のコリジョンシステムは Unity の Collider システムと非互換で、Unity 内の Rigidbody オブジェクトに直接作用させることはできません。デジタルヒューマンなどのキャラクターのコリジョンは、SDK の検出メソッドで駆動する必要があります(下記「デジタルヒューマンのコリジョン実装」を参照)。

固定シーンでは、Mesh データを抽出して事前に NavMesh にベイクすることで、Unity の Collider システムと互換にすることもできます。詳細は NavMesh ガイドを参照してください。

データの前提条件

コリジョン検出が機能する前提条件は、シーンに対応するコリジョンデータがあることです。以前のバージョンで再構築されたデータにはコリジョンデータが含まれない場合があり、その場合は SetColliderEnable(true) を呼び出すと false が返り、以降のすべての検出メソッドが利用できません。

したがって、コリジョンを有効化した後は必ず戻り値を確認してください。

bool ok = renderer.SetColliderEnable(true);
if (!ok)
{
    Debug.LogWarning("現在のデータにはコライダーが含まれていないため、コリジョン検出を有効化できません");
}

基本的な使用手順

コリジョン機能の基本手順は 3 ステップです。

  1. Load() メソッドでシーンデータを読み込みます。
  2. 読み込み完了コールバックで SetColliderEnable(true) によりコリジョンを有効化します。
  3. 各種検出メソッド(RaycastMesh / IntersectsSphere / IntersectsCapsule)でコリジョン検出を実行します。
// 1. シーンを読み込む
renderer.Load(dataPath, onProgress: null, onComplete: () =>
{
    // 2. 読み込み完了後にコリジョンを有効化
    if (renderer.SetColliderEnable(true))
    {
        colliderReady = true;
    }
});

void Update()
{
    if (!colliderReady) return;

    // 3. 毎フレームコリジョン検出を実行
    var capsule = new Capsule(footPos, headPos, 0.3f);
    if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
    {
        characterController.Move(delta);
    }
}

注:

SetColliderEnable() は Renderer のメソッドで、検出メソッド(RaycastMesh / IntersectsSphere / IntersectsCapsule / Raycast)は LCCManager にあります。それぞれ対応するオブジェクトで呼び出してください。

コリジョンシステムの基本手順:シーン読み込み → コリジョン有効化 → コリジョン検出

コリジョンシステムの基本手順

デジタルヒューマンのコリジョン実装

SDK のコリジョンシステムは Unity の Rigidbody に作用しないため、デジタルヒューマン(キャラクター)のコリジョンは検出メソッドで駆動する必要があります。一般的な方法は 3 つあります。

  • デュアルレイ検出:RaycastMesh() で下向きと前向きの 2 本のレイを発射し、レイの戻り結果に基づいてキャラクターが歩行可能か判断します(地面を下向きにプローブ、障害物を前向きにプローブ)。
  • カプセル検出:IntersectsCapsule() でデジタルヒューマンがいるカプセルがコリジョンメッシュと交差するか検出し、歩行可能か判断します。オーバーロード版の _delta は次の安全到達点のオフセットを返します。
  • 球体検出:IntersectsSphere() でデジタルヒューマンがいる球がコリジョンメッシュと交差するか検出し、歩行可能か判断します。オーバーロード版の _delta も安全到達点のオフセットを返します。
デジタルヒューマンコリジョンの 3 つの実装方法:デュアルレイ、カプセル、球体検出

デジタルヒューマンコリジョンの 3 つの実装方法

RaycastMesh と Raycast の使い分け

SDK は用途の異なる 2 種類のレイ検出メソッドを提供しています。

メソッド検出対象精度速度適用シナリオ
RaycastMesh()コリジョンメッシュ(Collider データ)比較的低い高速デジタルヒューマンコリジョン、毎フレーム検出
Raycast()ガウスプリミティブ(コリジョンメッシュに依存しない)比較的高い低速計測系アプリケーション

Raycast() はガウスプリミティブに対して直接レイ検出を行い、精度は高いですが速度が遅く、毎フレーム呼び出しには推奨されません。そのためデジタルヒューマンコリジョンには不向きで、計測系用途のみに適しています。デジタルヒューマンコリジョンには、コリジョンメッシュに依存する RaycastMesh() を優先してください。

関連 API

以下のコリジョン関連メソッドのうち、SetColliderEnable() は Renderer にあり、残りの検出メソッドは LCCManager にあります。すべての検出メソッドは、シーンの読み込み完了後 かつ SetColliderEnable(true) が正常に呼び出された後でのみ利用できます。

SetColliderEnable

// 戻り値: bool → true=正常に設定、false=データにコライダーがないかインスタンスが非アクティブ
public bool SetColliderEnable(bool _enable)

コライダー機能を切り替えます。有効化後、IntersectsSphere / IntersectsCapsule / RaycastMesh が利用可能になります。

パラメータ型説明
_enableboolコライダーを有効にするかどうか

使用例:

bool ok = renderer.SetColliderEnable(true);
if (!ok) Debug.LogWarning("データにコライダーが含まれていません");

説明:

  • データにコリジョン(Mesh)データが含まれている必要があります。含まれていない場合は false を返します。
  • Renderer がアクティブ状態である必要があります。

RaycastMesh(スクリーン座標)

// 戻り値: bool → true=ヒット
public bool RaycastMesh(Vector3 mousePos, out HitResult _finalResult, float _disatnce = 70.0f)

スクリーン座標からレイを発射してコリジョンメッシュを検出します。Collider データで検出するため、Raycast より高速ですが精度は低くなります。

パラメータ型説明
mousePosVector3スクリーン座標
_finalResultout HitResultヒット結果
_disatncefloat最大検出距離。デフォルト 70.0

使用例:

if (m_manager.RaycastMesh(Input.mousePosition, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

説明:

  • 先にコリジョンを正常に有効化する必要があります。
  • 先に SetColliderEnable(true) を呼び出す必要があります。

RaycastMesh(Ray + Bounds)

// 戻り値: bool → true=ヒット
public bool RaycastMesh(Ray ray, out HitResult result, out Bounds hitBounds, float maxDist = 70.0f)

カスタムの Ray でコリジョンメッシュ検出を行い、ヒットしたノードのバウンディングボックス情報も返します。

パラメータ型説明
rayRayレイ
resultout HitResultヒット結果
hitBoundsout Boundsヒットしたノードのバウンディングボックス(ヒットした LOD ノードのバウンディングボックス)
maxDistfloat最大検出距離。デフォルト 70.0

使用例:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (m_manager.RaycastMesh(ray, out HitResult hit, out Bounds bounds))
{
    Debug.Log(bounds.center);
}

説明:

  • 先にコリジョンを正常に有効化する必要があります。
  • このメソッドは、デジタルヒューマンが歩行可能か判断するデュアルレイ検出(下向き、前向き)によく使用されます。

IntersectsSphere

// 戻り値: bool → true=交差
public bool IntersectsSphere(Sphere sphere)

// 戻り値: bool → true=交差
public bool IntersectsSphere(Sphere sphere, out Vector3 delta)

球がコリジョンメッシュと交差するか検出します。2 つ目のオーバーロードは貫通ベクトル delta(押し出し方向と距離)も返し、次の安全到達点の計算に使用できます。

パラメータ型説明
sphereSphere検出する球
deltaout Vector3貫通ベクトル(押し出し方向と距離)

使用例:

var sphere = new Sphere(transform.position, 0.5f);
if (m_manager.IntersectsSphere(sphere, out Vector3 delta))
{
    transform.position += delta;
}

説明:

  • 先にコリジョンを正常に有効化する必要があります。
  • 先に SetColliderEnable(true) を呼び出す必要があります。
  • すべてのアクティブな Renderer を走査します。

IntersectsCapsule

// 戻り値: bool → true=交差
public bool IntersectsCapsule(Capsule capsule)

// 戻り値: bool → true=交差
public bool IntersectsCapsule(Capsule capsule, out Vector3 delta)

カプセルがコリジョンメッシュと交差するか検出します。キャラクターコントローラーのコリジョン検出によく使用されます。2 つ目のオーバーロードは貫通ベクトル delta を返し、デジタルヒューマンの次の安全到達点へのオフセットとして使用できます。

パラメータ型説明
capsuleCapsule検出するカプセル
deltaout Vector3貫通ベクトル

使用例:

var capsule = new Capsule(footPos, headPos, 0.3f);
if (m_manager.IntersectsCapsule(capsule, out Vector3 delta))
{
    characterController.Move(delta);
}

説明:

  • データにコリジョンノードが含まれている必要があります。
  • 先に SetColliderEnable(true) を呼び出す必要があります。
  • 一人称 / 三人称キャラクターのコリジョンに適しています。

Raycast

// 戻り値: bool → true=ヒット
public bool Raycast(Ray _ray, out HitResult _finalResult)

カスタムの Ray でガウスプリミティブに対するレイ検出を行い、すべてのアクティブな Renderer を走査して最も近いヒットを返します。コリジョンメッシュに依存せず、精度は高いですが速度が遅くなります。

パラメータ型説明
_rayRayレイ
_finalResultout HitResultヒット結果

使用例:

Ray ray = new Ray(origin, direction);
if (m_manager.Raycast(ray, out HitResult hit))
{
    Debug.Log(hit.hitPos);
}

説明:

  • コリジョンメッシュに依存せず、SetColliderEnable は不要です。
  • 精度は高いですが速度が遅く、毎フレーム呼び出しには推奨されません。計測系アプリケーションに適しており、デジタルヒューマンコリジョンには適していません。

HitResult

上記の検出メソッドのヒット結果は HitResult 構造体で返されます。

public struct HitResult {
    public bool isHit;             // ヒットしたかどうか
    public float distance;         // 距離
    public Vector3 hitPos;         // ヒット点のワールド座標(フィールド名は position ではなく hitPos)
    public Vector3 normal;         // ヒット法線
    public float hitAlpha;         // ヒットした楕円体のアルファ
    public float dist2Origin;      // レイ原点までの距離
    public float scale;            // 楕円体のスケール
}

注:

ヒット点ワールド座標のフィールド名は hitPos(position ではありません)。実際のフィールド名でアクセスしてください。