Project afbeelding
ESRIIn Japan,Yamaha Motor CorporationenDairin Corporationhebben gezamenlijk onderzoek gedaan naar digitale bosbouw en in dat kaderArcGIS Maps SDK for Unity (hierna,ArcGIS SDK) gebruikt voor de ontwikkeling van een Unity app. Recentelijk hebben we dat project op onze GitHub gepubliceerd.Projectonze GitHub gedeeld.
In dit artikel introduceren we hoe in de Unity-app ArcGIS SDK specifieke elementen van de ArcGIS SDK worden gebruikt en tonen we ook de implementatiemethode.
Voor informatie over het gebruik van de app, raadpleeg de GitHub README.
Hoe wordt de ArcGIS SDK gebruikt?
In dit project wordt de ArcGIS SDK voornamelijk gebruikt voor drie elementen. Deze zijn: ① weergave van basiskaarten, ② lezen van package-bestanden, ③ beheer van objectcoördinaten. We leggen ze in volgorde uit.
1. Weergave van basiskaarten
De weergave van basiskaarten is een fundamentele functie in GIS en wordt natuurlijk ook gebruikt in de ArcGIS SDK. In deze applicatie maken we gebruik van de Map Creator UI-functie van de ArcGIS SDK om basiskaarten te genereren. Met deze Map Creator UI kunnen we ook lagen beheren die worden beheerd op ArcGIS Online. In dit project gebruiken we het als een reconstructie van de omgeving en tonen we het 3D stadsmodel van Chiyoda City (Project PLATEAU).
Map Creator UI
Ook gebruiken we deze keer één kaart als mini-kaart om visueel te laten zien waar in het uitgestrekte bos we ons bevinden.
2. Lezen van package-bestanden
In dit project worden automatisch bestanden met extensies ".tpkx" of ".slpk" gelezen vanuit de map StreamingAssets..tpkx.slpk.tpkx is een type packageen in dit project wordt het vooraf aangegeven dat het hoogte-informatie bevat die hoogte weergeeft. Ook isslpk はシーン レイヤー パッケージを指し、本プロジェクトでは、3D オブジェクト シーン レイヤーの形式を前提としています。
StreamingAssets フォルダー
これらのファイルは LoadPackage というスクリプトでゲーム内のマップに読み込んでいます。
例えば地形情報ですが、フォルダー内に見つからなかった場合は、ArcGIS Online が提供する Terrain 3D 標高データを取得し、読み込みます。
if(tpkxFiles.Length > 0)
{
for (int i = 0; i < tpkxFiles.Length; i++)
{
string elevationPath = tpkxFiles[i];
mapComponent.Map.Elevation = new ArcGISMapElevation(new ArcGISImageElevationSource(elevationPath, i.ToString(), ""))
{
ExaggerationFactor = elevEx
};
}
}
else
{
string elevationPath = "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer";
mapComponent.Map.Elevation = new ArcGISMapElevation(new ArcGISImageElevationSource(elevationPath, "Terrein 3D", ""))
{
ExaggerationFactor = elevEx
};
}
また、本プロジェクトでは林道を 3D オブジェクト シーン レイヤーとして読み込んでいます。ファイルは tex_elev008_w07.slpk として StreamingAssets フォルダー内に格納されています。下記コードの「ArcGISLayerType」を別の値に書き換えるとその他のレイヤー タイプを読み込むことができるようになります。ぜひ、お手持ちのデータでお試しください。
if (slpkFiles.Length > 0)
{
for (int i = 0; i < slpkFiles.Length; i++)
{
string sceneLayerPath = slpkFiles[i];
ArcGISLayer layer = new ArcGISLayer(sceneLayerPath, ArcGISLayerType.ArcGIS3DObjectSceneLayer, "");
mapComponent.Map.Layers.Add(layer);
}
}
3. オブジェクトの座標管理
本プロジェクトではサンプル データとして、1000 本以上の立木を表示しています。これらの座標は StreamingAssets フォルダー内に格納されている CSV のデータを参照していますが、立木のオブジェクトすべてに ArcGIS Location Component というコンポーネントがアタッチされています。
ArcGIS Location Component
しかし、上の画像をよく見ると緯度と経度(Latitude, Longitude)に関しては値が入力されていますが、高度(Altitude)は値が入力されていません。どのように高度を設定しているのでしょうか。
実は高度はコンポーネントの一番下にある Surface Placement で設定しています。この項目は、オブジェクトの高さを地形に対してどのように配置するかを決定する項目です。今回は没入感重視のため「On the Ground」で強制的に地表面にフィットさせています。この他にも、Altitude の値に準拠する「Absolute Height」と地表面との差分を設定できる「Relative to Ground」があります。
この設定は、TreeGenerator というスクリプトで行っています。この他にもオブジェクトの角度も同様に設定できるため、木によってばらつきを出すためにランダムな回転でバリエーションを出しています。
// LocationComponent 関連
var treeLocation = tree.GetComponent<ArcGISLocationComponent>();
if (treeLocation == null) treeLocation = Undo.AddComponent<ArcGISLocationComponent>(tree);
treeLocation.SurfacePlacementMode = ArcGISSurfacePlacementMode.OnTheGround;
treeLocation.Position = new ArcGISPoint(feature.POINT_X, feature.POINT_Y, 0, ArcGISSpatialReference.WGS84());
float randomizeAngle = UnityEngine.Random.Range(0.0f, 359.9f);
treeLocation.Rotation = new ArcGISRotation(randomizeAngle, 90, 0);
Tips: キャラクターなどの移動体に「On the Ground」を設定すると、地表面に押さえつけられるようになるため、アニメーションなどと干渉し意図しない挙動を起こすことがあります。その場合は、「Absolute Height」の設定がおすすめです。
最後に
本プロジェクトでは森林管理のデジタルツイン化を目指し、ArcGIS SDK を用いて雑木林の再現を行いました。ArcGIS と森林管理や林業をつなぎ、ゲームエンジンの可能性を広げることができたら嬉しく思います。
植林や樹木の範囲指定など、まだまだ実装の余地があると私は思っています。本プロジェクトは GitHub で公開していますので、ご興味のある方はプロジェクトをクローンして、自由にご活用ください。
参考リンク