更新日時 | 更新内容 |
---|---|
2024/4/5 | UrbanScape チュートリアル公開 |
2023/12/25 | UrbanScape 初回リリース |
- Urban Scape
- 目次
- 1. サンプルプロジェクトの概要
- 2. 利用手順
- 3. サンプルプロジェクトのカスタマイズ方法
- 4. 3D都市モデルを使った都市景観作成時のTips
- 5. サンプルプロジェクトの作成チュートリアル
- ライセンス
- 注意事項/利用規約
- 本サンプルプロジェクトを使うことで、都市の景観を綺麗に見せられるようなビューアーアプリを作ることが可能です。
- 都市でのPV作成などのユースケースを想定したサンプルプロジェクトです。
※このサンプルプロジェクトの主要機能の実装例をチュートリアルで紹介しています。実装方法については、こちらのチュートリアルをご参照ください。
- Unity 2021.3.30f1
- HDRP (HighDefinition Rendering Pipeline)
- URP (Universal Rendering Pipeline)
Built-in Rendering Pipelineでは動作しません。
- 天候の変更
- 時間変更
- ポストエフェクト
- 人の配置
- 車の配置
- プロップの配置
- Cesium for Unity を使ったPLATEAUモデルの位置合わせ
以下は本プロジェクトで使用した開発環境です。
- Windows 11
- macOS Ventura 13.2
- "Assets/Scenes/UrbanScape" を開きます。
- 最初にHDRPに関してのウィザードが表示されることがありますが、閉じてください。
- メニューより "File" > "Build Settings" を選択します。
- 画面下部にある「Build」ボタンを押下します。出力先を選択してビルドを開始します。
- ビルドしたアプリケーションを開くと、オープニング画面が表示されます。
「始めましょう」ボタンを押下してください。
- 固定カメラ1ボタンを押下すると、人や車の通行が確認できる定点カメラビューに遷移します。
- 固定カメラ2ボタンを押下すると、俯瞰視点の定点カメラビューに遷移します。このカメラには「トイカメラ」のポストエフェクトが適用されています。
- ホームボタンを押すと、ホームビューに戻ります。
- 歩いているアバターや走っている乗り物をクリックすると、カメラインタラクションモードに入ります。左に表示される数字ボタンを押すと視点を切り替えることができます。
詳しくは Sandbox Toolkit のカメラインタラクションについてをご確認ください。
シーンをカスタマイズし、3D都市モデルや配置物を変更したい場合は "Assets/Simulation.unity" をひらき、シーンを編集します。
3D都市モデルを変更する場合はヒエラルキーの中の "CesiumGeoreference" の中にある3D都市モデルを削除した上で、別途インポートした3D都市モデルを同じ場所に配置してください。
Note 3D都市モデルのインポートはPLATEAU SDK for Unityを利用して行ってください。 (都市モデルのインポート) 本サンプルで使われている3D都市モデル位置合わせ機能はMaps Toolkitの機能です。(PLATEAUモデル位置合わせ - Maps Toolkit)
3D都市モデルを使って都市景観を作成する際には、利用するデバイスに応じてモデルを最適化することが重要です。 また、テクスチャを差し替えたり、現実の都市空間にあるものをプロップスとして配置したりするなどの工夫で外観のクオリティを高めることができます。 本セクションでは、このサンプルシーンを構築する際に行った景観クオリティ向上のための手順をご紹介します。
PLATEAU SDKを使用して都市モデルを読み込みます。 サンプルでは、建築物モデルLOD2、地形モデルLOD1、道路モデルLOD1を配置しました。 地形モデルに対しては、PLATEAU SDKの機能を用いて空中写真を張り付けています。
Rendering Toolkit (PLATEAU SDK-Toolkits) を使用して環境システムを作成します。ワンクリックで高品質なライティング環境がセットアップされます。
ビルを選択し、Rendering Toolkit の自動テクスチャ生成機能を実行します。環境システムの Time of Day
スライダーを調整して時間帯を夜にすると、街灯りが灯ります。雨や雪の天候変化にも対応します。
Cesium for Unity と PLATEAU SDK-Maps-Toolkit の位置合わせ機能を利用してPLATEAUの地面タイルを読み込み、遠景として使用します。ここまでのステップで基本的な景観設定が完了します。
※ PLATEAU SDK-Maps-Toolkit の機能を使った位置合わせのやり方に関しては(PLATEAUモデル位置合わせ - Maps Toolkit)をご確認ください。
本サンプルでは環境システムのパラメータをアプリケーション実行時にGUIから制御しています。
こちらは Rendering Toolkit (PLATEAU SDK-Toolkits) の環境システムのパラメータになります。スクリプトを作成することでアプリケーション実行時の制御が可能です。
※ 各パラメータについての詳しい説明はRendering Toolkit 利用マニュアルのページをご覧ください。
(例) アプリケーション実行時、GUIから環境システムのパラメータを制御
以下にサンプルに実装された時間の変更を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の時間帯を制御するスライダーと天候(雨、雪、曇り)を制御するスライダーのゲームオブジェクトが割り当てられています。
ビルの形状によっては窓が不自然に見える場合があるため、RenderingToolkitの窓の調整機能を使用して調整が可能です。
PLATAEUの地形モデルは航空測量によって1メートル~10メートルのメッシュで作成されているため、凸凹があります。 現実の地形を再現する必要がない場合、地形が平滑化されている方が自然な見た目になります。 そこで、 Unity ProBuilder を使用して地形モデルのメッシュを修正します。まずは地面のメッシュを ProBuilder で編集可能なオブジェクトに変換します。 尚、Cesium for Unity から取得した地形モデル (Terrain) は編集できませんので、ここではPLATEAU SDKを用いてインポートした地形モデルを用います。
地形モデルのメッシュを選択して "メニュー" > "Tools" > "ProBuilder" > "ProBuilder Window" > "Probuilderize" を実行します。
凹んでいる箇所の頂点群を選択してY軸に対してスケーリングを行うと、凹んでいる箇所の頂点がフラットになります。これを必要な部分に行い地面のクリーンアップは完了です。
PLATEAUの道路モデルを地面の上に移動します。道路モデルのLOD1-2は高さを持たないフラットなメッシュのため、必要に応じて適宜 ProBuilder で調整を行います。
次にサンプルの "Materials" フォルダーに用意された、 "Common_Asphalt_01_MAT" マテリアルを適用します。
プラナーマッピングという手法で、UVマッピングが存在しない場合でもテクスチャの模様を平面的に張ることが可能です。
プラナーマッピングへの変更方法に関してはマテリアルの Base UV Set
パラメータを Planar
に設定します。
※ プラナーマッピングの手法に関しての解説は Unity Japan の動画 「投影マッピングを使ったテクスチャーテクニック」をご覧ください。
解説動画では、トリプラナーマッピングについても解説されています。トリプラナーマッピングを使用したい場合は。マテリアルの Base UV Set
パラメータを Triplanar
に変更してください
fan
SandboxToolkit標準のアセットを使用して建物の下にタイルを配置していきます。
今回配置したアセットは「Prop_Tile_01」になります。
配置方法に関しての詳しい解説はSandbox Toolkit 利用マニュアルのページをご覧ください
Note ※ 当サンプルリリース時点では「Unity 2021.3.30f1」を使用しておりますが、UnityEditorの不具合で、Sandboxの標準アセットのアイコン表示が黒くなってしまうバグが報告されております。
もし発生した場合はUnity 2021.3.31f1にアップデートすることで改善されます。次回アップデートにて当サンプルもUnityEditorのバージョンアップを実施予定です。
また、必要な場合は建物の形状に合わせて適宜 ProBuilder で調整を行います。
当サンプルでは、Unity標準のトランスフォームのスケールを変更して大きさを調整しています。
Sandbox Toolkit (PLATEAU SDK-Toolkits) のインスタンス配置機能 ( PlateauSandboxTrackInstantiate
) を使用してトラックに沿ってセンターラインを配置します。
Sandbox Toolkitを用いてトラックを作成します。
作成したトラックに PlateauSandboxTrackInstantiate
コンポーネントを割り当てます。
※ こちらのコンポーネントを使用したインスタンス配置に関しては、Sandbox Toolkitの標準機能になります。詳しい使い方に関してはSandbox Toolkit 利用マニュアルのページもご覧ください。
Sandbox Toolkitのビルトインアセットの「Prop_Marking_StraightLine_01」を
追加したコンポーネントの「生成アイテムリスト」にドラッグアンドドロップし、インスタンス配置したいオブジェクトを登録します。
コンポーネントの下の方の詳細設定の Spacing
を調整することで配置の間隔を調整することができます。
また、 Position Offset
のチェックボックスをオンにすると配置位置のオフセットを調整することができます。
ProBuilder は Unity公式のモデリングツールで、ポリゴンベースのモデリング、テクスチャリング、編集作業をUnityエディター内で簡単に行うことができます。これを使用するためには、Unityのパッケージマネージャーからインストールする必要があります。
- Unityエディター内で「Window」メニューを開き、「Package Manager」を選択します。
- パッケージマネージャーウィンドウで「ProBuilder」を検索します。
- ProBuilder パッケージを見つけたら、「Install」ボタンを押下してインストールを開始します。
Unityのヒエラルキーでのカスタム選択機能は、複雑な階層を持つシーンで、特定のコンポーネントやタグを持つオブジェクトを一括で選択するのに役立ちます。カスタム選択機能を使用するには "メニュー" > "Edit" > "Preferences" の "Search" タブで "Scene" を "Advanced" に設定してください。
- 使用例: ヒエラルキーパネルの検索バーに特定の条件を入力します。例えば、「t:MeshRenderer」と入力すると、すべてのメッシュレンダラーを持つオブジェクトが表示されます。
- カスタム検索の利点: カスタム検索を使用することで、プロジェクト内の特定のタイプのオブジェクトや特定の機能を持つオブジェクトをすばやく見つけることができます。
現在のシーンで表示されているPLATEAU 3D都市モデルを一括選択する場合は "bldg t:MeshRenderer p(m_IsActive)=true" と入力します。
Sandbox Toolkitの機能を使ってシーンにプロップ/アバター/乗り物を配置し、さまざまなカスタマイズができます。
詳しくはSandbox Toolkit 利用マニュアルをご確認ください。
HDRPのプロジェクトでは CustomPass を使ってポストエフェクトを設定することができます。本サンプルシーンでは Toy Camera が設定されています。Custom Pass Volumeの中の Target Camera
を変更することで、ポストエフェクトを設定するカメラを変更することが可能です。
詳しくはポストエフェクトの使い方をご確認ください。
※このサンプルプロジェクトの主要機能の実装例をチュートリアルで紹介しています。実装方法については、こちらのチュートリアルをご参照ください。
- 本リポジトリはMITライセンスで提供されています。
- 本システムの開発はユニティ・テクノロジーズ・ジャパン株式会社が行っています。
- ソースコードおよび関連ドキュメントの著作権は国土交通省に帰属します。
- 本ツールはベータバージョンです。バグ、動作不安定、予期せぬ挙動等が発生する可能性があり、動作保証はできかねますのでご了承ください。
- パフォーマンスの観点から、3km²の範囲に収まる3D都市モデルをダウンロード・インポートすることを推奨しています。
- インポートする範囲の広さや地物の種類(建物、道路、災害リスクなど)が量に比例して処理負荷が高くなる可能性があります。
- 本リポジトリの内容は予告なく変更・削除される可能性があります。
- 本リポジトリの利用により生じた損失及び損害等について、国土交通省はいかなる責任も負わないものとします。