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 は、動的な ポイントライト と スポットライト によるリアルタイムライティングに対応しています。以下では、円形パスに沿って移動するポイントライトの例を使って、リアルタイムライティングを実装する完全な手順を説明します。

手順 1:シーンと GameObject を作成する

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 データの座標系」を参照してください。

手順 2:ライトを送信するスクリプトを書く

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

using System.Collections.Generic;
using LCCCore;
using Unity.Mathematics;
using UnityEngine;

public class Relighting : MonoBehaviour
{
    public LCCManager m_manager;
    public string m_FilePath;
    private LCCCore.Renderer m_renderer;

    [Header("ポイントライト設定")]
    public Vector3 pointLightPosition = new Vector3(0, 2, 0);
    public Color pointLightColor = Color.red;
    public float pointLightIntensity = 2.0f;
    public float pointLightRange = 3.0f;

    [Header("スポットライト設定")]
    public Vector3 spotLightPosition = new Vector3(0, 2, -2);
    public Vector3 spotLightDirection = new Vector3(0, -1, 0);
    public Color spotLightColor = new Color(0.1f, 0.9f, 0.7f);
    public float spotLightIntensity = 3.0f;
    public float spotLightRange = 20.0f;
    public float spotLightAngle = 45.0f;

    [Header("アニメーション")]
    public bool animateLights = true;
    public float rotateSpeed = 30.0f;

    private List<PointLightData> m_lights = new List<PointLightData>();
    private float m_angle;

    void Start()
    {
        m_manager.SetPlatformType(PlatformType.PC);
        m_manager.SwitchRenderPass(ActiveRenderMode.SingleRender);
        m_manager.SetMainCamera(Camera.main);

        m_renderer = m_manager.GetRender(this.transform);
        m_renderer.Load(m_FilePath, onProgress, onComplete);
    }

    private void onProgress(float _progress)
    {
        Debug.Log($"[Relighting] 読み込み進捗: {_progress:P1}");
    }

    private void onComplete()
    {
        Debug.Log("[Relighting] 読み込み完了、ライトを設定中");
        //m_manager.SetLightIntensity(0.5f);
        ApplyLights();
    }

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

        m_angle += rotateSpeed * Time.deltaTime;
        ApplyLights();
    }

    private void ApplyLights()
    {
        m_lights.Clear();

        float rad = m_angle * Mathf.Deg2Rad;
        float px = pointLightPosition.x + Mathf.Cos(rad) * 3f;
        float pz = pointLightPosition.z + Mathf.Sin(rad) * 3f;

        // lightType 0 = ポイントライト
        m_lights.Add(new PointLightData
        {
            position = new float3(px, pointLightPosition.y, pz),
            lightType = 0,
            color = new float3(pointLightColor.r, pointLightColor.g, pointLightColor.b),
            intensity = pointLightIntensity,
            direction = float3.zero,
            range = pointLightRange,
            spotAngle = 0f,
            pad = float3.zero
        });

        // lightType 1 = スポットライト
        Vector3 dir = spotLightDirection.normalized;
        m_lights.Add(new PointLightData
        {
            position = new float3(spotLightPosition.x, spotLightPosition.y, spotLightPosition.z),
            lightType = 1,
            color = new float3(spotLightColor.r, spotLightColor.g, spotLightColor.b),
            intensity = spotLightIntensity,
            direction = new float3(dir.x, dir.y, dir.z),
            range = spotLightRange,
            spotAngle = spotLightAngle,
            pad = float3.zero
        });

        int result = m_manager.SetLights(m_lights);
        if (result != 0)
            Debug.LogWarning($"[Relighting] SetLights に失敗しました: {result}");
    }

    void OnDisable()
    {
        // カスタムライティングを無効にするには null を渡す
        m_manager.SetLights(null);
    }
}

注:

  • リアルタイムライティングは LCC シーンの読み込み完了後 に送信する必要があるため、最初の ApplyLights() は onComplete コールバックで呼び出します。
  • この例では Update で毎フレームライト位置を更新し、円形パスに沿って移動するポイントライトをアニメーションさせます。
  • ライトフィールドの型は Unity.Mathematics.float3 で、using Unity.Mathematics; が必要です。color は RGB 3 成分のみで、アルファはありません。

手順 3:スクリプトをアタッチしてデータパスを設定する

  1. Relighting.cs スクリプトを Hierarchy ウィンドウの LCCManager GameObject にアタッチします。
  2. Inspector ウィンドウで LCCManager GameObject をスクリプトの Manager プロパティへドラッグします。
  3. スクリプトの File Path プロパティに LCC ファイルパスを入力します。
  4. 残りのポイントライト、スポットライト、アニメーションのプロパティは自由に設定できます。
Relighting スクリプトをアタッチしてプロパティを設定

Relighting スクリプトをアタッチして Inspector でプロパティを設定

この例では、ポイントライト 1 つとスポットライト 1 つを作成し、ポイントライトが円形パスに沿って移動してリアルタイムライティング効果を実演します。

手順 4:実行する

Game ウィンドウの Play ボタンをクリックすると、シーン内のリアルタイムライティング効果を確認できます。

実行後の 3DGS シーンのリアルタイムライティング効果

実行後の 3DGS シーンのリアルタイムライティング効果

3DGS ライティングの特性

3DGS のライティングは従来の Mesh モデルのライティングと大きく異なります。3DGS のライティング効果は RGB カラーに直接書き込まれます。つまり、ライティングがレンダリングされるカラー成分に焼き込まれます。したがって、晴れた日に非常に強いハードシャドウでキャプチャされた 3DGS モデルの場合、リライティングしても既に焼き込まれた影を除去することはできません。

さらに、レンダリング中のカラー範囲は [0, 1] です。処理せずに直接ライティングを強めると 露出オーバー が発生します。露出オーバーを防ぐには、通常は先に 3DGS シーンを暗くしてからリライティングします。

SDK では、LCCManager.SetLightIntensity(float _intensity) でライティング強度を調整できます。

  • 入力パラメータ _intensity の範囲は [0, 1] です。
  • この関数は全体的なライティング効果に影響します。設定したライト強度が強いほど、3DGS シーンは暗く押し込まれます。
  • デフォルト値は 0.5 です。

ヒント:

ライティング計算は比較的高コストな操作です。SDK は最大 50 個の動的ライト(ポイントライトとスポットライトの合計)に対応します。制限を超えると SetLights は -1 を返し、効果がありません。

重要な手順

3DGS シーンにリアルタイムライティングを追加するための重要な手順は以下のとおりです。

  1. SetPlatformType / SwitchRenderPass / SetMainCamera の事前設定を完了し、GetRender + Load で LCC シーンを読み込みます。
  2. シーンの読み込み完了後(onComplete コールバック内)に PointLightData リストを構築し、SetLights を呼び出してライトを送信します。
  3. アニメーションが必要な場合は、Update でライトパラメータを更新し、再度 SetLights を呼び出します。
  4. 露出オーバーが発生した場合は、SetLightIntensity で先にシーンを暗くしてからリライティングします。
  5. リアルタイムライティングを無効にするには、SetLights に null または空リストを渡します。

リアルタイムライティング API

LCC Unity SDK は、LCCManager を通じて以下の 2 つのリアルタイムライティング API を提供します。いずれも LCC シーンの読み込み完了後(つまり onComplete コールバック内)に呼び出す必要があります。

SetLights

// 戻り値: int → 0 = 成功、-1 = 最大数制限を超えた
public int SetLights(List<PointLightData> lights)

カスタムポイントライトリストを設定します。null または空リストを渡すとカスタムライティングが無効になります。

パラメータ型説明
lightsList<PointLightData>ライトリスト(ポイントライトとスポットライト合わせて最大 50 個)

使用例:

using Unity.Mathematics; // float3

var lights = new List<PointLightData>();
lights.Add(new PointLightData {
    position = new float3(0, 5, 0),
    lightType = 0,              // 0=ポイントライト、1=スポットライト
    color = new float3(1, 1, 1),
    intensity = 2f,
    range = 10f
});
m_manager.SetLights(lights);

注:

  • フィールドの型は Unity.Mathematics.float3 であり、Vector4 ではありません。color にはアルファ成分がありません。
  • lightType:0 = ポイントライト(direction / spotAngle は無視)、1 = スポットライト(direction / spotAngle が必要)。
  • 最大数は 50(ポイントライトとスポットライトの合計)。超えると -1 を返します。
  • null または空リストを渡すとカスタムライティングが無効になります。
  • 有効にすると、_USERLIGHT シェーダーキーワードが有効になります。
  • UnityEngine が既に LightData を定義しているため、曖昧さを避けるためにデータ構造の名前は PointLightData になっています。

SetLightIntensity

// 戻り値: void
public void SetLightIntensity(float intensity)

グローバルなライティング強度を設定します。露出オーバーを防ぐため、リライティング前に 3DGS シーンを暗くするために使用します。

パラメータ型説明
intensityfloatライティング強度。範囲 [0, 1]

使用例:

m_manager.SetLightIntensity(0.5f);

注:

  • デフォルト値は 0.5 です。
  • 範囲 [0, 1]。範囲外の値は自動でクランプされます。
  • 値が大きいほど、3DGS シーン全体が暗く押し込まれます。

PointLightData データ構造

public struct PointLightData {
    public float3 position;    // ワールド座標
    public int lightType;      // 0=ポイントライト、1=スポットライト
    public float3 color;       // RGB カラー(アルファ成分なし)
    public float intensity;    // ライト強度
    public float3 direction;   // スポットライトの方向(ポイントライトでは無視)
    public float range;        // ライトの範囲
    public float spotAngle;    // スポットライトのコーン角度(度、ポイントライトでは無視)
    public float3 pad;         // アライメントパディング。代入不要
}
フィールド型説明
positionfloat3ライトのワールド座標
lightTypeint0 = ポイントライト、1 = スポットライト
colorfloat3RGB カラー(アルファ成分なし)
intensityfloatライト強度
directionfloat3スポットライトの方向。ポイントライトでは無視
rangefloatライトの範囲
spotAnglefloatスポットライトのコーン角度(度)。ポイントライトでは無視
padfloat3アライメントパディング。代入不要