Imagen del proyecto
ESRIEn Japón,Yamaha Motor CorporationyDairin Corporationrealizan conjuntamente una investigación sobre herramientas digitales para bosques, y en ese contexto ArcGIS Maps SDK for Unity (en adelante,ArcGIS SDK) se utilizó para desarrollar la aplicación Unity. Recientemente, ese proyecto Unity fue publicado en nuestro GitHub.Proyectonuestro GitHub ha sido publicado.
En este artículo, explicaremos cómo se utilizan las características específicas del SDK de ArcGIS en la aplicación Unity, y también mostraremos cómo se implementaron.ArcGIS SDK
Para detalles sobre el uso de la aplicación, consulte el README de GitHub.
¿Cómo se utiliza el ArcGIS SDK??
En este proyecto, el ArcGIS SDK se utiliza principalmente con tres elementos: ① visualización del mapa base, ② lectura de archivos de paquete y ③ gestión de la ubicación de objetos. A continuación se explica cada uno.
1. Visualización del mapa base
La visualización del mapa base es una función básica en GIS y también se utiliza en el ArcGIS SDK. En esta aplicación, se usa la interfaz Map Creator UI del ArcGIS SDK para generar mapas base. Esta Map Creator UI permite utilizar capas gestionadas en ArcGIS Online.En este proyecto, se muestra como entorno simulado el modelo 3D de la ciudad de Seiryo (Project PLATEAU).
Map Creator UI
Además, para transmitir intuitivamente dónde está ubicado dentro del bosque amplio, también se utiliza un mapa adicional como mini mapa.Desde la versión 2.0 del ArcGIS SDK, se soporta la visualización de múltiples mapas simultáneamente. Esto permite comparar varios mapas y ampliar el rango de visualización. Sobre los múltiples mapas, también puede confirmarse con la muestra proporcionada por Esri llamada .
2. Lectura de archivos de paquete
En este proyecto, los archivos con extensión ".tpkx" o ".slpk" ubicados en la carpeta StreamingAssets son leídos automáticamente..tpkx.slpk.tpkx indica un paquete tipo tile que en este proyecto representa información topográfica con elevación estándar.Además, el archivo .slpk indica un paquete tipo escena que en este proyecto representa un objeto 3D con formato escena.
.slpk 3D objeto .
Carpeta StreamingAssets
Estos archivos son leídos dentro del juego mediante un script llamado LoadPackage..
Por ejemplo, si no se encuentra información topográfica dentro de la carpeta StreamingAssets, se obtiene y lee información de elevación Terrain 3D proporcionada por 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 で公開していますので、ご興味のある方はプロジェクトをクローンして、自由にご活用ください。
参考リンク