Skip to content
Snippets Groups Projects
Commit 5b7a70fc authored by Florian Kern's avatar Florian Kern
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
Showing
with 430 additions and 0 deletions
# This .gitignore file should be placed at the root of your Unity project directory
#
# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
#
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Uu]ser[Ss]ettings/
# MemoryCaptures can get excessive in size.
# They also could contain extremely sensitive data
/[Mm]emoryCaptures/
# Asset meta data should only be ignored when the corresponding asset is also ignored
!/[Aa]ssets/**/*.meta
# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*
# Autogenerated Jetbrains Rider plugin
/[Aa]ssets/Plugins/Editor/JetBrains*
# Visual Studio cache directory
.vs/
.vscode/
# Gradle cache directory
.gradle/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db
# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta
# Unity3D generated file on crash reports
sysinfo.txt
# Builds
*.apk
*.aab
*.unitypackage
# Crashlytics generated file
crashlytics-build.properties
# Packed Addressables
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
# Temporary auto-generated Android Assets
/[Aa]ssets/[Ss]treamingAssets/aa.meta
/[Aa]ssets/[Ss]treamingAssets/aa/*
# Visual Studio
.vscode/
.vsconfig
# Rider
.idea/
# Ignore auto-generated XR because these are per-end user settings
/Assets/XR/
/Assets/XR.meta
# MacOS
.DS_Store
# Packages sample directory
/Samples
/Samples.meta
# Other
/[Rr]ecordings/
Copyright (c) 2024 Julius-Maximilians-Universität Würzburg, Germany
----
MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
\ No newline at end of file
fileFormatVersion: 2
guid: 5bcda76c64684d44096343ff6ebda0a0
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
# Welcome to Reality Stack I/O
Reality Stack I/O (RSIO) is an intermediate layer that implements native manufacturer SDKs and the OpenXR standard. RSIO supports head, controller, hand, and eye tracking, as well as passthrough capabilities. It addresses the challenges of cross-device and cross-platform compatibility, allowing researchers and developers to focus on creating XR experiences rather than managing system integration. RSIO consists of several Unity packages to support different XR devices, with examples demonstrating the framework's capabilities.
RSIO is free and open source, licensed under the [MIT-License](LICENSE.md).
# Scientific Reference
If you use RSIO for scientific work, please cite the following [publication](https://doi.org/10.1109/ISMAR-Adjunct60411.2023.00023):
BibTex reference:
````latex
@INPROCEEDINGS{10322199,
author={Kern, Florian and Latoschik, Marc Erich},
booktitle={2023 IEEE International Symposium on Mixed and Augmented Reality Adjunct (ISMAR-Adjunct)},
title={Reality Stack I/O: A Versatile and Modular Framework for Simplifying and Unifying XR Applications and Research},
year={2023},
volume={},
number={},
pages={74-76},
doi={10.1109/ISMAR-Adjunct60411.2023.00023}}
````
# Contact
If you have any questions, feel free to contact us at [realitystack@uni-wuerzburg.de](mailto:realitystack@uni-wuerzburg.de)
University of Wuerzburg<br>
Chair for Human-Computer Interaction<br>
Prof. Dr. Marc Erich Latoschik<br>
[https://hci.uni-wuerzburg.de/](https://hci.uni-wuerzburg.de/)
University of Wuerzburg<br>
Group of Psychologie Intelligenter Interaktiver Systeme<br>
Prof. Dr. Carolin Wienrich<br>
[https://www.mcm.uni-wuerzburg.de/piis/](https://www.mcm.uni-wuerzburg.de/piis/)
# Supported Unity Environments
RSIO was developed with Unity 2022.3.17f1 for Windows and Android platforms. We use the Universal Render Pipeline (URP).
# Quick Start
- Install Unity 2022.3 with Android support
- Create a Universal 3D Core project with Unity 2022.3 or use clone our sample project
- Open `Preferences -> External Tools` and check `Git packages`
- `Project Settings -> Player -> ActiveInputHandling` and select `Both`
- Open `Project Settings -> Player` and select the third horizontal tab `Android`
- Change `Graphics API` to `OpenGLES3` and disable `Auto Graphics API`
- Uncheck `Override Default Package Name`, and enter a package name
- Select `IL2CPP`
- Select `ARM64`
- Open the `Assets/Packages` folder
- Clone the `UnityExtensions` repository
- Clone the `io-base` repository
- Clone this repository and follow the instructions below
# Desktop Package
The package provides a mouse and keyboard implementation for developing without XR devices.
Please follow these steps to setup this package:
- Locate the `Project Folder View`.
- Open `Runtime -> Prefabs` and copy the `DesktopPlugin` to the scene.
- Disable all XR Plugins within `Project Settings -> XR Plug-in Management`.
- Open `Project Settings -> XR Plug-in Management` and disable all XR plugins.
- Rotate the camera by arrow keys or move the mouse while press and hold the right mouse button.
\ No newline at end of file
fileFormatVersion: 2
guid: 50a3ecaa4e07b874e95ee0da2e57df2e
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: c993cf434fcd34553bac3d2b71f92557
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 3c0646e03b80f44dc80cf562ae89db16
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
This diff is collapsed.
fileFormatVersion: 2
guid: e675b8ad2d9fd42b1a3844a46d82b8ae
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
{
"name": "RealityStack.IO.Desktop",
"rootNamespace": "",
"references": [
"GUID:7bd9bfc6311a840f79b34120d49c7751"
],
"includePlatforms": [
"Android",
"Editor",
"macOSStandalone",
"WindowsStandalone64"
],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}
\ No newline at end of file
fileFormatVersion: 2
guid: 5b34be998aa45431f93bd054612d65ca
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 6c646839f2eac41d198c07cfa94f7b1e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
namespace RealityStack.IO.Desktop
{
public class CameraScreenPointToRayFollow : MonoBehaviour
{
[SerializeField]
private Camera cam;
private void Update()
{
Look();
}
private void Look()
{
if (!cam)
return;
var ray = cam.ScreenPointToRay(Input.mousePosition);
transform.position = ray.origin;
transform.forward = ray.direction;
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: b90f9c2ca6451419d87747a48e9b036c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using RealityStack.IO.Base;
namespace RealityStack.IO.Desktop
{
public class DesktopControllerTracking : ControllerTracking
{
public override bool IsAvailable()
{
return true;
}
public override bool IsAvailable(XRSource xrSource)
{
return true;
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: caf479e9fd9227f4f986067f5c5b08a2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using RealityStack.IO.Base;
using UnityEngine;
namespace RealityStack.IO.Desktop
{
public class DesktopEyeTracking : EyeTracking
{
private void Start()
{
}
public override bool IsAvailable()
{
return true;
}
public override DateTime GetLastCaptureTime()
{
return DateTime.Now;
}
public override bool IsEyeOpennessValid(XRSource xrSource)
{
return true;
}
public override float GetEyeOpennessConfidence(XRSource xrSource)
{
return 1f;
}
public override float GetEyeOpenness(XRSource xrSource)
{
return 1f;
}
public override bool IsEyeGazeValid(XRSource xrSource)
{
return true;
}
public override float GetEyeGazeConfidence(XRSource xrSource)
{
return 1f;
}
public override Vector3 GetEyeGazeForwardLocal(XRSource xrSource)
{
return (xrSource == XRSource.Left ? leftEye.localRotation : rightEye.localRotation) * Vector3.forward;
}
public override Vector3 GetEyeGazeForward(XRSource xrSource)
{
return xrSource == XRSource.Left ? leftEye.forward : rightEye.forward;
}
public override void RequestEyeCalibration()
{
Debug.Log("Not available for desktop");
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: e75b44a50d0754069b55be141e2c8d95
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using RealityStack.IO.Base;
namespace RealityStack.IO.Desktop
{
public class DesktopPlugin : Plugin
{
protected override void Update()
{
base.Update();
if (IsAvailable() && GetDevice() == Device.Unknown)
UpdateDevice(Device.Desktop);
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 1d5f1ff3ddd0941bbbf0966e1ba5bff3
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment