Skip to content

Project-PLATEAU/PLATEAU-Toolkits-Sample-UrbanScape

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

85 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Urban Scape

PLATEAU-SDK-Toolkits-for-Unityを使ったサンプルプロジェクト

urbanscape_kv

更新履歴

更新日時 更新内容
2024/4/5 UrbanScape チュートリアル公開
2023/12/25 UrbanScape 初回リリース

目次

1. サンプルプロジェクトの概要

1-1. サンプルプロジェクトで体験できること

  • 本サンプルプロジェクトを使うことで、都市の景観を綺麗に見せられるようなビューアーアプリを作ることが可能です。
  • 都市でのPV作成などのユースケースを想定したサンプルプロジェクトです。

※このサンプルプロジェクトの主要機能の実装例をチュートリアルで紹介しています。実装方法については、こちらのチュートリアルをご参照ください。

1-2. Unityプロジェクト情報

Unity バージョン

  • Unity 2021.3.30f1

レンダリングパイプライン

  • HDRP (HighDefinition Rendering Pipeline)
  • URP (Universal Rendering Pipeline)

Built-in Rendering Pipelineでは動作しません。

1-3. 利用している PLATEAU SDK-Toolkits の機能

Rendering Toolkit (PLATEAU SDK-Toolkits)

  • 天候の変更
  • 時間変更
  • ポストエフェクト

Sandbox Toolkit (PLATEAU SDK-Toolkits)

  • 人の配置
  • 車の配置
  • プロップの配置

PLATEAU SDK-Maps-Toolkit

  • Cesium for Unity を使ったPLATEAUモデルの位置合わせ

2. 利用手順

2-1. 推奨環境

参考開発環境

以下は本プロジェクトで使用した開発環境です。

  • Windows 11
  • macOS Ventura 13.2

2-2. サンプルプロジェクトのビルド方法

  1. "Assets/Scenes/UrbanScape" を開きます。

multiplay_sample_scene

  1. 最初にHDRPに関してのウィザードが表示されることがありますが、閉じてください。

multiplay_sample_hdrpwizard

  1. メニューより "File" > "Build Settings" を選択します。

simulation_sample_scene

  1. 画面下部にある「Build」ボタンを押下します。出力先を選択してビルドを開始します。

2-3. ビルドしたアプリケーションの操作方法

  1. ビルドしたアプリケーションを開くと、オープニング画面が表示されます。
    「始めましょう」ボタンを押下してください。

simulation_sample_title

  1. ホームビューに遷移します。このビューではマウス操作によってカメラを回転させることができます。
    simulation_sample_firstview

simulation_sample_rotated



  1. 画面右の時間帯変更スライダーを調整すると、シーンの時間帯を変更することができます。
    simulation_sample_mornig

simulation_sample_night

  1. 天候ボタンを押下すると、各天候を調整するためのスライダーが表示されます。スライダーを動かすことで天候の変化が可能です。
    simulation_sample_weatherui
    simulation_sample_rain
    simulation_sample_snow

simulation_sample_cloudy

  1. 固定カメラ1ボタンを押下すると、人や車の通行が確認できる定点カメラビューに遷移します。

simulation_sample_fixedcam

  1. 固定カメラ2ボタンを押下すると、俯瞰視点の定点カメラビューに遷移します。このカメラには「トイカメラ」のポストエフェクトが適用されています。

simulation_sample_toycamera

  1. ホームボタンを押すと、ホームビューに戻ります。

simulation_sample_firstview


  1. 歩いているアバターや走っている乗り物をクリックすると、カメラインタラクションモードに入ります。左に表示される数字ボタンを押すと視点を切り替えることができます。

「1」ボタンを押下すると一人称視点モードに変わります。
simulation_sample_FPV

「2」ボタンを押下すると三人称視点モードに変わります。
simulation_sample_TPV

「3」ボタンを押下すると見回しモードに変わります。
simulation_sample_lookaround

詳しくは Sandbox Toolkit のカメラインタラクションについてをご確認ください。

3. サンプルプロジェクトのカスタマイズ方法

3-1. 3D都市モデルの変更

シーンをカスタマイズし、3D都市モデルや配置物を変更したい場合は "Assets/Simulation.unity" をひらき、シーンを編集します。

simulation_sample_scene

3D都市モデルを変更する場合はヒエラルキーの中の "CesiumGeoreference" の中にある3D都市モデルを削除した上で、別途インポートした3D都市モデルを同じ場所に配置してください。

simulation_sample_customize_cesium

Note 3D都市モデルのインポートはPLATEAU SDK for Unityを利用して行ってください。 (都市モデルのインポート) 本サンプルで使われている3D都市モデル位置合わせ機能はMaps Toolkitの機能です。(PLATEAUモデル位置合わせ - Maps Toolkit

4. 3D都市モデルを使った都市景観作成時のTips

3D都市モデルを使って都市景観を作成する際には、利用するデバイスに応じてモデルを最適化することが重要です。 また、テクスチャを差し替えたり、現実の都市空間にあるものをプロップスとして配置したりするなどの工夫で外観のクオリティを高めることができます。 本セクションでは、このサンプルシーンを構築する際に行った景観クオリティ向上のための手順をご紹介します。

4-1. サンプル都市モデルの作成

PLATEAU SDKでの都市モデルの読み込み

PLATEAU SDKを使用して都市モデルを読み込みます。 サンプルでは、建築物モデルLOD2、地形モデルLOD1、道路モデルLOD1を配置しました。 地形モデルに対しては、PLATEAU SDKの機能を用いて空中写真を張り付けています。

simulation_sample_import1

simulation_sample_import2

Rendering Toolkitでの環境システムの作成

Rendering Toolkit (PLATEAU SDK-Toolkits) を使用して環境システムを作成します。ワンクリックで高品質なライティング環境がセットアップされます。

simulation_sample_create_environment

simulation_sample_apply_environment

自動テクスチャ生成の実行

ビルを選択し、Rendering Toolkit の自動テクスチャ生成機能を実行します。環境システムの Time of Day スライダーを調整して時間帯を夜にすると、街灯りが灯ります。雨や雪の天候変化にも対応します。

simulation_sample_select_buildings

simulation_sample_apply_texturing1

simulation_sample_apply_texturing2

simulation_sample_apply_texturing3

Cesium for Unity を用いたPLATEAU地面タイルの読み込み

Cesium for Unity と PLATEAU SDK-Maps-Toolkit の位置合わせ機能を利用してPLATEAUの地面タイルを読み込み、遠景として使用します。ここまでのステップで基本的な景観設定が完了します。
※ PLATEAU SDK-Maps-Toolkit の機能を使った位置合わせのやり方に関しては(PLATEAUモデル位置合わせ - Maps Toolkit)をご確認ください。

simulation_sample_cesium_tile2
simulation_sample_result1
simulation_sample_result2

環境システムのパラメータをアプリケーション実行時にGUIから制御

本サンプルでは環境システムのパラメータをアプリケーション実行時にGUIから制御しています。

こちらは Rendering Toolkit (PLATEAU SDK-Toolkits) の環境システムのパラメータになります。スクリプトを作成することでアプリケーション実行時の制御が可能です。
※ 各パラメータについての詳しい説明はRendering Toolkit 利用マニュアルのページをご覧ください。

simulation_sample_apply_environment


(例) アプリケーション実行時、GUIから環境システムのパラメータを制御 simulation_sample_apply_environment

以下にサンプルに実装された時間の変更をGUIで制御するコードと天候の変更をGUIで制御するコードを紹介します。

以下のコードは TimeOfDaySliderController コンポーネントを示しています。このコンポーネントは、時間の変更を制御するためのスライダーの値が変更されたときに、環境システムにその値を反映させます。

using UnityEngine;
using UnityEngine.UI;
using PlateauToolkit.Rendering;

namespace PlateauSamples.UrbanScape
{
    public class TimeOfDaySliderController : MonoBehaviour
    {
        [SerializeField] Slider m_Slider;
        EnvironmentController m_EnvironmentController;

        void Awake()
        {
            if (m_Slider == null)
            {
                return;
            }

            m_EnvironmentController = FindObjectOfType<EnvironmentController>();
            if (m_EnvironmentController == null)
            {
                return;
            }

            m_Slider.onValueChanged.AddListener(HandleSliderValueChanged);
        }

        public void HandleSliderValueChanged(float value)
        {
            m_EnvironmentController.m_TimeOfDay = value;
        }

        void OnDestroy()
        {
            if (m_Slider != null)
            {
                m_Slider.onValueChanged.RemoveListener(HandleSliderValueChanged);
            }
        }
    }
}

TimeOfDaySliderController クラス内で、スライダーの値に応じて環境の時間帯を変更する重要な部分は以下の通りです。
このメソッド HandleSliderValueChanged は、ユーザーがGUI上でスライダーを操作するときに呼び出されます。スライダーの値 ( value ) は 環境システムの TimeOfDay パラメータに設定され、これにより環境システムの時間帯が変更されます。

public class TimeOfDaySliderController : MonoBehaviour
{
    // ...

    // 時間帯スライダーの値が変更された時の処理
    public void HandleSliderValueChanged(float value)
    {
        // スライダーの値を環境システムの時間帯のパラメータ(TimeOfDay)に反映
        m_EnvironmentController.m_TimeOfDay = value;
    }

    // ...
}

以下に示すのは WeatherSliderController コンポーネントを示しています。このコンポーネントでは、雨、雪、曇りの各スライダーの値に応じて環境システムの天候を制御します。

using UnityEngine;
using UnityEngine.UI;
using PlateauToolkit.Rendering;

namespace PlateauSamples.UrbanScape
{
    public class WeatherSliderController : MonoBehaviour
    {
        [SerializeField] Slider m_RainSlider;
        [SerializeField] Slider m_SnowSlider;
        [SerializeField] Slider m_CloudySlider;
        [SerializeField] CanvasGroup m_CanvasGroup;
        EnvironmentController m_EnvironmentController;

        void Awake()
        {
            m_EnvironmentController = FindObjectOfType<EnvironmentController>();
            if (m_EnvironmentController == null)
            {
                return;
            }
        }

        void Start()
        {
            m_RainSlider.onValueChanged.AddListener(HandleRainSliderChanged);
            m_CloudySlider.onValueChanged.AddListener(HandlecloudySliderChanged);
            m_SnowSlider.onValueChanged.AddListener(HandleSnowSliderChanged);
        }

        void HandleRainSliderChanged(float value)
        {
            if (m_CanvasGroup.alpha > 0)
            {
                m_EnvironmentController.m_Rain = value;
            }
        }

        void HandlecloudySliderChanged(float value)
        {
            if (m_CanvasGroup.alpha > 0)
            {
                m_EnvironmentController.m_Cloud = value;
            }
        }

        void HandleSnowSliderChanged(float value)
        {
            if (m_CanvasGroup.alpha > 0)
            {
                m_EnvironmentController.m_Snow = value;
            }
        }

        void OnDestroy()
        {
            m_RainSlider.onValueChanged.RemoveListener(HandleRainSliderChanged);
            m_CloudySlider.onValueChanged.RemoveListener(HandlecloudySliderChanged);
            m_SnowSlider.onValueChanged.RemoveListener(HandleSnowSliderChanged);
        }
    }
}

WeatherSliderController クラス内で、各スライダー(雨、曇り、雪)の値に応じて環境システムのパラメータを変更する重要な部分は以下の通りです。
この各メソッドは、ユーザーがGUI上のスライダーを操作するときに呼び出されます。スライダーの値 ( value ) は 環境システムの(雨、曇り、雪) パラメータに設定され、これにより環境システムの天候が変更されます。

public class WeatherSliderController : MonoBehaviour
{
    // ...

    // 雨スライダーの値が変更された時の処理
    void HandleRainSliderChanged(float value)
    {
        if (m_CanvasGroup.alpha > 0)
        {
            // スライダーの値を環境システムの雨のパラメータ(Rain)に反映
            m_EnvironmentController.m_Rain = value;
        }
    }

    // 曇りスライダーの値が変更された時の処理
    void HandlecloudySliderChanged(float value)
    {
        if (m_CanvasGroup.alpha > 0)
        {
            // スライダーの値を環境システムの曇りのパラメータ(Cloud)に反映
            m_EnvironmentController.m_Cloud = value;
        }
    }

    // 雪スライダーの値が変更された時の処理
    void HandleSnowSliderChanged(float value)
    {
        if (m_CanvasGroup.alpha > 0)
        {
            // スライダーの値を環境システムの雪のパラメータ(Snow)に反映
            m_EnvironmentController.m_Snow = value;
        }
    }

    // ...
}

これらのコンポーネントは "Canvas/ViewerPanel" ゲームオブジェクトにアタッチされています。
コンポーネントにはGUIの時間帯を制御するスライダーと天候(雨、雪、曇り)を制御するスライダーのゲームオブジェクトが割り当てられています。
simulation_sample_select_buildings
simulation_sample_select_buildings

窓の調整

ビルの形状によっては窓が不自然に見える場合があるため、RenderingToolkitの窓の調整機能を使用して調整が可能です。

simulation_sample_window_adjust1

simulation_sample_window_adjust2

4-2. 道路や地面の調整のTips

地面の修正

PLATAEUの地形モデルは航空測量によって1メートル~10メートルのメッシュで作成されているため、凸凹があります。 現実の地形を再現する必要がない場合、地形が平滑化されている方が自然な見た目になります。 そこで、 Unity ProBuilder を使用して地形モデルのメッシュを修正します。まずは地面のメッシュを ProBuilder で編集可能なオブジェクトに変換します。 尚、Cesium for Unity から取得した地形モデル (Terrain) は編集できませんので、ここではPLATEAU SDKを用いてインポートした地形モデルを用います。

simulation_sample_road_cleanup1



地形モデルのメッシュを選択して "メニュー" > "Tools" > "ProBuilder" > "ProBuilder Window" > "Probuilderize" を実行します。

simulation_sample_probuilder_fix2



凹んでいる箇所の頂点群を選択してY軸に対してスケーリングを行うと、凹んでいる箇所の頂点がフラットになります。これを必要な部分に行い地面のクリーンアップは完了です。
simulation_sample_probuilder_fix3

simulation_sample_probuilder_fix3
simulation_sample_probuilder_fix4
simulation_sample_road_cleanup1
simulation_sample_road_cleanup2

道路の修正

PLATEAUの道路モデルを地面の上に移動します。道路モデルのLOD1-2は高さを持たないフラットなメッシュのため、必要に応じて適宜 ProBuilder で調整を行います。
simulation_sample_road_texturing1

次にサンプルの "Materials" フォルダーに用意された、 "Common_Asphalt_01_MAT" マテリアルを適用します。
プラナーマッピングという手法で、UVマッピングが存在しない場合でもテクスチャの模様を平面的に張ることが可能です。
simulation_sample_road_texturing1

プラナーマッピングへの変更方法に関してはマテリアルの Base UV Set パラメータを Planar に設定します。
simulation_sample_road_texturing2

※ プラナーマッピングの手法に関しての解説は Unity Japan の動画 「投影マッピングを使ったテクスチャーテクニック」をご覧ください。
解説動画では、トリプラナーマッピングについても解説されています。トリプラナーマッピングを使用したい場合は。マテリアルの Base UV Set パラメータを Triplanar に変更してください
fan simulation_sample_road_texturing2

建物の下のタイル敷設

SandboxToolkit標準のアセットを使用して建物の下にタイルを配置していきます。
simulation_sample_tile_placement1

今回配置したアセットは「Prop_Tile_01」になります。
配置方法に関しての詳しい解説はSandbox Toolkit 利用マニュアルのページをご覧ください
simulation_sample_tile_placement3

Note ※ 当サンプルリリース時点では「Unity 2021.3.30f1」を使用しておりますが、UnityEditorの不具合で、Sandboxの標準アセットのアイコン表示が黒くなってしまうバグが報告されております。
もし発生した場合はUnity 2021.3.31f1にアップデートすることで改善されます。次回アップデートにて当サンプルもUnityEditorのバージョンアップを実施予定です。


また、必要な場合は建物の形状に合わせて適宜 ProBuilder で調整を行います。
当サンプルでは、Unity標準のトランスフォームのスケールを変更して大きさを調整しています。
simulation_sample_tile_placement2
simulation_sample_tile_placement3

センターラインの配置

Sandbox Toolkit (PLATEAU SDK-Toolkits) のインスタンス配置機能 ( PlateauSandboxTrackInstantiate ) を使用してトラックに沿ってセンターラインを配置します。

Sandbox Toolkitを用いてトラックを作成します。
simulation_sample_centerline1

作成したトラックに PlateauSandboxTrackInstantiate コンポーネントを割り当てます。
※ こちらのコンポーネントを使用したインスタンス配置に関しては、Sandbox Toolkitの標準機能になります。詳しい使い方に関してはSandbox Toolkit 利用マニュアルのページもご覧ください。
simulation_sample_centerline1

Sandbox Toolkitのビルトインアセットの「Prop_Marking_StraightLine_01」を
追加したコンポーネントの「生成アイテムリスト」にドラッグアンドドロップし、インスタンス配置したいオブジェクトを登録します。
simulation_sample_centerline1
simulation_sample_centerline1
simulation_sample_centerline1

コンポーネントの下の方の詳細設定の Spacing を調整することで配置の間隔を調整することができます。
simulation_sample_centerline1

また、 Position Offset のチェックボックスをオンにすると配置位置のオフセットを調整することができます。
simulation_sample_centerline1

これでセンターラインの配置は完了です。
simulation_sample_centerline1
simulation_sample_centerline2
simulation_sample_centerline3

ProBuilderのインストール方法

ProBuilder は Unity公式のモデリングツールで、ポリゴンベースのモデリング、テクスチャリング、編集作業をUnityエディター内で簡単に行うことができます。これを使用するためには、Unityのパッケージマネージャーからインストールする必要があります。

  1. Unityエディター内で「Window」メニューを開き、「Package Manager」を選択します。
  2. パッケージマネージャーウィンドウで「ProBuilder」を検索します。
  3. ProBuilder パッケージを見つけたら、「Install」ボタンを押下してインストールを開始します。

simulation_sample_probuilder_install1


ヒエラルキーのカスタム選択機能の使用例

Unityのヒエラルキーでのカスタム選択機能は、複雑な階層を持つシーンで、特定のコンポーネントやタグを持つオブジェクトを一括で選択するのに役立ちます。カスタム選択機能を使用するには "メニュー" > "Edit" > "Preferences" の "Search" タブで "Scene" を "Advanced" に設定してください。

simulation_sample_custom_selection1

  • 使用例: ヒエラルキーパネルの検索バーに特定の条件を入力します。例えば、「t:MeshRenderer」と入力すると、すべてのメッシュレンダラーを持つオブジェクトが表示されます。
  • カスタム検索の利点: カスタム検索を使用することで、プロジェクト内の特定のタイプのオブジェクトや特定の機能を持つオブジェクトをすばやく見つけることができます。

現在のシーンで表示されているPLATEAU 3D都市モデルを一括選択する場合は "bldg t:MeshRenderer p(m_IsActive)=true" と入力します。

simulation_sample_custom_selection2


4-3. プロップ/アバター/乗り物の配置

Sandbox Toolkitの機能を使ってシーンにプロップ/アバター/乗り物を配置し、さまざまなカスタマイズができます。
詳しくはSandbox Toolkit 利用マニュアルをご確認ください。

プロップの配置
multiplay_sample_scene

アバターの配置
multiplay_sample_scene

乗り物の配置
multiplay_sample_scene

4-4. ポストエフェクトの適用(HDRP)

HDRPのプロジェクトでは CustomPass を使ってポストエフェクトを設定することができます。本サンプルシーンでは Toy Camera が設定されています。Custom Pass Volumeの中の Target Camera を変更することで、ポストエフェクトを設定するカメラを変更することが可能です。

詳しくはポストエフェクトの使い方をご確認ください。

multiplay_sample_scene

5. サンプルプロジェクトの作成チュートリアル

※このサンプルプロジェクトの主要機能の実装例をチュートリアルで紹介しています。実装方法については、こちらのチュートリアルをご参照ください。

ライセンス

  • 本リポジトリはMITライセンスで提供されています。
  • 本システムの開発はユニティ・テクノロジーズ・ジャパン株式会社が行っています。
  • ソースコードおよび関連ドキュメントの著作権は国土交通省に帰属します。

注意事項/利用規約

  • 本ツールはベータバージョンです。バグ、動作不安定、予期せぬ挙動等が発生する可能性があり、動作保証はできかねますのでご了承ください。
  • パフォーマンスの観点から、3km²の範囲に収まる3D都市モデルをダウンロード・インポートすることを推奨しています。
  • インポートする範囲の広さや地物の種類(建物、道路、災害リスクなど)が量に比例して処理負荷が高くなる可能性があります。
  • 本リポジトリの内容は予告なく変更・削除される可能性があります。
  • 本リポジトリの利用により生じた損失及び損害等について、国土交通省はいかなる責任も負わないものとします。