This is a guide to combining Esri ArcGIS CityEngine content with Cesium ion datasets within NVIDIA Omniverse, using the Esri ArcGIS CityEngine connector and the Cesium for Omniverse extension.
You’ll learn how to:
- Prepare and export 3D content from ArcGIS CityEngine.
- Accurately position this content on Cesium World Terrain.
- Know how to set up a basic Cesium for Omniverse stage in NVIDIA Omniverse USD Composer. Check out our Cesium for Omniverse Quickstart guide for instructions on starting with the Cesium for Omniverse extension.
- An ArcGIS CityEngine scene representing a real-world location, georeferenced to a UTM-based coordinate system. Follow this guide to create a scene using the Get Map Data tool in CityEngine.
- The ArcGIS CityEngine Omniverse connector installed from the Omniverse Launcher.
Architectural software commonly favors local Cartesian coordinate systems over geographic ones to meet the demands of precision, accuracy, and simplified workflows. Local coordinate systems offer a convenient method for defining and manipulating precise measurements without the complications associated with geographic factors like Earth's curvature and latitude-longitude coordinates.
When it comes to Cesium for Omniverse, it typically adopts a geographic, Earth-centered Earth-fixed coordinate system, representing Earth as an accurate 3D globe. Consequently, to position an architectural model represented in local coordinates onto a geographic dataset such as a globe, a conversion process becomes necessary.
Fortunately, CityEngine scenes are typically built from real-world map data and provide the necessary information to assist with converting from local coordinate systems to a geographic one. It is important to note that while the workflow in this tutorial can accurately position CityEngine data on the globe, it does not feature a way to account for the curvature of Earth. This means for particularly large CityEngine scenes, data at the edges of the model may not be accurately positioned with respect to the surface of the Cesium globe.
Depending on your use case, this may not be an issue. A common workflow is to use a geospatial dataset such as the Cesium globe as “background” content, where its primary function is to provide visual context only and lower levels of accuracy are acceptable. Ultimately, your use case will determine the levels of accuracy required in your design and context data.
1Open your scene in CityEngine. This tutorial assumes that you already have a CityEngine scene geolocated to a UTM coordinate system.
2Click on Edit > Preferences to open the Preferences window, and then click on the Scene entry in the list to display the scene preferences. Take note of the EPSG code shown in the Scene coordinate system entry; this will be needed later in the tutorial. Close the Preferences window.
3In the 3D viewport, select all geometry for exporting by drag-selecting with the mouse or pressing CTRL + A on the keyboard.
4Go to File > Export Models, select the Omniverse Connector option from the list, and click Next.
5In the export settings window under the General Settings section, ensure the Terrain Layers drop-down is set to Export all terrain layers if you want to include the CityEngine terrain in the export.
6Expand the Geometry Settings section and click the Center button. This will create an offset that shifts your data from its current location, moving it closer to the origin (0,0,0) of the scene.
7Set the Y-Offset to zero. This will help us position the height of the model accurately once in Omniverse.
8Write down the X-Offset and Z-Offset values in your favorite text editor. We’ll need these to perform the conversion between local coordinates and geographic coordinates in Step 2.
9Click the Finish button to export your scene to USD.
1Visit the epsg.io coordinate calculator in your browser.
2Under Input coordinate system, click Change.
3Search for the EPSG code obtained from the CityEngine preferences window and select it. For the sample data in this tutorial, code 32632 is used.
4Under Output coordinate system, ensure that EPSG:4979 WGS 84 is selected and that the format under Output coordinates is set to dec.
5Under Input coordinates, negate the X-Offset value obtained from the CityEngine Export models window and then enter it in the X field. Enter the Z-Offset value in the Y field.
Be sure to negate the X-Offset value first. For example, if CityEngine had the value -500,000, you would enter the value 500,000 in the X field.
6Click the Transform button to convert the coordinates.
7The resulting latitude and longitude should be displayed under Output coordinates. Write these values down as they will be used in the next step. You can also click Show position on a map to confirm the provided coordinates align with the correct location on Earth for your project.
1Open Omniverse USD Composer, ensuring the Omniverse Fabric Scene Delegate is enabled as per the quickstart tutorial.
2Open the USD file created during Step 1. If nothing is visible, press F to zoom extents. You should see your CityEngine content within the stage. If your content appears dark, try choosing the Sunny Sky present lighting option from the top right of the viewport.
3From the Cesium window, add Cesium World Terrain + Bing Maps Aerial imagery to the stage.
4From the stage, select the CesiumGeoreference prim to display its properties in the Property window.
5In the Property window, enter the latitude and longitude obtained from EPSG.io. For now, enter the height value as 0.0. A more accurate height will be calculated later.
6You should see the tops of the CityEngine buildings appearing through the terrain in their correct locations, indicating accurate latitude and longitude have been used.
7CityEngine UTM scenes using Esri World Elevation have their height values defined based on mean sea level. Cesium World Terrain has its height values defined based on the WGS84 ellipsoid. To align the two as accurately as possible, the difference between mean sea level and ellipsoid height needs to be calculated. This difference can be used to offset Cesium World Terrain vertically.
8Visit the UNAVCO Height Calculator in your browser.
9In the coordinates box, enter the project’s latitude and longitude, followed by a height of 0.0, separated by commas. Click Submit.
10Scroll down to find the results, and copy the value from the Geoid Height (m) column.
11Paste this value into the Height field of the CesiumGeoreference prim in Omniverse.
12Cesium World Terrain should lower and now accurately align with the terrain exported from CityEngine.
Height datums used across projects will vary. Other methods may be required to accurately calculate the difference in height datum from your project data to Cesium World Terrain or other datasets you’re using.