Skip to content
Snippets Groups Projects
README.md 12.6 KiB
Newer Older
jonathon Paden's avatar
jonathon Paden committed
# AUGMENTED REALITY NAUTILUS OBSERVATORY (ARNO) beta
<p align="center">
    <img src="https://gitlab.nrp-nautilus.io/ar-noc/arnoc-game/uploads/d07e40fefb487d05aa625edbd749b2f8/image.png" width="50%" height="50%">
</p>

Built upon the [Pacific Research Platform (PRP)](https://pacificresearchplatform.org/) network, UC San Diego’s [Clarke Center for Human Imagination](http://imagination.ucsd.edu/) and the [Qualcomm Institute](https://qi.ucsd.edu/) are developing server-side rendering tools and deployment of Unreal-based game experience to scale the Metaverse AR/VR hardware needs into a distributed system, enabling a campus-wide XR test bed as part of developing a global Extended Reality Network Operations Center (XRNOC) networking visualization system. XRNOC represents the third generation of big data visualization, realized through persistent, procedurally rendered simulations produced from live data at global scale via Epic Game’s [Unreal Engine](https://www.unrealengine.com/en-US/).

[Learn more about Nautilus](https://ucsd-prp.gitlab.io/) <br />
> "Nautilus is a HyperCluster for running containerized Big Data Applications. It is using Kubernetes for managing and scaling containerized applications and Rook for automating Ceph data services."


For more information on this pioneering research and how to support it, please contact us at info@imagination.ucsd.edu

## How to run Holographic Remote Streaming on Windows
- Grab the latest x64-Release Package https://gitlab.nrp-nautilus.io/ar-noc/ARNoc-Alpha/-/releases
- Run the Holographic Remoting app on the Hololens and take note of the IP.
- Edit `HoloLensRemoting=<Hololens IP>` inside arnocMain_HLRemotingJoinServer.bat
- Run batch script to join dedicated server and connect with Holographic Remoting. 

## How to get started developing (Windows)
### Project Setup
0. Install [Git](https://git-scm.com/downloads) and [Git LFS](https://git-lfs.github.com/) <br />
    a. "You'll only need to run **git lfs install** once. Once initialized for your system, Git LFS will bootstrap itself automatically when you clone a repository containing Git LFS content."
1. [Setup Unreal Engine 5.0.1](https://docs.unrealengine.com/5.0/en-US/installing-unreal-engine/)
2. [Install Visual Studio 2019](https://docs.unrealengine.com/5.0/en-US/setting-up-visual-studio-development-environment-for-cplusplus-projects-in-unreal-engine/) <br />
    a. C++ profiling tools <br />
    b. C++ AddressSanitizer (optional) <br />
    c. Windows 10 SDK (10.0.18362 or Newer)

Nicholas Nakano's avatar
Nicholas Nakano committed
3. **RClone Initialization**<br />
    a. Download and move arno-init.sh into an appropriate location—it will initialize the ARNOBeta repository in the same directory.<br /><br />
    b. If you have access to the keys submodule (aka a member of the ARNO Team) run the command **git submodule update --init --recursive** to initialize the appropriate submodule. If not, you will have to enter the keys manually when running arno-init.sh.<br /><br />
    c. Run arno-init.sh with administrator privileges.<br /><br />
    d. Initialization<br /><br />
        **Windows**<br />
            1) Open the start menu and run Git Bash as administrator.<br />
            2) Navigate to the arno-init.sh directory using “cd”.<br />
            3) Run “./arno-init.sh”.<br /><br />
        **macOS / Linux**<br />
            1) Open a Terminal as administrator.<br />
            2) Navigate to the arno-init.sh directory using “cd”<br />
            3) Run “./arno-init.sh”.<br /><br />
    e. Now, the script will install RClone on your system and set up a configuration to connect with ARNO’s S3 Bucket using the provided key file. If you do not have the key file, it will prompt you to input them manually.<br /><br />
    f. Let the script run to completion and follow any instructions. You should now have a working repository for development and can proceed to the next step.<br />
Nicholas Nakano's avatar
Nicholas Nakano committed

5. Generate Visual Studio Project files.

<img src="/uploads/36431ac9ce5199b6937cb1457b1394ac/image.png" width=40% height=40%>

Nicholas Nakano's avatar
Nicholas Nakano committed
6. Open arnocMain.sln in Visual Studio.
Nicholas Nakano's avatar
Nicholas Nakano committed
7. Set as Startup Project.

<img src="/uploads/7ada0c17be01667eea6a730cfdd7a583/image.png" width=40% height=40%>

8. Set toolbar to desired target ```<Development Editor> <Platform (i.e Win64)>```. Right click arnocMain and Build.

<img src="/uploads/93f3c53962496bb713c44567d8ecebe8/image.png" width=40% height=40%>

9. Open the arnocMain.uproject in Unreal Engine 5 editor.

### Unreal Engine
0. [Getting Started with Unreal Engine](https://learn.unrealengine.com/home/LearningPath/90588)
2. [Blueprint Learning Path](https://learn.unrealengine.com/home/LearningPath/90587)
3. [User Interfaces with UMG Quickstart](https://learn.unrealengine.com/course/3061301)
4. [Cesium for Unreal Tutorials](https://cesium.com/learn/unreal/)

### ARNO Project Tutorials
- [Using a Revit Survey Point geolocation with Cesium for Unreal](https://gitlab.nrp-nautilus.io/ar-noc/ARNoc-Alpha/-/wikis/Using%20a%20Revit%20Survey%20Point%20geolocation%20with%20Cesium%20for%20Unreal)
- [Google Earth to Cesium ion to Cesium for Unreal workflow](https://gitlab.nrp-nautilus.io/ar-noc/ARNoc-Alpha/-/wikis/Google%20Earth%20to%20Cesium%20ion%20to%20Cesium%20for%20Unreal%20workflow)
- [Snapping Revit Models onto 3D Tile Twin](https://gitlab.nrp-nautilus.io/ar-noc/ARNoc-Alpha/-/wikis/Snapping%20Revit%20Models%20onto%203D%20Tile%20Twin) 

# Unreal Project Structure
> A continuation of the [ue4-data-viz](https://gitlab.nrp-nautilus.io/ar-noc/ue4-data-viz), [ue4-earth](https://gitlab.nrp-nautilus.io/ar-noc/UE4-Earth), and [ue4-data-h2](https://gitlab.nrp-nautilus.io/ar-noc/ue4-data-h2) repositories, integrated and extended to Unreal Engine 4.26. As of SP22 the project was migrated to UE5 and began to leverage the CollabViewer and HololensViewer Unreal Project templates to quickly bootstrap a foundation for Cross-Platform Desktop/VR/AR/PixelStreaming Multiplayer across Windows and Linux. Android and Mac are not supported. In addition, the Redpoint Games EOS plugin was chosen to expediate development of online services commonly found in multiplayer games. However, it's not yet implemented.     

[CollabViewer](https://docs.unrealengine.com/5.0/en-US/collab-viewer-templates-in-unreal-engine/)

> The Collab Viewer Templates join multiple people together in a shared experience of the same 3D content. They are intended to make it easier and quicker for your team to review and communicate about designs in realtime, so that you can identify problems and iterate on the content more efficiently.

[HololensViewer](https://docs.unrealengine.com/5.0/en-US/hololens-viwer-template-in-unreal-engine/)

> The HoloLens Viewer Template is an adaptation of the Collab Viewer Template that works on the Microsoft HoloLens 2. You can use it to see your 3D content overlaid on your actual surroundings in the HoloLens viewer. You can also interact with your models, moving them around and annotating them in real-world space. 

[EOS Online Subsystem](https://docs.redpoint.games/eos-online-subsystem/docs/)

> Connect players with their friends across all platforms and all stores using Epic’s free, shared account services. Players can log in using accounts from PlayStation, Xbox, Switch, Facebook, Google, Apple, Steam, and Epic.

> Access free services including voice chat, achievements, matchmaking, live ops, and more. Game services support all platforms, all stores, and all identity services—including your own or Epic’s—on the engine of your choice.

## Level: NOC_withCesium (Multiplayer)
Purpose: Initial Environment to test Cross-Platform Multiplayer Framework along with UI/UX support for Desktop/VR/AR/PixelStreamer users. A Collaborative space that persistently updates several data visualization outlined below. The _withCesium derivative focus on integrating [Project Anywhere XR](https://www.unrealengine.com/en-US/blog/introducing-project-anywhere-xr-a-free-sample-project-for-mixed-reality-3d-geospatial-visualization) into the NOC.

<img src="/uploads/74519629ab36b485cabd936510c9c1be/image.png" width="50%" height="50%">

### G2
see [DataViz_README.md](https://gitlab.nrp-nautilus.io/ar-noc/ARNoc-Alpha/-/blob/main/DataVis_README.md)
### Netbox
### Cesium

## Level: Earth (Persistent Level) 
Purpose: Create the Cesium Plugin Features (e.g World Terrain, Gamemode, Sunlight, etc)

<img src="/uploads/e2a3510aee4118e3ca1c97b57993db97/image.png" width="50%" height="50%">

[World Composition](https://docs.unrealengine.com/4.26/en-US/BuildingWorlds/LevelStreaming/WorldBrowser/) with [streaming sublevels](https://docs.unrealengine.com/4.26/en-US/Basics/Levels/) is used with cesium to [Build Global Scenes with Georeferenced Sublevels](https://cesium.com/learn/unreal/unreal-sublevels/) for Earth (Persistent Level). 

For the XRNOC Application a sublevel will generally encapsulate a Revit Datasmith Architectural Asset (e.g AtkinsonsHall, Geisel, SDSC, etc) that is streamed in/out as described by the "Georeferenced Sublevels" tutorial above. Within the Datasmith Model several Netbox Sites may be procedurally generated via `Event BeginPlay` inside BP_NetboxGeneration_Cesium.

## Sublevels: Sites (Streaming Sublevels)

Purpose: Modulerize Implementation of new Facilities and provide functionality for asynchronous level streaming during runtime.

### Atkinson Hall (Sublevel)

<img src="/uploads/fec871c7f2649948ad433da0e07f2426/Atkinson_Hall__Small_.png" width="50%" height="50%">

### San Diego Supercomputer Center (SDSC) (Sublevel)
<img src="/uploads/44fdf5b397d4c3de8404e154f821b387/San_Diego_Supercomputer_Center__Small_.png" width="50%" height="50%">

### Geisel Library (Sublevel)	
<img src="/uploads/4dfb04ea961ab465d4a7744873745de1/Geisel_Library__Small_.png" width="50%" height="50%">

### Design and Innovation Building (Sublevel)
<img src="/uploads/7717d33030461229abc5a61f6a3ff817/Design_and_Innovation_Building__Small_.png" width="50%" height="50%">

### Franklin Antonio Hall (Sublevel)
<img src="/uploads/efd712833a3f3769f287c38321ccfd56/Franklin_Antonio_Hall__Small_.png" width="50%" height="50%">

### Visual Arts Facility (Sublevel)
<img src="/uploads/622c831ca138e3eb40373e2b45b27eda/Visual_Arts_Facility__Small_.png" width="50%" height="50%">

### Mandeville Center (Sublevel)
<img src="/uploads/7cc4bcec63f84fe9c1a42300df556959/Mandeville_Center__Small_.png" width="50%" height="50%">

## Navigating Cluster Visualization States

### Level 1 (Earth View):

### Level 2 (Regional View):

### Level 3 (County View):

### Level 4 (Ground View):

### Level 5 (Data Center View):


## Blueprints
### BP_Tracegraph_Cesium
Purpose: Visualization of network trace routes as a graph on a 3D globe Earth. Meant to be an overview of the entire network and highlight points of interest for admins to look in to.

All data is loaded via REST APIs at runtime. See [datautils > kubeless > ue4-data.py](https://gitlab.nrp-nautilus.io/ar-noc/datautils/-/blob/master/kubeless/ue4-data.py).
- Request is sent to the datautils kubeless function
- Receives a JSON containing the trace graph in a nice format for parsing in Unreal
- In the request body, `aggregate` can be set to 'none', 'location', or 'router' -- this will collapse the graph so that all nodes in the same e.g. location will be collapsed into a single node. Useful to reduce visual clutter
- All of this stuff, like aggregation, is being worked on in the datautils repo
- [VaRest](https://github.com/ufna/VaRest/) is used to perform these requests and parse the JSON.

The trace graph nodes are then procedurally generated inside of Unreal.
- For every node (both primary and hop IPs), a unique actor is spawned and added to an internal hash map variable
- This allows future reference or modification of the actor by specifying an IP address.
- The glyphs representing each node point orthogonal to the planet surface

The trace graph edges are then procedurally generated inside of Unreal.
- For every edge, get the actors for the two connected IPs from the hash map we built earlier
- We can use those actors and get their positions (in local coordinates), then spawn a spline between those positions
- These splines connect as a straight line -- passing through the earth or wrap around the earth.
- You can edit the spline length variable inorder to change the number spline points there are for each traceroute. 
    - Increasing spline length will help to make the wrap smoother, but will take more processing.
    - Currently the best setting for spline lengths are lengths 1(pass through earth) and 2(wrap around earth). The tangent at the midpoint is altered  give the route more bend, so increasing the spline length without taking out the tangent change will create a handle bar shape. 
- Using the data attributes, we color the edge red if the MTU is less than 9000 and green otherwise