2.3. Importing of GIS Data
The first step in creating visualizations in the UE is the importation of GIS data. This step may seem trivial, but it’s the first step where problems occur because UE, by default, doesn’t support standard GIS file formats. There are, however, multiple ways GIS data can be imported using external tools, plugins, and extensions. The most common ways to import GIS data are:
- 1)
Directly by dragging files into the content browser. This, however, only works for specific supported formats. This is comparable to ArcGIS Pro and importing data into the map from the catalog window (it may work simply by dragging files over or requiring a proper importing function to be used even for supported formats).
- 2)
Using the built-in plugin Datasmith, the official way to import data from outside the UE ecosystem. It works in two ways: as an extension for external software called Datasmith Exporter or as a plugin for UE called Datasmith Importer. The extension is mainly used with CAD and 3D modeling software to allow exporting models in formats that UE can work with, while the plugin version is for importing files with supported file formats into UE.
- 3)
Using third-party plugins such as Landscaping or TerraForm PRO. Those plugins mainly add functionality to import DTM data to create landscape actors and GIS vector lines to create landscape splines or blueprints. The disadvantage of using such third-party plugins is that they are paid (bought using the Unreal Engine marketplace) and may not support future versions of UE.
Since UE cannot import GIS file formats immediately, and there seemed to be no Datasmith extension for GIS software, the third option was to find suitable plugins to import GIS data from the Vltava project into UE. Unreal Engine Marketplace was used to find such plugins. This official marketplace is available from web browsers and Epic Games Launcher. It allows sharing and selling assets, such as textures, models, animations, code, etc., that can be added to individual projects or installed in the engine.
Two plugins were tested: Landscaping and TerraForm PRO, both allowing the import of vector data and DTM files. Landscaping is severely limited regarding coordinate systems since it only works with UTM-style coordinates. This caused the first problem of transforming all the data into an appropriate coordinate system. Secondly, it took a long time to import DTM, up to several hours if importing the whole 1670 km2 DTM (on the Poznań PC). Lastly, this plugin proved to be quite unstable when importing large datasets of vector data. TerraForm PRO offers the same functionality as Landscaping. The options and settings for importing DTM are comparable with the Landscaping plugin, with the advantage of not being limited to specific CRS. Importing DTM using the default settings takes roughly 15 minutes, which is a significant improvement over the Landscaping plugin; however, there seems to be a major problem with the resulting coordinates of the DTM. The imported DTM is transformed to match the engine’s coordinate origin (X=0, Y=0, Z=0), which means any attempts to import any other data outside of TerraForm, for example, 3D models from SketchUp using Datasmith, will not match with the imported landscape. There doesn’t seem to be a way to avoid this behavior. This means that if data from different sources needs to be imported using other methods, TerraForm PRO cannot be used. For those reasons, TerraForm PRO was rejected as a reliable form of importing GIS data for use within this study.
Luckily, during the work inside CityEngine, it was discovered that this software, also used in the Vltava project for procedural modeling, contains an inbuilt Datasmith exporter not mentioned in the official Datasmith documentation. This was significant because CityEngine is ESRI software, which allows it to import standard GIS data file formats and ESRI-specific GIS formats. Those can then be exported in Datasmith file format (*.udatasmith ). This method allows the export of DTM, 3D models, and shapes (vector data) into the UE. Importing *.udatasmith files using Datasmith Importer inside UE looks pretty stable compared to using plugins such as Landscaping reasonably fast. For example, importing 1670km2 of DTM with over 28000 polygons took 2 minutes to complete. After extensively testing all the methods mentioned above and plugins with the data from project Vltava and because of the ease of use, speed, and stability of CityEngine used as a middleman for importing GIS data into UE, an approach using the Datasmith exporter using CityEngine was chosen to be used within this study.
It is important to note that other ways to import GIS data exist, but the choice is heavily affected by the availability of licensing for CityEngine and ArcGIS Online. The options are CityEngine (licensed), ArcGIS Maps SDK for Unreal Engine to import maps and terrain directly from ArcGIS Online (licensed), and plugins such as TerraForm PRO (paid).
2.4. GIS Data from Project Vltava
During the initial testing of UE, it was found that most of the imported GIS data would need to be further edited in GIS to be usable or practical to use and work within UE to create a 3D visualization of the Vltava Valley.
While the DTM raster file containing height data of the terrain can be imported as a single file, reducing the amount of data is necessary to create a more stable and less memory-demanding visualization in UE. As is displayed in
Figure 2a, the original one-piece raster contains a large amount of no-data space represented by a black background. This black area is still made up of pixels with their positions and data values. The only difference is that the value is set to zero (or other arbitrary number), which a GIS software would identify as such and would not display or use in calculations. This means that even though those areas do not contain usable data for the terrain visualization, they still contain data, thanks to how the raster data is saved. However, in UE and other non-GIS software, those pixels are taken at their face value, resulting in one big rectangular terrain with a size of over 12700 km
2 (as in
Figure 2a) compared to the 1670 km
2 of the area of Vltava valley shown on
Figure 2b, and result in terrain being created in locations with no valuable data. This results in UE rendering the 12700 km
2 area, significantly reducing performance and increasing hardware demands.
Because of how raster files are saved, the way to avoid those empty (black) places is to split the original DTM raster into smaller rectangular rasters, where each raster fully contains part of the area of interest. Thankfully, the area of the DTM of Vltava Valley is primarily created based on SMO-5 maps and follows the shape of the SMO-5 rectangular map sheet layout. The division of the original raster into smaller rectangular pieces, which resulted in the creation of 68 individual rasters, is shown in
Figure 2b. For the division of the DTM, first, the outline of the area containing the Vltava River valley was created using the
Raster Domain geoprocessing tool. This Outline was then manually divided into 68 rectangles. The individual rectangles were designed to use as few as possible but made them similar in size, requiring some larger areas to be further split into smaller rectangles. The aim was to create rectangles covering the whole area but not containing any areas outside the Vltava River valley. The final rectangles are shown in
Figure 2b in orange color. The next step was splitting the original DTM using the
Split Raster geoprocessing tool. The resulting rasters were tested in UE, and through an iterative process of trial and error of partially building the visualization, the best parameters for the final raster attributes were found. First, it was found that there needs to be an overlap between the rasters to ensure the continuity of the terrain. However, the overlap should be as small as possible since, in the later stages of the creation of the visualizations, the procedurally created 3D objects like trees may become too dense in the areas of the overlap. Furthermore, due to the follow-up processes done on top of the terrain, it was decided that the individual raster's precision (pixel size) should be increased from 5m to 1m.
While this precision increase may seem counterproductive in terms of the reduction of memory demands of the visualization, the removal of the empty spots of terrain means the removal of more than 80% of the raster size, and together with the later use of
World Partition more than makes up for it. As is shown in
Table 4, while the upscaled DTM takes 25 times more memory due to the increased pixel count, after removing the “no data” background, the size is only 3,3 times bigger than the original. On average, the file sizes of the 68 DTM pieces are in the tens of MB. This is significant because later in the process of creating the scene in UE, a process called
World Partition is used, which renders only objects near the camera/player position. This means that only a few of the 68 DTM pieces are rendered at a time, leading to lower memory usage than the single original DTM with a resolution of 5m. The final 68 DTMs allow further use of world partition (tiling) in UE and, together with the outline polygon, are further used for editing and creating land use data.
Secondly, rasters used for importing terrain into UE through CityEngine should be a 32-bit float pixel type, which is significant information since the rasters used for terrain masks used for applying textures require different pixel types (16-bit unsigned). If the terrain raster had only 16bit depth, the created terrain in UE would be made of flat pixels resembling stairs, creating an unsmoothed terrain model, which would require either a smoothing pass for the entire landscape in UE or recreation of the imported raster in GIS.
The second dataset was created by manual vectorization of scans of the Imperial obligatory imprints of the stable cadaster, which captures the land use information between the years 1821 and 1840. While in the original GIS visualization, the whole vectorization shown in
Figure 3a was used thanks to the global height layer available in ArcGIS Online, this layer is not available for use in UE. For this reason, the first change to the vectorization was to reduce its scope to match the area covered by the DTM, as shown in
Figure 3b.
This was done using the
Clip geoprocessing tool with the DTM outline polygon shown in
Figure 3b as the clipping feature layer. After reducing the land use layer to the area of DTM, the whole vector layer had to be converted to raster. This is because while UE can import and display vector data, it converts all polygons into 3D splines. This creates a vast number of actors, which causes performance issues. On top of that, those do not interact with the terrain in any way and cannot be used to visualize land use on the terrain. In comparison, in a 3D GIS scene, 2D layers are projected on top of the terrain, and with the help of
Symbology, those layers can apply textures to parts of the terrain according to the land use information. In UE, however, the way to apply textures (in UE, called
materials, which on top of textures contain further details regarding physics and lighting-related attributes) is vastly different; terrain (in UE called l
andscape) can only have one single material assigned to a landscape. However, this material can be customized using a
Blueprint visual scripting system to create multiple layers with different attributes that can be assigned to various landscape parts. This is available as a paint option, allowing manual landscape painting with those layers. However, to use them on a larger scale, an option to import the layer´s area in a format of raster masks must be used. This means that the whole set of land use data had to be converted into a raster form of the exact dimensions as the original landscape, and specific file formats with specific naming schemes had to be used to apply different textures to different areas depending on the land use information.
Before converting land use data into raster form, it is essential to understand how the final raster is used inside UE so it can be tailored and changed beforehand. Typically, rasters in UE are used in two ways: to import the landscape itself or to apply textures (materials) using landscape attributes like slope or aspect in raster format. These are then used to apply materials and create seamless material blending between the individual mask layers. The individual pixel values of the mask are either used as a value of fact (for example, slope values) or as a weight for material blending. This visualization uses a process similar to material blending in the importing sense. In this instance, the land use rasters in the UE are applied to the individual landscape parts as a raster mask. From this comes the first change made to the land use dataset: aggregation of all the separate areas of the same land use under one ID. The goal was to make all the regions of the same land use look the same in UE. Since there were no plans for material blending and there is no need for differencing between different areas with the same land use, having different values for each polygon represented in the final raster is unnecessary and may cause problems in UE when applying materials and working with tens of thousands of polygons in GIS (may) cause instability, cause errors when using geoprocessing tools and other problems. Due to those reasons, all polygons of the same land use were aggregated (merged). After aggregating all the values of the dataset by the land use type into fourteen groups using the Select by attribute tool, merging them, each land use record representing the individual way the land used was converted to an individual raster format, creating 14 rasters in total using the Polygon to Raster geoprocessing tool. However, some rasters, such as water bodies or buildings, were not used further since those are modeled in the final visualization in different ways. Another reason for the aggregation was that using the Polygon to Raster geoprocessing tool with selection as part of the input feature creates one raster for each selected polygon, creating thousands of rasters, which is unnecessary and unsuitable for further data processing.
What needs to be highlighted is the use of Snap Raster option, which is mandatory at this point of the process because, without it, the output rasters would have different dimensions than the original DTM raster(s), where the areas on the edges of the processing extend may be cut out (for example, because there may not be any forest in the border areas during the creation of land use raster of forests) creating problems further down in the process where the final land use rasters would be difficult if not impossible to correctly align with the landscape in UE during the import of the land use rasters as raster masks.
After creating the individual land use rasters displaying each land type (forests, fields, gardens, etc.) in this way for the whole Vltava River valley, they were each split to match the rectangular areas of the 68 DTM parts. The process for this further division was very similar to dividing the original DTM using the Split Raster geoprocessing tool. The difference here was the use of the Snap Raster option, where the rasters used for snapping were the individual 68 rasters, to ensure that the resulting land-use masking rasters would match the individual DTM rasters.
2.5. Work inside Unreal Engine
The first step in creating the visualization of the Vltava River valley in the UE was to import terrain rasters as a landscape. This was done using Datasmith Importer with CityEngine as a middleman. After the landscape layers were imported into UE and datasets were prepared in the GIS, further preparations on the UE side were necessary to import the land use data as raster masks. Firstly, to correctly display and work within UE, many settings needed to be tweaked/changed to ensure maximal visual quality and functionality of the used processes and, in general, help with creating the visualization both in UE editor and within the final visualization. Most required settings are mentioned further in the text at appropriate places. However, for ease of use and the ability to set everything beforehand, all used
Editor Preferences and
Project Settings settings are listed in
Table 5 and
Table 6. The remainder of this chapter describes the steps to prepare for the remaining data to be correctly imported and processed in the UE and the steps made within UE to create the final Vltava River visualization.
The first step is to display and use the land use data on top of the imported landscape. To do this, landscape layers within landscape material had to be defined. For this purpose, a plugin named
Landscape Pro 3 was used. This plugin contains already-prepared materials for the landscape visualization and many textures, 3D models, actors, and other assets, as shown in
Figure 4.
Those were needed to visualize the land use information and procedurally generate grass, trees, rock formations, and other 3D models based on it to fill up the landscape and make it look organic, realistic, and detailed. After enabling the
Landscape Pro 3 plugin, its landscape material was applied to the imported landscape by dragging the material file from the
Content Browser plugin directory
LandscapePro_v3 > Environments > Landscape to the landscape material attribute inside the landscape actor
Details panel. This material file contains the definitions of each material layer, where each layer is made of parameters, textures, normals, masks, and functions. Those layers are then blended to create the final landscape material. Furthermore, this material file contains a
Grass Output section that, depending on what layers are blended, procedurally generates ground foliage and 3D objects on top of the landscape. After applying the material,
Layer Info must be manually created. To do so, the UE editor needs to be switched to
Landscape Mode, and then under the Paint tab, for each layer, Layer Info must be created using the Create Layer Info (the + icon next to each layer) as shown in
Figure 5.
After the
Layer Info is created, the base (first) layer will be applied to the selected landscape, which will result in textures being applied where primary terrain attributes like slope are taken into account to apply either rock or grass textures, as shown on
Figure 6, together with procedurally generated foliage matching the texture.
Unlike the base layer, all the other layers (from layer two upwards) are not applied automatically and must be applied manually or imported as raster masks. For that, each layer needs its own Layer Info to be created. If a layer is missing Layer Info, the importing feature will be greyed out, and no import will be allowed. The importing of layer masks is located under Landscape Mode in the Manage/Import tab. Each layer with Layer Info allows importing raster files as raster masks. Rasters must match specific requirements that are not readily apparent to be imported as layer masks. After all those requirements are met, the rasters can be imported as material layer masks, after which the layers are automatically applied, adding textures and generating foliage and other objects. The requirements are as follows.
The file format of the imported rasters needs to be RAW or PNG
The rasters must have a color depth of 16bit (greyscale) with unsigned values
All imported rasters need to have unique names within their directory
No auxiliary files can be present in the same folder as the imported raster
Rasters must contain an alpha channel or the file format may not be recognized
Another step in the creation of landscape visualization is filling it with content. In this case, it is vegetation and its procedural generation. This step is tightly tied with the landscape materials and material layers. The plugin used for their creation also contains procedural generation capabilities. In this case, the procedural generation of vegetation is done in two ways: globally generating ground vegetation and objects on the whole landscape and locally generating vegetation based on individual land use layers coverage.
The global procedural generation that applies to whole material layers is defined directly within the material layer. It aims to generate the vegetation that fills the entire landscape depending on the layers used. The first layer is the base (main) layer for the whole landscape. It doesn’t require location definition as the other layers do and is applied automatically after the material is assigned to the landscape. After the assignment, it applies textures and generates 3D vegetation to the landscape. The generated vegetation consists of small and tall grasses, flowers, bushes, wooden branches, and other ground foliage shown in
Figure 7, which is fully animated.
Furthermore, the vegetation placement considers the terrain slope and adjusts which and how dense vegetation will be generated. This process is fully automated and doesn’t require any further actions. This base layer can be overlayed at specified locations with the other defined layers, such as layers representing forests, whose locations are imported as land-use raster masks. If the non-base material layers are applied over the base layer, a blend of those layers is created, resulting in the generation of foliage specific to the layers blend as is defined in the Grass Output part of the material. This feature, however, is not used because of how the original land use data (vectorization created in GIS) was made. It does not contain any overlaps between individual entries, resulting in no possibility of such layers blending in UE outside the base grass layer.
To procedurally generate any of the larger objects, such as broadleaf and needle trees, rock formations, and others,
Procedural Foliage Spawner actors must be used. The spawner creates a bounding box, shown in
Figure 8a, that interacts with specific predefined material layers. This results in procedural generation being only done on top of the matching material layer and within the bounds of the bounding box. Furthermore, the spawner controls what objects will be generated, as shown in
Figure 8b. However, the
Procedural Foliage option must first be enabled in the
Editor Preferences to make procedural generation using the spawners work. Without it, the spawner actors cannot be added to the scene. Another tweaking was done within the Project Settings, where the anti-aliasing method was changed to Temporal Anti-Aliasing (TAA) to remove flickering and shimmering effects from the animated foliage to create organic, realistic, and detailed foliage as in
Figure 9.
The primary way of creating 3D models of over 28000 buildings was procedural modeling done in CityEngine, as shown in
Figure 10. However, those are not part of the input data for this case study since those models were only exported in a format compatible with ArcGIS Online at the time of their creation. Since one of this study's goals is recreating Vltava Valley's visualization, recreating those 28000 models is also needed. The easiest way to create those models again is to use CityEngine and import them, either in the *.udatasmith format or any other format supported by UE (for example, glTF). However, because the case study aims to explore the usage of GIS data within UE, another solution has been used.
CityEngine is 3D modeling software locked behind a license but has a freely downloadable software development kit,
CityEngine SDK. This C++ API allows for implementing procedural modeling, as is used within CityEngine. Based on this SDK, a plugin for UE was developed named
Vitruvio. Vitruvio is free for personal, educational, and non-commercial use; however, as input, Vitruvio requires Rule Packages (RPK), which are created in CityEngine and require a license [
27,
28]. While using Vitruvio, the procedurally created buildings stay procedural and can be changed easily with a parametric interface (height, style, and appearance). An RPK file includes assets and a CGA rule file, which encodes an architectural style.
To use Vitruvio, polygons that represent footprints of the modeled building must be imported into UE. This is done through CityEngine and Datasmith Importer. This creates Actors for each imported polygon in the project. Once the polygons are imported, a new action menu option will appear: Select all viable initial shapes in the hierarchy. This will select all Shapes within the selected Actors, which can then be converted into Vitruvio Actors with the procedural modeling functionality. Before conversion into Vitruvio Actor, the RPK file must be present within the project. To do so, the RPK file created in CityEngine must be dragged into the Content Browser. After selecting from the context menu, Convert to Vitruvio Actor and select the desired RPK file. All shapes will be converted to Vitruvio Actor, and the original polygon will be modeled into the desired shape according to the RPK file, which, in this case, will be fully textured models of buildings.
3D modeling over 21000 buildings was quick and took a couple of minutes on both tested machines. This is comparable with procedural modeling done in CityEngine. The process was also stable during the testing, and repeated importing and procedural modeling were performed on both tested machines. After converting Shapes into Vitruvio Actors, it is possible to change the attributes used for procedural modeling using the Vitruvio Actor details inside the VitruvioComponent section under Attributes. The implementation is very similar to procedural modeling inside ArcGIS Pro, which is available under polygon symbology as an option under the fill symbol layer. Both methods use CityEngine RPK files to create models procedurally based on the polygon footprint. In both cases, each will have its attributes created based on the rule file that is part of the RPK. Those attributes can be changed to edit the look of individual models. Neither of those implementations (UE or ArcGIS) allows for creating or editing the original rule file or alerting the original assets that are part of the RPK, which is limited only to CityEngine in which the rule file was created. The UE version also contains more options related to physics and material, which are unique to game engines.
The last unique step for the UE is the conversion from
Vitruvio Actors to
Static Mesh Actors. This process preserves the changes made to Vitruvio Actors and saves the procedurally modeled objects. Without this conversion, Vitruvio Actors would continue to exist until the project's closure, after which they would cease to exist, and the original shapes would need to be imported again. During the conversion of
Vitruvio Actors to
Static Mesh Actors, a process of so-called
Cooking is used. UE stores content assets in particular formats that it uses internally, such as PNG for texture data or WAV for audio. However, this content needs to be converted to different formats because the platform uses a proprietary format, does not support Unreal's format used to store the asset, or a more memory- or performance-effective format exists. The process of converting content from the internal format to the platform-specific format, together with compiling shaders, is called
cooking. This process can take longer with more complex assets (like meshes with lots of polygons, etc.) [
29]. This process is done the same way as the initial conversion, meaning that after selecting all
Vitruvio Actors in the context menu, there will be a new option:
Convert to static mesh actors. Unlike procedural modeling, this process can be volatile due to its very high hardware (memory) requirements, and the time needed is also severely longer, where finishing these conversions takes hours. Solutions to these problems are to split the number of Actors processed at a time into smaller chunks, in this case, 10000 at one time, or to increase available memory either by installing more RAM or significantly increasing the size of the system's virtual memory via increasing the page file size in Windows.
During model cooking, the CPU and memory are utilized significantly. While the CPU speeds things up, insufficient memory leads to UE crashes. Resource Monitor reveals that UE commits over 170GB of memory just for itself at the time of cooking.
Another part of the visualization is creating water bodies. To add and work with water, a plugin of the same name, Water, is used. This plugin is built into the UE and is currently in the experimental version, as shown in
Figure 11.
This plugin brings multiple types of water bodies to the UE. Still, only two are being used to visualize the Vltava Valley: Lake for modeling smaller water bodies like fish farms, water reservoirs, or ponds and
River for modeling the Vltava River and smaller streams, as shown in
Figure 12.
The simpler of the two is an Actor named Water Body Lake. This actor creates a lake defined by three Spline points with the possibility of adding additional spline points. Those spline points are connected by arc-shaped curves whose attributes can be changed using the detail panel or graphical representations of these attributes directly in the editor scene. This actor is more straightforward than a river because a lake only has one height value (the lake must be flat). Specific attributes like the speed of water flow don’t matter for small-scale water bodies, and there are significantly fewer attributes in general. By default, the lake actor contains the attribute option Affects Landscape, which allows the lake to interact with and change the landscape it is situated on. While this feature can be disabled, it must be used since the smaller water bodies for which the actor Water Body Lake is used are not modeled within the DTM. In the original datasets, they are only represented by land-use vectorizations and, consequently, by texture (only their position is known). The lack of lake bottoms in DTM and their representation only in vectorization create additional problems. Since many water bodies contained in the land use vectorizations are made of sharp angles, which are significantly harder to achieve using the spline points, it’s lengthy and complicated to match the position of the banks with the vectorization perfectly. Furthermore, the exact measurements of the bottom of those water bodies (depth, angle, etc.) are unknown, at least in the datasets used for this modeling. This results in higher creative freedom in how the water bodies are created; however, it is at the cost of historical accuracy and the accuracy of following the base GIS data, in this case, the vectorizations of old maps.
The actor named Water Body River is the more complex one. Like the lake actor, it creates a river defined by multiple spline points; however, those have many more associated attributes. Firstly, each spline point has its height (Z coordinate), making the manual creation of rivers more accurate but at the cost of the increased difficulty of working with the river actor. Furthermore, each spline point has its depth point, river width, flow orientation, and flow strength/speed. The actor Water Body River also contains the attribute option Affects Landscape; however, in the case of the Vltava River, the situation is reversed. Since the used DTM already includes the bottom of the river basin, there is no need to alert the terrain. Furthermore, doing so could lead to terrain continuity problems, where it could/would be challenging in specific spots to make the terrain changes made by the river actor unnoticeable and seamless with the original terrain. Another reason not to use the Affects Landscape option is that by not using it, the whole workflow of creating rivers can be significantly simplified. Since the water level is always lower than the surrounding terrain and the bottom of the river is already modeled within the DTM, those attributes can be made purposefully bigger to fill the river basin. This reduces the whole process of creating the river by removing the need for having to set up each single spline point with depth, width, and terrain angles to only creating the individual spline points and setting their location, which is already a significantly lengthy process considering the shape of the river and its length and the fact that the spline points are all created and positioned manually. However, a combination of both Affects Landscape options is used for creating streams according to individual stream locations and the terrain around them. Since those streams are substantially smaller than the Vltava River, using the Affects Landscape can help highlight the stream in the terrain, which is welcomed in certain situations.
After the scene is filled with content, meaning it contains the finished landscape with applied material layers according to the land use information, with procedurally generated vegetation on top of it, all the water bodies, and the procedurally modeled buildings, the last step is to package the whole scene.
Packaging a project is the final step, which allows the scene to be opened via an executable file and no longer requires UE to be installed. The first step to packaging the project is to fill out all the information in
Project Settings under
Project – Description, namely
Project Display Title (also used by the operating system), publisher information if applicable, project version, and others. Next, choosing default maps (levels) to be opened in the
Project – Maps & Models section is crucial. Lastly, the
Build Configuration needs to be set to
Shipping in the
Project- Packaging section, allowing the opening of the final packaged project without needing UE. All other settings can be changed per the individual project’s needs; however, they are left with default values for this study. After the project is set up for packaging, it can be selected from the main toolbar under the
Platforms, as shown in
Figure 13.
However, this step has excellent potential for causing errors and failure. The most straightforward errors to solve are those related to required SDKs, which can be fixed by installing and updating .NET Core 3.1, .NET 9.0, Windows SDK, and Visual Studio 2022. Another set of problems may arise from deleted and unused content within the project. The packaging process packages all levels, including any (testing) unused levels. The problem is that those usually contain invalid references to deleted content, which will cause the packaging to fail. For this reason, it is essential to “clean up” the whole project before packaging, for example, using the Content Browser filtering option Not Used In Any Level. After all those steps are completed and potential errors are resolved, the project packaging process can be completed. It is important to note that the whole packaging process takes a significant amount of time and fully utilizes the computer CPU for compiling shaders and packing the project per the chosen options in Project – Packaging within the Project Settings. After the packaging process, the application executable file and all the packaged assets are created within the selected folder. This application opens the previously set default level of the created visualization with basic movement and camera controls. Within the application, no further modifications to the visualization can be made (outside of programmed interactions); however, the project within UE can still be used and worked on, and a new version of the application can be packaged.