add package files

This commit is contained in:
VR164000
2023-06-15 09:52:08 +08:00
parent 06d41412be
commit a0b3b91879
382 changed files with 44971 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e3b50201243972949bd077c1e0aff72c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,54 @@
using UnityEditor;
using UnityEditor.XR.OpenXR.Features;
using UnityEngine;
using UnityEngine.XR.OpenXR;
using System;
using System.Linq;
using System.Reflection;
using System.IO;
using VIVE.HandTracking;
using UnityEngine.XR.OpenXR.Features;
namespace UnityEditor.XR.OpenXR.Samples.HandTracking
{
[InitializeOnLoad]
public class HandTrackingFeauterInstaller : Editor
{
#if !UNITY_SAMPLE_DEV
private const string k_ScriptPath = "HandTracking Example/Editor/HandTrackingFeauterInstaller.cs";
static HandTrackingFeauterInstaller()
{
FeatureHelpers.RefreshFeatures(BuildTargetGroup.Standalone);
var feature = OpenXRSettings.Instance.GetFeature<HandTracking_OpenXR_API>();
var HandInteractionfeature = OpenXRSettings.Instance.GetFeature<HtcViveHandInteractionInputFeature>();
if (feature != null)
{
if (feature.enabled != true)
{
feature.enabled = true;
}
}
if (HandInteractionfeature != null)
{
if (HandInteractionfeature.enabled != true)
{
HandInteractionfeature.enabled = true;
}
}
Debug.Log(AssetDatabase.FindAssets(Path.GetFileNameWithoutExtension(k_ScriptPath)).Select(AssetDatabase.GUIDToAssetPath));
var source = AssetDatabase.FindAssets(Path.GetFileNameWithoutExtension(k_ScriptPath))
.Select(AssetDatabase.GUIDToAssetPath)
.FirstOrDefault(r => r.Contains(k_ScriptPath));
if (string.IsNullOrEmpty(source))
{
Debug.LogError("File Not Exist");
return;
}
source = Path.GetDirectoryName(source);
Debug.Log(source);
AssetDatabase.DeleteAsset(Path.Combine(Path.GetDirectoryName(source), "Editor"));
}
#endif
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 25c6b0688a353874791039a7510e9003
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,182 @@
{
"name": "HandInteractions",
"maps": [
{
"name": "LeftHand",
"id": "9ef2cbaf-c5ca-4f94-afd3-c13e92ae39b0",
"actions": [
{
"name": "select",
"type": "Value",
"id": "9f7476ef-5e86-4fbd-be2a-d191fcd6bd90",
"expectedControlType": "Axis",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "grip",
"type": "Value",
"id": "58e87055-a7f7-49e5-874c-ed1531b2fc73",
"expectedControlType": "Axis",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "selectPose",
"type": "Value",
"id": "2427c326-992b-4b5e-8b32-65766a69b9f6",
"expectedControlType": "Pose",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "devicePose",
"type": "Value",
"id": "14167057-a039-4b71-b169-ae012bc4f26b",
"expectedControlType": "Pose",
"processors": "",
"interactions": "",
"initialStateCheck": true
}
],
"bindings": [
{
"name": "",
"id": "b403b14a-c930-45f9-9a3e-2710e4721344",
"path": "<ViveHandInteraction>{LeftHand}/select",
"interactions": "",
"processors": "",
"groups": "",
"action": "select",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "ae0a8fd0-79a3-4996-8334-0c00727c214a",
"path": "<ViveHandInteraction>{LeftHand}/grip",
"interactions": "",
"processors": "",
"groups": "",
"action": "grip",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "86a6d936-0c97-411d-81bd-f07526f0fd2d",
"path": "<ViveHandInteraction>{LeftHand}/pointer",
"interactions": "",
"processors": "",
"groups": "",
"action": "selectPose",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "fc0059b7-df77-4d61-9aff-2ca9cd129ca0",
"path": "<ViveHandInteraction>{LeftHand}/devicePose",
"interactions": "",
"processors": "",
"groups": "",
"action": "devicePose",
"isComposite": false,
"isPartOfComposite": false
}
]
},
{
"name": "RightHand",
"id": "052ff2d7-a697-4084-a818-72ef080c524d",
"actions": [
{
"name": "select",
"type": "Value",
"id": "9939050e-1af5-43fd-815b-92041d19b3fa",
"expectedControlType": "Axis",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "grip",
"type": "Value",
"id": "de49cd41-9a9a-429c-9130-f794cb429550",
"expectedControlType": "Axis",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "selectPose",
"type": "Value",
"id": "60fe8382-aa5a-4fd9-80cf-6ecc68f90863",
"expectedControlType": "Pose",
"processors": "",
"interactions": "",
"initialStateCheck": true
},
{
"name": "devicePose",
"type": "Value",
"id": "192485c2-2d24-495b-8deb-14f2e327a887",
"expectedControlType": "Pose",
"processors": "",
"interactions": "",
"initialStateCheck": true
}
],
"bindings": [
{
"name": "",
"id": "9ff68142-4e5e-4d24-aed3-a377c8b74534",
"path": "<ViveHandInteraction>{RightHand}/select",
"interactions": "",
"processors": "",
"groups": "",
"action": "select",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "23ee2cda-2db6-4e45-b13a-259aabd637f1",
"path": "<ViveHandInteraction>{RightHand}/grip",
"interactions": "",
"processors": "",
"groups": "",
"action": "grip",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "34315523-7e62-43c9-84fc-35cea4259fe5",
"path": "<ViveHandInteraction>{RightHand}/pointer",
"interactions": "",
"processors": "",
"groups": "",
"action": "selectPose",
"isComposite": false,
"isPartOfComposite": false
},
{
"name": "",
"id": "4070b955-5c40-46fa-98c5-4c71f99cb6c6",
"path": "<ViveHandInteraction>{RightHand}/devicePose",
"interactions": "",
"processors": "",
"groups": "",
"action": "devicePose",
"isComposite": false,
"isPartOfComposite": false
}
]
}
],
"controlSchemes": []
}

View File

@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: 080a38524d6ab064e91f8ff9cd45bb9b
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3}
generateWrapperCode: 0
wrapperCodePath:
wrapperClassName:
wrapperCodeNamespace:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1b77d0ecc04d7584bb867772441f7c25
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,77 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Blue
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0, g: 0, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d3293c07c46938149bd6b68f6f5ab4d1
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,87 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Default
m_Shader: {fileID: 10760, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UVSec: 0
- _UseUIAlphaClip: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0.098039195, g: 0.50673795, b: 0.65882355, a: 0.3137255}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _Specular: {r: 1, g: 0.4481132, b: 0.4481132, a: 0}
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9513f1085c3b8d84ab17245d74043608
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,77 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Green
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 0, g: 1, b: 0, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: be5bedb9f42770549af7600305d316fd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,86 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Hand
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UVSec: 0
- _UseUIAlphaClip: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4637b99291c9e1d4b82124a21a34acbc
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,102 @@
fileFormatVersion: 2
guid: 9a01667fc6435cb479a0445610133fcc
ModelImporter:
serializedVersion: 21100
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,102 @@
fileFormatVersion: 2
guid: afa96e79b5b79984ab74e9e1ef200d57
ModelImporter:
serializedVersion: 21100
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,77 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Red
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 0, b: 0, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 130cd327cb69f5c4ab2bcdb608fbd58c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,77 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: White
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _UVSec: 0
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5daffd924f4d0494c83ce461ca913878
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9ae1b41407a2d734c96ed160efbc06d2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,101 @@
fileFormatVersion: 2
guid: fa14a214e9ffb1a42850851e0ad9db52
ModelImporter:
serializedVersion: 20101
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 1
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
motionNodeName:
rigImportErrors:
rigImportWarnings:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 3
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 0
importLights: 0
fileIdsGeneration: 1
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 061f4195e1dc74e4e8cf7f657203e2cd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,541 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &7423157989283898626
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7423157989283898627}
m_Layer: 0
m_Name: 3DHand
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7423157989283898627
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7423157989283898626}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.015607998, y: -0.013282664, z: -0.07335153}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6957748758881164380}
- {fileID: 6957748757999106292}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &7423157989289999287
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 7423157989283898627}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_RootOrder
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalPosition.x
value: 0.015607998
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalPosition.y
value: 0.013282664
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalPosition.z
value: 0.07335153
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: -1107956732406458091, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_Materials.Array.data[0]
value:
objectReference: {fileID: 2100000, guid: 9513f1085c3b8d84ab17245d74043608, type: 2}
- target: {fileID: 919132149155446097, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_Name
value: ObjModelHandLeft_26
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
--- !u!4 &1023837832511550131 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -1643464455024064252, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1517851468531354918 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8220238113505965713, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1587043492754875532 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8143094687746776891, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1822319482427487084 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 9101342973431810267, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2129234081217865112 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8829542094526668335, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2402645123296224636 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 5067591772060704459, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2591330329871673071 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4968064022332693848, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2877863616158530621 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4680475222046787466, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &3886056980242657624 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -3248688629254337809, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &3923137174990642617 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 5869758926971069966, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4176209744140450023 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6841172885717877584, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4227981583638641158 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -2474565242041466447, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4315334464559039638 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6694459045059854113, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4518116779036985979 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6464857450473386444, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4655153904485345964 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -6368592266354454245, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &5633725182928596562 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 2966563632883308005, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &5751558732041407126 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 2942538225671237921, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &5847509038455621992 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 3900922814075712223, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &6366441487635361211 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -4657146349703457268, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!1 &6673696290973803778 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 4294711893310725813, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &6957748758881164380 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7007883643249497524 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8771503716632908285, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7113238653529847310 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 410696192037670329, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7125949936140118471 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 423390500807168624, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7402668014366828115 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -9097317933092135452, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!1 &7765669265330833126 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7423157989402685039
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7765669265330833126}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c19189c6a6028a74ab475048ebd154c8, type: 3}
m_Name:
m_EditorClassIdentifier:
nodes:
- {fileID: 5847509038455621992}
- {fileID: 1517851468531354918}
- {fileID: 4227981583638641158}
- {fileID: 2591330329871673071}
- {fileID: 7007883643249497524}
- {fileID: 2129234081217865112}
- {fileID: 9190276837785830995}
- {fileID: 4518116779036985979}
- {fileID: 8951308887720329310}
- {fileID: 7113238653529847310}
- {fileID: 7402668014366828115}
- {fileID: 4655153904485345964}
- {fileID: 7929466683079983724}
- {fileID: 4176209744140450023}
- {fileID: 5751558732041407126}
- {fileID: 1822319482427487084}
- {fileID: 6366441487635361211}
- {fileID: 2877863616158530621}
- {fileID: 3886056980242657624}
- {fileID: 1023837832511550131}
- {fileID: 4315334464559039638}
- {fileID: 3923137174990642617}
- {fileID: 7125949936140118471}
- {fileID: 5633725182928596562}
- {fileID: 2402645123296224636}
- {fileID: 1587043492754875532}
isLeft: 1
allowUntrackedPose: 1
Hand: {fileID: 6673696290973803778}
MotionType: 2147483647
--- !u!4 &7929466683079983724 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8570555479703635493, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &8951308887720329310 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -7260599894360605719, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!4 &9190276837785830995 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -7453960083844481564, guid: 9a01667fc6435cb479a0445610133fcc, type: 3}
m_PrefabInstance: {fileID: 7423157989289999287}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &7423157990146891551
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
m_TransformParent: {fileID: 7423157989283898627}
m_Modifications:
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_RootOrder
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalPosition.x
value: 0.015607998
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalPosition.y
value: 0.013282664
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalPosition.z
value: 0.07335153
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalRotation.x
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalRotation.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalRotation.z
value: -0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_Name
value: ObjModelHandRight_26
objectReference: {fileID: 0}
- target: {fileID: 919132149155446097, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_IsActive
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7227333814368855109, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
propertyPath: m_Materials.Array.data[0]
value:
objectReference: {fileID: 2100000, guid: 9513f1085c3b8d84ab17245d74043608, type: 2}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
--- !u!4 &1023837833795835419 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -1643464455024064252, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1517851467915504014 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8220238113505965713, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1587043491765714980 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8143094687746776891, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1822319483682314180 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 9101342973431810267, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2129234081841414448 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8829542094526668335, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2402645124683137492 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 5067591772060704459, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2591330330460226119 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4968064022332693848, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &2877863616882874517 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 4680475222046787466, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &3886056978715186672 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -3248688629254337809, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &3923137175738595601 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 5869758926971069966, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4176209743526845519 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6841172885717877584, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4227981582215536302 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -2474565242041466447, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4315334463274852414 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6694459045059854113, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4518116778316803795 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6464857450473386444, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &4655153903869513220 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -6368592266354454245, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!1 &5402561904108644855 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 3313976086554670824, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &5633725184492227322 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 2966563632883308005, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &5751558732801289790 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 2942538225671237921, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &5847509039486725568 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 3900922814075712223, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &6366441486206486803 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -4657146349703457268, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &6957748757999106292 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7007883642229584156 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8771503716632908285, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7113238654822912678 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 410696192037670329, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7125949935415725423 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 423390500807168624, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &7402668015651537659 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -9097317933092135452, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!1 &7765669264174080590 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7423157990786583661
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7765669264174080590}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c19189c6a6028a74ab475048ebd154c8, type: 3}
m_Name:
m_EditorClassIdentifier:
nodes:
- {fileID: 5847509039486725568}
- {fileID: 1517851467915504014}
- {fileID: 4227981582215536302}
- {fileID: 2591330330460226119}
- {fileID: 7007883642229584156}
- {fileID: 2129234081841414448}
- {fileID: 9190276836226818811}
- {fileID: 4518116778316803795}
- {fileID: 8951308886156731638}
- {fileID: 7113238654822912678}
- {fileID: 7402668015651537659}
- {fileID: 4655153903869513220}
- {fileID: 7929466684471142084}
- {fileID: 4176209743526845519}
- {fileID: 5751558732801289790}
- {fileID: 1822319483682314180}
- {fileID: 6366441486206486803}
- {fileID: 2877863616882874517}
- {fileID: 3886056978715186672}
- {fileID: 1023837833795835419}
- {fileID: 4315334463274852414}
- {fileID: 3923137175738595601}
- {fileID: 7125949935415725423}
- {fileID: 5633725184492227322}
- {fileID: 2402645124683137492}
- {fileID: 1587043491765714980}
isLeft: 0
allowUntrackedPose: 1
Hand: {fileID: 5402561904108644855}
MotionType: 2147483647
--- !u!4 &7929466684471142084 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -8570555479703635493, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &8951308886156731638 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -7260599894360605719, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}
--- !u!4 &9190276836226818811 stripped
Transform:
m_CorrespondingSourceObject: {fileID: -7453960083844481564, guid: afa96e79b5b79984ab74e9e1ef200d57, type: 3}
m_PrefabInstance: {fileID: 7423157990146891551}
m_PrefabAsset: {fileID: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9717c3a8fd1feb14a866c93d1d5cecc0
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,665 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2910298151769479246
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8964967576903015174}
- component: {fileID: 8595007410106638205}
- component: {fileID: 3652344773145504640}
m_Layer: 0
m_Name: Z-Positive
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8964967576903015174
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2910298151769479246}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0.11}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &8595007410106638205
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2910298151769479246}
m_Mesh: {fileID: 3613567641014311022, guid: fa14a214e9ffb1a42850851e0ad9db52, type: 3}
--- !u!23 &3652344773145504640
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2910298151769479246}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: d3293c07c46938149bd6b68f6f5ab4d1, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &4346727372943234171
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4346727372943234170}
- component: {fileID: 4346727372943234167}
- component: {fileID: 4346727372943234164}
- component: {fileID: 4346727372943234165}
m_Layer: 0
m_Name: XAxis
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4346727372943234170
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372943234171}
m_LocalRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.005, y: 0.1, z: 0.005}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90}
--- !u!33 &4346727372943234167
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372943234171}
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &4346727372943234164
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372943234171}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 130cd327cb69f5c4ab2bcdb608fbd58c, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!136 &4346727372943234165
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372943234171}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
m_Radius: 0.5000001
m_Height: 2
m_Direction: 1
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
--- !u!1 &4346727372952809594
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4346727372952809589}
- component: {fileID: 4346727372952809590}
- component: {fileID: 4346727372952809591}
- component: {fileID: 4346727372952809588}
m_Layer: 0
m_Name: YAxis
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4346727372952809589
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372952809594}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.005, y: 0.1, z: 0.005}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &4346727372952809590
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372952809594}
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &4346727372952809591
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372952809594}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: be5bedb9f42770549af7600305d316fd, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!136 &4346727372952809588
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727372952809594}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
m_Radius: 0.5000001
m_Height: 2
m_Direction: 1
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
--- !u!1 &4346727373368105286
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4346727373368105281}
- component: {fileID: 4346727373368105282}
- component: {fileID: 4346727373368105283}
- component: {fileID: 4346727373368105280}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4346727373368105281
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373368105286}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.02, y: 0.02, z: 0.02}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &4346727373368105282
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373368105286}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &4346727373368105283
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373368105286}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!65 &4346727373368105280
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373368105286}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!1 &4346727373925079743
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4346727373925079742}
- component: {fileID: 4346727373925079739}
- component: {fileID: 4346727373925079736}
- component: {fileID: 4346727373925079737}
m_Layer: 0
m_Name: ZAxis
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4346727373925079742
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373925079743}
m_LocalRotation: {x: 0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.005, y: 0.1, z: 0.005}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0}
--- !u!33 &4346727373925079739
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373925079743}
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &4346727373925079736
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373925079743}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: d3293c07c46938149bd6b68f6f5ab4d1, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!136 &4346727373925079737
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727373925079743}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
m_Radius: 0.5000001
m_Height: 2
m_Direction: 1
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
--- !u!1 &4346727374823546882
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4346727374823547005}
m_Layer: 0
m_Name: PoseMarker
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4346727374823547005
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4346727374823546882}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 4346727373368105281}
- {fileID: 4346727372943234170}
- {fileID: 4346727372952809589}
- {fileID: 4346727373925079742}
- {fileID: 602845843975818768}
- {fileID: 5641498033562402263}
- {fileID: 8964967576903015174}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &4640940940180935358
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5641498033562402263}
- component: {fileID: 3201029004716767610}
- component: {fileID: 2164005335530074864}
m_Layer: 0
m_Name: Y-Positive
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5641498033562402263
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4640940940180935358}
m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071068}
m_LocalPosition: {x: 0, y: 0.11, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: -90, y: 0, z: 0}
--- !u!33 &3201029004716767610
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4640940940180935358}
m_Mesh: {fileID: 3613567641014311022, guid: fa14a214e9ffb1a42850851e0ad9db52, type: 3}
--- !u!23 &2164005335530074864
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4640940940180935358}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: be5bedb9f42770549af7600305d316fd, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &6813102403969732157
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 602845843975818768}
- component: {fileID: 6251018130860582685}
- component: {fileID: 227567837646502533}
m_Layer: 0
m_Name: X-Positive
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &602845843975818768
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6813102403969732157}
m_LocalRotation: {x: -0.5, y: 0.5, z: -0.5, w: 0.5}
m_LocalPosition: {x: 0.11, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 4346727374823547005}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 90, z: -90}
--- !u!33 &6251018130860582685
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6813102403969732157}
m_Mesh: {fileID: 3613567641014311022, guid: fa14a214e9ffb1a42850851e0ad9db52, type: 3}
--- !u!23 &227567837646502533
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6813102403969732157}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 130cd327cb69f5c4ab2bcdb608fbd58c, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 71d5e99cf346f174db130c7585b6a3f8
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,135 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1139942279006104812
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1139942279006104815}
- component: {fileID: 1139942279006104814}
m_Layer: 0
m_Name: left
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1139942279006104815
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1139942279006104812}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1139942279644765727}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1139942279006104814
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1139942279006104812}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c57cc3ae07bcce42ba395c288cba794, type: 3}
m_Name:
m_EditorClassIdentifier:
isLeft: 1
allowUntrackedPose: 1
pointColor: {r: 0, g: 1, b: 0, a: 1}
linkColor: {r: 1, g: 1, b: 1, a: 1}
material: {fileID: 2100000, guid: 4637b99291c9e1d4b82124a21a34acbc, type: 2}
MotionType: 2
--- !u!1 &1139942279644765724
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1139942279644765727}
m_Layer: 0
m_Name: SkeletonHand
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!4 &1139942279644765727
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1139942279644765724}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.015607998, y: -0.013282664, z: -0.07335153}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1139942279006104815}
- {fileID: 1139942279895550675}
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1139942279895550672
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1139942279895550675}
- component: {fileID: 1139942279895550674}
m_Layer: 0
m_Name: right
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1139942279895550675
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1139942279895550672}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1139942279644765727}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1139942279895550674
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1139942279895550672}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8c57cc3ae07bcce42ba395c288cba794, type: 3}
m_Name:
m_EditorClassIdentifier:
isLeft: 0
allowUntrackedPose: 1
pointColor: {r: 0, g: 1, b: 0, a: 1}
linkColor: {r: 1, g: 1, b: 1, a: 1}
material: {fileID: 2100000, guid: 4637b99291c9e1d4b82124a21a34acbc, type: 2}
MotionType: 2

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 26eb62328811e3b41bb1c5e4046cf8bc
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,26 @@
# VIVE OpenXR Hand Tracking Unity Feature
To help software developers create an application for locating hand joints with the OpenXR hand tracking extension [XR_EXT_hand_tracking](https://www.khronos.org/registry/OpenXR/specs/1.0/html/xrspec.html#XR_EXT_hand_tracking).
## Load sample code
**Window** > **Package Manager** > **VIVE OpenXR Plugin - Windows** > **Samples** > Click to import **HandTracking Example**
## Play the sample scene
1. **Edit** > **Project Settings** > **XR Plug-in Management** > Select **OpenXR** , click Exclamation mark next to it then choose **Fix All**.
2. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Add Interaction profiles for your device.
3. **Edit** > **Project Settings** > **XR Plug-in Management** > **OpenXR** > Select **Hand Tracking** under **VIVE OpenXR** Feature Groups.
4. In the Unity Project window, select the sample scene file in **Assets** > **Samples** > **VIVE OpenXR Plugin - Windows** > **1.0.12** > **HandTracking Example** > **Scenes** > **HandTrackingScene.unity** then click Play.
## Use VIVE OpenXR Hand Tracking Unity Feature to draw skeleton hand.
1. Import VIVE OpenXR Plugin - Windows
2. Add Hand gameobject to the Unity scene
- Refer to functions **StartFrameWork** and **StopFrameWork** in **HandManager.cs** for creating and releasing handle for hand.
- Refer to the function **GetJointLocation** in **HandManager.cs** for getting the information to locate hand joints.
- Drag "SkeletonHand" prefab into scene hierarchy or Create an empty object and attach **RenderHand.cs**.
## Use VIVE OpenXR Hand Tracking Unity Feature to draw 3D hand.
1. Import VIVE OpenXR Plugin - Windows
2. Add Hand gameobject to the Unity scene
- Refer to functions **StartFrameWork** and **StopFrameWork** in **HandManager.cs** for creating and releasing handle for hand.
- Refer to the function **GetJointLocation** in **HandManager.cs** for getting the information to locate hand joints.
- Drag "3DHand" prefab into scene hierarchy or attach **RenderModel.cs** to "ObjModelHandLeft_26.fbx" and "ObjModelHandRight_26.fbx".

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8d56a6be4ede9fe40b2e62763d7a1b52
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ea6bc8c74d1f7f1479b372c0c13537ca
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8d77374400df33e4396eb7e610d731d7
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 686c57b9d62a14c47b8353ea34d46bb3
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,24 @@
using UnityEngine.InputSystem;
namespace UnityEngine.XR.OpenXR.Samples.ControllerSample
{
public class ActionAssetEnabler : MonoBehaviour
{
[SerializeField]
InputActionAsset m_ActionAsset;
public InputActionAsset actionAsset
{
get => m_ActionAsset;
set => m_ActionAsset = value;
}
private void OnEnable()
{
if(m_ActionAsset != null)
{
m_ActionAsset.Enable();
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3e6db3fe75b0e5d48ba6decfa5d009fc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,83 @@
using System;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using UnityEngine;
public class Controller : MonoBehaviour
{
[SerializeField]
private InputActionReference m_ActionReferenceTrigger;
public InputActionReference actionReferenceTrigger { get => m_ActionReferenceTrigger ; set => m_ActionReferenceTrigger=value; }
public TextMesh pinchValue;
//[SerializeField]
//private InputActionReference m_ActionReferenceGrip;
//public InputActionReference actionReferenceGrip { get => m_ActionReferenceGrip ; set => m_ActionReferenceGrip=value; }
Type lastActiveType_Trigger = null;
// Update is called once per frame
void Update()
{
pinchValue.text = "0";
if ( actionReferenceTrigger != null && actionReferenceTrigger.action != null
&& actionReferenceTrigger.action.enabled && actionReferenceTrigger.action.controls.Count > 0
/*&& actionReferenceGrip != null && actionReferenceGrip.action != null
&& actionReferenceGrip.action.enabled && actionReferenceGrip.action.controls.Count > 0*/)
{
// Grip
//Type typeToUse_Grip = null;
//if(actionReferenceGrip.action.activeControl != null)
//{
// typeToUse_Grip = actionReferenceGrip.action.activeControl.valueType;
//}
//else
//{
// typeToUse_Grip = lastActiveType_Grip;
//}
//if(typeToUse_Grip == typeof(float))
//{
// lastActiveType_Grip = typeof(float);
// float value = actionReferenceGrip.action.ReadValue<float>();
// if(value > 0.5)
// {
// if(!isSwitchedMeshPrefab)
// {
// isSwitchedMeshPrefab = true;
// Debug.Log("Press Button B.");
// //if(MeshSubSystem != null)
// //{
// // MeshSubSystem.GetComponent<UnityEngine.XR.OpenXR.Samples.MeshingFeature.MeshingBehaviour>().SwitchMeshPrefab();
// //}
// }
// }
// else
// {
// isSwitchedMeshPrefab = false;
// }
//}
// Trigger
Type typeToUse_Trigger = null;
if(actionReferenceTrigger.action.activeControl != null)
{
typeToUse_Trigger = actionReferenceTrigger.action.activeControl.valueType;
}
else
{
typeToUse_Trigger = lastActiveType_Trigger;
}
if(typeToUse_Trigger == typeof(float))
{
lastActiveType_Trigger = typeof(float);
float value = actionReferenceTrigger.action.ReadValue<float>();
pinchValue.text = value.ToString();
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 393fd0a40b85a9a4b981076df200a2f7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,290 @@
using System;
using UnityEngine;
using UnityEngine.XR.OpenXR;
using VIVE.HandTracking;
[Obsolete("Use HandManager instead")]
public static class FrameWork
{
private class HandData
{
public bool isStarted;
public XrHandEXT hand;
public ulong trackerHandle;
public bool isActive;
public int jointUpdatedFrame = -1;
public XrHandJointLocationEXT[] joints = new XrHandJointLocationEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT];
public XrHandJointVelocityEXT[] velocities = new XrHandJointVelocityEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT];
public bool isCreated { get { return trackerHandle != default; } }
public void ClearJoints()
{
Array.Clear(joints, 0, joints.Length);
Array.Clear(velocities, 0, velocities.Length);
}
}
private static HandTracking_OpenXR_API feature;
private static bool isInitialized;
private static bool isSystemSupported;
private static ulong refSpace;
private static HandData leftHandData = new HandData() { hand = XrHandEXT.XR_HAND_LEFT_EXT };
private static HandData rightHandData = new HandData() { hand = XrHandEXT.XR_HAND_RIGHT_EXT };
private static bool isRefSpaceCreated { get { return refSpace != default; } }
private static HandData GetHandData(bool isLeft)
{
return isLeft ? leftHandData : rightHandData;
}
public static bool Initialize()
{
if (!isInitialized)
{
if (feature == null)
{
feature = OpenXRSettings.Instance.GetFeature<HandTracking_OpenXR_API>();
if (feature != null)
{
// FIXME: Assume featuer instance won't be destroied and created to a new one
feature.onSessionCreate += OnFeatureSessionCreate;
feature.onSessionDestroy += OnFeatureSessionDestroy;
feature.onSystemChange += OnFeatureSystemChange;
}
}
if (feature != null && feature.IsEnabledAndInitialized)
{
UpdateSystemSupported();
isInitialized = true;
}
}
return isInitialized;
}
private static void OnFeatureSessionCreate(ulong xrSession)
{
TryCreateHandTracker(leftHandData);
TryCreateHandTracker(rightHandData);
}
private static void OnFeatureSessionDestroy(ulong xrSession)
{
DestroyHandTracker(leftHandData);
DestroyHandTracker(rightHandData);
DestroyRefSpace();
}
private static void OnFeatureSystemChange(ulong systemId)
{
UpdateSystemSupported();
}
private static void UpdateSystemSupported()
{
if (feature == null || !feature.IsEnabledAndInitialized)
{
isSystemSupported = false;
}
else
{
isSystemSupported = feature.SystemSupportsHandTracking(out var result);
if (!isSystemSupported)
{
if (result != XrResult.XR_SUCCESS)
{
Debug.LogWarning("Fail SystemSupportsHandTracking: " + result);
}
else
{
Debug.LogWarning("Hand tracking not supported by the system");
}
}
}
}
private static bool TryCreateHandTracker(HandData handData)
{
if (!handData.isStarted) { return false; }
if (!Initialize()) { return false; }
if (!isSystemSupported) { return false; }
if (!feature.IsSessionCreated) { return false; }
if (!handData.isCreated)
{
if (!feature.TryCreateHandTracker(handData.hand, out handData.trackerHandle, out var result))
{
handData.trackerHandle = default;
Debug.LogWarning("Fail CreateHandTracker: " + result);
}
}
return handData.isCreated;
}
private static void DestroyHandTracker(HandData handData)
{
if (!handData.isCreated) { return; }
if (!Initialize()) { return; }
feature.TryDestroyHandTracker(handData.trackerHandle, out _);
handData.trackerHandle = default;
handData.ClearJoints();
}
private static bool InitializeRefSpace()
{
if (!Initialize()) { return false; }
if (!isSystemSupported) { return false; }
if (!feature.IsSessionCreated) { return false; }
if (!isRefSpaceCreated)
{
const XrReferenceSpaceType preferSpaceType = XrReferenceSpaceType.XR_REFERENCE_SPACE_TYPE_STAGE;
XrReferenceSpaceType spaceType;
if (!feature.TryGetSupportedReferenceSpaceType(preferSpaceType, out spaceType, out var result))
{
Debug.LogWarning("Fail GetSupportedReferenceSpaceType: " + result);
}
else
{
if (!feature.TryCreateReferenceSpace(
spaceType,
new XrVector3f(0f, 0f, 0f),
new XrQuaternionf(0f, 0f, 0f, 1f),
out refSpace,
out result))
{
refSpace = default;
Debug.LogWarning("Fail CreateReferenceSpace: " + result);
}
}
}
return isRefSpaceCreated;
}
private static void DestroyRefSpace()
{
if (!isRefSpaceCreated) { return; }
if (Initialize())
{
if (!feature.TryDestroyReferenceSpace(refSpace, out var result))
{
Debug.LogWarning("Fail DestroyReferenceSpace: " + result);
}
}
refSpace = default;
}
public static void StartFrameWork(bool isLeft)
{
var handData = GetHandData(isLeft);
handData.isStarted = true;
TryCreateHandTracker(handData);
}
public static void StopFrameWork(bool isLeft)
{
var handData = GetHandData(isLeft);
handData.isStarted = false;
DestroyHandTracker(handData);
}
public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, bool forceUpdate = false)
{
var handData = GetHandData(isleft);
if (handData.isCreated)
{
if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount)
{
handData.jointUpdatedFrame = Time.frameCount;
if (InitializeRefSpace())
{
if (!feature.TryLocateHandJoints(
handData.trackerHandle,
refSpace,
out handData.isActive,
handData.joints,
out var result))
{
handData.isActive = false;
Debug.LogWarning("Fail LocateHandJoints: " + result);
}
}
}
}
joints = handData.joints;
return handData.isActive;
}
public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints,ref XrHandJointsMotionRangeEXT type, bool forceUpdate = false)
{
var handData = GetHandData(isleft);
if (handData.isCreated)
{
if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount)
{
handData.jointUpdatedFrame = Time.frameCount;
if (InitializeRefSpace())
{
if (!feature.TryLocateHandJoints(
handData.trackerHandle,
refSpace,
ref type,
out handData.isActive,
handData.joints,
out var result))
{
handData.isActive = false;
Debug.LogWarning("Fail LocateHandJoints: " + result);
}
}
}
}
joints = handData.joints;
return handData.isActive;
}
public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, out XrHandJointVelocityEXT[] velocities, bool forceUpdate = false)
{
var handData = GetHandData(isleft);
if (handData.isCreated)
{
if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount)
{
handData.jointUpdatedFrame = Time.frameCount;
if (InitializeRefSpace())
{
if (!feature.TryLocateHandJoints(
handData.trackerHandle,
refSpace,
out handData.isActive,
handData.joints,
handData.velocities,
out var result))
{
handData.isActive = false;
Debug.LogWarning("Fail LocateHandJoints: " + result);
}
}
}
}
joints = handData.joints;
velocities = handData.velocities;
return handData.isActive;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 89e4cae3bc180f14c906224f93d20210
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,152 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was auto-generated by com.unity.inputsystem:InputActionCodeGenerator
// version 1.4.1
// from Assets/Samples/VIVE OpenXR Plugin - Windows/1.0.12/HandTracking Example/Scripts/InputMaster.inputactions
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Utilities;
public partial class @InputMaster : IInputActionCollection2, IDisposable
{
public InputActionAsset asset { get; }
public @InputMaster()
{
asset = InputActionAsset.FromJson(@"{
""name"": ""InputMaster"",
""maps"": [
{
""name"": ""Keyboard"",
""id"": ""94ee31f8-c9ac-4138-b5b9-ad5ecec1870d"",
""actions"": [
{
""name"": ""SpacePress"",
""type"": ""Button"",
""id"": ""2a246a3d-969f-4d95-8e12-9e0000e5b19c"",
""expectedControlType"": ""Button"",
""processors"": """",
""interactions"": """",
""initialStateCheck"": false
}
],
""bindings"": [
{
""name"": """",
""id"": ""d6ea233e-905c-4913-a644-8a84098fea9f"",
""path"": ""<Keyboard>/space"",
""interactions"": """",
""processors"": """",
""groups"": """",
""action"": ""SpacePress"",
""isComposite"": false,
""isPartOfComposite"": false
}
]
}
],
""controlSchemes"": []
}");
// Keyboard
m_Keyboard = asset.FindActionMap("Keyboard", throwIfNotFound: true);
m_Keyboard_SpacePress = m_Keyboard.FindAction("SpacePress", throwIfNotFound: true);
}
public void Dispose()
{
UnityEngine.Object.Destroy(asset);
}
public InputBinding? bindingMask
{
get => asset.bindingMask;
set => asset.bindingMask = value;
}
public ReadOnlyArray<InputDevice>? devices
{
get => asset.devices;
set => asset.devices = value;
}
public ReadOnlyArray<InputControlScheme> controlSchemes => asset.controlSchemes;
public bool Contains(InputAction action)
{
return asset.Contains(action);
}
public IEnumerator<InputAction> GetEnumerator()
{
return asset.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void Enable()
{
asset.Enable();
}
public void Disable()
{
asset.Disable();
}
public IEnumerable<InputBinding> bindings => asset.bindings;
public InputAction FindAction(string actionNameOrId, bool throwIfNotFound = false)
{
return asset.FindAction(actionNameOrId, throwIfNotFound);
}
public int FindBinding(InputBinding bindingMask, out InputAction action)
{
return asset.FindBinding(bindingMask, out action);
}
// Keyboard
private readonly InputActionMap m_Keyboard;
private IKeyboardActions m_KeyboardActionsCallbackInterface;
private readonly InputAction m_Keyboard_SpacePress;
public struct KeyboardActions
{
private @InputMaster m_Wrapper;
public KeyboardActions(@InputMaster wrapper) { m_Wrapper = wrapper; }
public InputAction @SpacePress => m_Wrapper.m_Keyboard_SpacePress;
public InputActionMap Get() { return m_Wrapper.m_Keyboard; }
public void Enable() { Get().Enable(); }
public void Disable() { Get().Disable(); }
public bool enabled => Get().enabled;
public static implicit operator InputActionMap(KeyboardActions set) { return set.Get(); }
public void SetCallbacks(IKeyboardActions instance)
{
if (m_Wrapper.m_KeyboardActionsCallbackInterface != null)
{
@SpacePress.started -= m_Wrapper.m_KeyboardActionsCallbackInterface.OnSpacePress;
@SpacePress.performed -= m_Wrapper.m_KeyboardActionsCallbackInterface.OnSpacePress;
@SpacePress.canceled -= m_Wrapper.m_KeyboardActionsCallbackInterface.OnSpacePress;
}
m_Wrapper.m_KeyboardActionsCallbackInterface = instance;
if (instance != null)
{
@SpacePress.started += instance.OnSpacePress;
@SpacePress.performed += instance.OnSpacePress;
@SpacePress.canceled += instance.OnSpacePress;
}
}
}
public KeyboardActions @Keyboard => new KeyboardActions(this);
public interface IKeyboardActions
{
void OnSpacePress(InputAction.CallbackContext context);
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 00c2bfc723925654087046942f18ab09
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,34 @@
{
"name": "InputMaster",
"maps": [
{
"name": "Keyboard",
"id": "94ee31f8-c9ac-4138-b5b9-ad5ecec1870d",
"actions": [
{
"name": "SpacePress",
"type": "Button",
"id": "2a246a3d-969f-4d95-8e12-9e0000e5b19c",
"expectedControlType": "Button",
"processors": "",
"interactions": "",
"initialStateCheck": false
}
],
"bindings": [
{
"name": "",
"id": "d6ea233e-905c-4913-a644-8a84098fea9f",
"path": "<Keyboard>/space",
"interactions": "",
"processors": "",
"groups": "",
"action": "SpacePress",
"isComposite": false,
"isPartOfComposite": false
}
]
}
],
"controlSchemes": []
}

View File

@@ -0,0 +1,14 @@
fileFormatVersion: 2
guid: d8c42cba5f401b94db94490595c0f4df
ScriptedImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 2
userData:
assetBundleName:
assetBundleVariant:
script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3}
generateWrapperCode: 1
wrapperCodePath:
wrapperClassName:
wrapperCodeNamespace:

View File

@@ -0,0 +1,39 @@
using System;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using UnityEngine;
public class LineRender : MonoBehaviour
{
[Tooltip("Root object of Line mesh")]
public GameObject Line = null;
[SerializeField] private LineRenderer GazeRayRenderer;
[SerializeField]
private InputActionReference m_ActionReferencePose;
public InputActionReference actionReferencePose { get => m_ActionReferencePose; set => m_ActionReferencePose = value; }
// Update is called once per frame
void Update()
{
Vector3 DirectionCombinedLocal;
if (actionReferencePose != null && actionReferencePose.action != null
&& actionReferencePose.action.enabled && actionReferencePose.action.controls.Count > 0)
{
//GazeRayRenderer.SetActive(true);
UnityEngine.XR.OpenXR.Input.Pose poseval = actionReferencePose.action.ReadValue<UnityEngine.XR.OpenXR.Input.Pose>();
Quaternion gazeRotation = poseval.rotation;
Quaternion orientation = new Quaternion(
1 * (gazeRotation.x),
1 * (gazeRotation.y),
1 * gazeRotation.z,
1 * gazeRotation.w);
DirectionCombinedLocal = orientation * Vector3.forward;
Vector3 DirectionCombined = Camera.main.transform.TransformDirection(DirectionCombinedLocal);
GazeRayRenderer.SetPosition(0, poseval.position);
GazeRayRenderer.SetPosition(1, poseval.position + DirectionCombinedLocal * 4);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1f20223b10be10d478250a03bb7ae27f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,28 @@
using UnityEditor;
using UnityEngine;
namespace VIVE.HandTracking.Sample
{
public class ReadOnlyAttribute : PropertyAttribute
{
}
#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]
public class ReadOnlyDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
GUI.enabled = false;
EditorGUI.PropertyField(position, property, label, true);
GUI.enabled = true;
}
}
#endif
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a85838490cd239847a9f06ea17789601
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,190 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VIVE.HandTracking;
namespace VIVE.HandTracking.Sample
{
public class RenderHand : MonoBehaviour
{
// Links between keypoints, 2*i & 2*i+1 forms a link.
// keypoint index: 1: palm, 2-5: thumb, 6-10: index, 11-15: middle, 16-20: ring, 21-25: pinky
// fingers are counted from bottom to top
private static int[] Connections = new int[] {
1, 2, 1, 6, 1, 11, 1, 16, 1, 21, // palm and finger starts
2, 6, 6, 11, 11, 16, 16, 21, // finger starts
2, 3, 3, 4, 4, 5, // thumb
6, 7, 7, 8, 8, 9, 9, 10, // index
11, 12, 12, 13, 13, 14, 14, 15, // middle
16, 17, 17, 18, 18, 19, 19, 20, // ring
21, 22, 22, 23, 23, 24, 24, 25 // pinky
};
[Tooltip("Draw left hand if true, right hand otherwise")]
public bool isLeft = false;
[Tooltip("Use inferred or last-known posed when hand loses tracking if true.")]
public bool allowUntrackedPose = false;
[Tooltip("Default color of hand points")]
public Color pointColor = Color.green;
[Tooltip("Default color of links between keypoints in skeleton mode")]
public Color linkColor = Color.white;
[Tooltip("Material for hand points and links")]
[SerializeField]
private Material material = null;
private XrHandJointsMotionRangeEXT MotionType = XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT;
[Tooltip("Type of hand joints range of motion")]
[ReadOnly] public string HandJointsMotionRange;
private List<GameObject> points = new List<GameObject>();
// list of links created (only for skeleton)
private List<GameObject> links = new List<GameObject>();
// Start is called before the first frame update
private XrHandJointLocationEXT[] HandjointLocations = new
XrHandJointLocationEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT];
// shared material for all point objects
private Material pointMat = null;
// shared material for all link objects
private Material linkMat = null;
private void Start()
{
HandManager.StartFrameWork(isLeft);
pointMat = new Material(material);
if (isLeft)
{
pointColor = Color.blue;
}
else
{
pointColor = Color.red;
}
pointMat.color = pointColor;
linkMat = new Material(material);
linkMat.color = linkColor;
for (int i = 0; i < (int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT; i++)
{
var go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
go.name = ((XrHandJointEXT)i).ToString();
go.transform.parent = transform;
go.transform.localScale = Vector3.one * 0.012f;
go.SetActive(false);
points.Add(go);
go.transform.position = new Vector3((float)i * 0.1f, 0, 0);
// handle layer
go.layer = gameObject.layer;
// handle material
go.GetComponent<Renderer>().sharedMaterial = pointMat;
}
// create game objects for links between keypoints, only used in skeleton mode
for (int i = 0; i < Connections.Length; i += 2)
{
var go = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
go.name = "link" + i;
go.transform.parent = transform;
go.transform.localScale = Vector3.one * 0.005f;
go.SetActive(false);
links.Add(go);
// handle layer
go.layer = gameObject.layer;
// handle material
go.GetComponent<Renderer>().sharedMaterial = linkMat;
}
}
// Update is called once per frame
private void Update()
{
if (HandManager.GetJointLocation(isLeft, out HandjointLocations, ref MotionType))
{
UpdateJointLocation();
switch (MotionType)
{
case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT:
HandJointsMotionRange = "UNOBSTRUCTED";
break;
case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT:
HandJointsMotionRange = "CONTROLLER";
break;
default:
HandJointsMotionRange = "";
break;
}
}
else
{
for (int i = 0; i < points.Count; i++)
{
var go = points[i];
go.SetActive(false);
}
for (int i = 0; i < links.Count; i++)
{
var link = links[i];
link.SetActive(false);
}
}
}
private void UpdateJointLocation()
{
for (int i = 0; i < points.Count; i++)
{
var go = points[i];
XrQuaternionf orientation;
XrVector3f position;
float radius = HandjointLocations[i].radius;
if (allowUntrackedPose) //Use inferred or last-known pose when lost tracking
{
orientation = HandjointLocations[i].pose.orientation;
position = HandjointLocations[i].pose.position;
go.transform.localPosition = new Vector3(position.x, position.y, -position.z);
go.SetActive(true);
}
else
{
if ((HandjointLocations[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT) != 0)
{
orientation = HandjointLocations[i].pose.orientation;
}
if ((HandjointLocations[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_TRACKED_BIT) != 0)
{
position = HandjointLocations[i].pose.position;
go.transform.localPosition = new Vector3(position.x, position.y, -position.z);
go.SetActive(true);
}
else
{
UnityEngine.Debug.Log("Lost tracking");
go.SetActive(false);
}
}
}
for (int i = 0; i < links.Count; i++)
{
var link = links[i];
var pose1 = points[Connections[i * 2]].transform.position;
var pose2 = points[Connections[i * 2 + 1]].transform.position;
// calculate link position and rotation based on points on both end
link.SetActive(true);
link.transform.position = (pose1 + pose2) / 2;
var direction = pose2 - pose1;
link.transform.rotation = Quaternion.FromToRotation(Vector3.up, direction);
link.transform.localScale = new Vector3(0.006f, direction.magnitude / 2f - 0.0051f, 0.006f);
}
}
private void OnDestroy()
{
HandManager.StopFrameWork(isLeft);
UnityEngine.Debug.Log("OnDestroy");
}
//public void setHandVisible(bool isVisible)
//{
// Hand.SetActive(isVisible);
//}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8c57cc3ae07bcce42ba395c288cba794
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,78 @@
using UnityEngine;
using VIVE.HandTracking;
namespace VIVE.HandTracking.Sample
{
public class RenderModel : MonoBehaviour
{
private readonly Quaternion zBackModelRotFix = Quaternion.AngleAxis(180f, Vector3.up);
public Transform[] nodes = new Transform[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT];
[Tooltip("Draw left hand if true, right hand otherwise")]
public bool isLeft = false;
[Tooltip("Use inferred or last-known posed when hand loses tracking if true.")]
public bool allowUntrackedPose = false;
[Tooltip("Root object of skinned mesh")]
public GameObject Hand = null;
private XrHandJointsMotionRangeEXT MotionType = XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_MAX_ENUM_EXT;
[Tooltip("Type of hand joints range of motion")]
[ReadOnly]public string HandJointsMotionRange;
// Start is called before the first frame update
private void Start()
{
HandManager.StartFrameWork(isLeft);
}
// Update is called once per frame
private void Update()
{
if (HandManager.GetJointLocation(isLeft, out var joints, ref MotionType))
{
setHandVisible(true);
for (int i = (int)XrHandJointEXT.XR_HAND_JOINT_PALM_EXT; i < (int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT; i++)
{
var posValid = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_VALID_BIT) != 0;
var posTracked = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_POSITION_TRACKED_BIT) != 0;
var rotValid = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) != 0;
var rotTracked = (joints[i].locationFlags & (ulong)XrSpaceLocationFlags.XR_SPACE_LOCATION_ORIENTATION_TRACKED_BIT) != 0;
var pos = new Vector3(joints[i].pose.position.x, joints[i].pose.position.y, -joints[i].pose.position.z);
var rot = new Quaternion(-joints[i].pose.orientation.x, -joints[i].pose.orientation.y, joints[i].pose.orientation.z, joints[i].pose.orientation.w) * zBackModelRotFix;
if (posValid && (allowUntrackedPose || posTracked)) { nodes[i].position = transform.TransformPoint(pos); }
if (rotValid && (allowUntrackedPose || rotTracked)) { nodes[i].rotation = transform.rotation * rot; }
}
switch (MotionType)
{
case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_UNOBSTRUCTED_EXT:
HandJointsMotionRange = "UNOBSTRUCTED";
break;
case XrHandJointsMotionRangeEXT.XR_HAND_JOINTS_MOTION_RANGE_CONFORMING_TO_CONTROLLER_EXT:
HandJointsMotionRange = "CONTROLLER";
break;
default:
HandJointsMotionRange = "";
break;
}
}
else
{
setHandVisible(false);
}
}
private void OnDestroy()
{
HandManager.StopFrameWork(isLeft);
}
public void setHandVisible(bool isVisible)
{
Hand.SetActive(isVisible);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c19189c6a6028a74ab475048ebd154c8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,46 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace VIVE.HandTracking.Sample
{
public class SwitchHand : MonoBehaviour
{
public InputMaster inputMaster;
public GameObject hand3D;
public GameObject handSkeleton;
private bool isSwitch = false;
private void Awake()
{
inputMaster = new InputMaster();
inputMaster.Enable();
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
float ispressed = inputMaster.Keyboard.SpacePress.ReadValue<float>();
if (ispressed > 0.5)
{
if(!isSwitch)
{
UnityEngine.Debug.Log("press space");
hand3D.SetActive(!hand3D.activeSelf);
handSkeleton.SetActive(!handSkeleton.activeSelf);
isSwitch = true;
}
}
else
{
isSwitch = false;
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2642121393e03fd46ba257307ca9cb51
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 98067af793989634da2aed490cf3f25b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,293 @@
using System;
using UnityEngine;
using UnityEngine.XR.OpenXR;
namespace VIVE.HandTracking
{
public static class HandManager
{
private class HandData
{
public bool isStarted;
public XrHandEXT hand;
public ulong trackerHandle;
public bool isActive;
public int jointUpdatedFrame = -1;
public XrHandJointLocationEXT[] joints = new XrHandJointLocationEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT];
public XrHandJointVelocityEXT[] velocities = new XrHandJointVelocityEXT[(int)XrHandJointEXT.XR_HAND_JOINT_MAX_ENUM_EXT];
public bool isCreated { get { return trackerHandle != default; } }
public void ClearJoints()
{
Array.Clear(joints, 0, joints.Length);
Array.Clear(velocities, 0, velocities.Length);
}
}
private static HandTracking_OpenXR_API feature;
private static bool isInitialized;
private static bool isSystemSupported;
private static ulong refSpace;
private static HandData leftHandData = new HandData() { hand = XrHandEXT.XR_HAND_LEFT_EXT };
private static HandData rightHandData = new HandData() { hand = XrHandEXT.XR_HAND_RIGHT_EXT };
private static bool isRefSpaceCreated { get { return refSpace != default; } }
private static HandData GetHandData(bool isLeft)
{
return isLeft ? leftHandData : rightHandData;
}
public static bool Initialize()
{
if (!isInitialized)
{
if (feature == null)
{
feature = OpenXRSettings.Instance.GetFeature<HandTracking_OpenXR_API>();
if (feature != null)
{
// FIXME: Assume featuer instance won't be destroied and created to a new one
feature.onSessionCreate += OnFeatureSessionCreate;
feature.onSessionDestroy += OnFeatureSessionDestroy;
feature.onSystemChange += OnFeatureSystemChange;
}
}
if (feature != null && feature.IsEnabledAndInitialized)
{
UpdateSystemSupported();
isInitialized = true;
}
}
return isInitialized;
}
private static void OnFeatureSessionCreate(ulong xrSession)
{
TryCreateHandTracker(leftHandData);
TryCreateHandTracker(rightHandData);
}
private static void OnFeatureSessionDestroy(ulong xrSession)
{
DestroyHandTracker(leftHandData);
DestroyHandTracker(rightHandData);
DestroyRefSpace();
}
private static void OnFeatureSystemChange(ulong systemId)
{
UpdateSystemSupported();
}
private static void UpdateSystemSupported()
{
if (feature == null || !feature.IsEnabledAndInitialized)
{
isSystemSupported = false;
}
else
{
isSystemSupported = feature.SystemSupportsHandTracking(out var result);
if (!isSystemSupported)
{
if (result != XrResult.XR_SUCCESS)
{
Debug.LogWarning("Fail SystemSupportsHandTracking: " + result);
}
else
{
Debug.LogWarning("Hand tracking not supported by the system");
}
}
}
}
private static bool TryCreateHandTracker(HandData handData)
{
if (!handData.isStarted) { return false; }
if (!Initialize()) { return false; }
if (!isSystemSupported) { return false; }
if (!feature.IsSessionCreated) { return false; }
if (!handData.isCreated)
{
if (!feature.TryCreateHandTracker(handData.hand, out handData.trackerHandle, out var result))
{
handData.trackerHandle = default;
Debug.LogWarning("Fail CreateHandTracker: " + result);
}
}
return handData.isCreated;
}
private static void DestroyHandTracker(HandData handData)
{
if (!handData.isCreated) { return; }
if (!Initialize()) { return; }
feature.TryDestroyHandTracker(handData.trackerHandle, out _);
handData.trackerHandle = default;
handData.ClearJoints();
}
private static bool InitializeRefSpace()
{
if (!Initialize()) { return false; }
if (!isSystemSupported) { return false; }
if (!feature.IsSessionCreated) { return false; }
if (!isRefSpaceCreated)
{
const XrReferenceSpaceType preferSpaceType = XrReferenceSpaceType.XR_REFERENCE_SPACE_TYPE_STAGE;
XrReferenceSpaceType spaceType;
if (!feature.TryGetSupportedReferenceSpaceType(preferSpaceType, out spaceType, out var result))
{
Debug.LogWarning("Fail GetSupportedReferenceSpaceType: " + result);
}
else
{
if (!feature.TryCreateReferenceSpace(
spaceType,
new XrVector3f(0f, 0f, 0f),
new XrQuaternionf(0f, 0f, 0f, 1f),
out refSpace,
out result))
{
refSpace = default;
Debug.LogWarning("Fail CreateReferenceSpace: " + result);
}
}
}
return isRefSpaceCreated;
}
private static void DestroyRefSpace()
{
if (!isRefSpaceCreated) { return; }
if (Initialize())
{
if (!feature.TryDestroyReferenceSpace(refSpace, out var result))
{
Debug.LogWarning("Fail DestroyReferenceSpace: " + result);
}
}
refSpace = default;
}
public static void StartFrameWork(bool isLeft)
{
var handData = GetHandData(isLeft);
handData.isStarted = true;
TryCreateHandTracker(handData);
}
public static void StopFrameWork(bool isLeft)
{
var handData = GetHandData(isLeft);
handData.isStarted = false;
DestroyHandTracker(handData);
}
public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, bool forceUpdate = false)
{
var handData = GetHandData(isleft);
if (handData.isCreated)
{
if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount)
{
handData.jointUpdatedFrame = Time.frameCount;
if (InitializeRefSpace())
{
if (!feature.TryLocateHandJoints(
handData.trackerHandle,
refSpace,
out handData.isActive,
handData.joints,
out var result))
{
handData.isActive = false;
Debug.LogWarning("Fail LocateHandJoints: " + result);
}
}
}
}
joints = handData.joints;
return handData.isActive;
}
public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, ref XrHandJointsMotionRangeEXT type, bool forceUpdate = false)
{
var handData = GetHandData(isleft);
if (handData.isCreated)
{
if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount)
{
handData.jointUpdatedFrame = Time.frameCount;
if (InitializeRefSpace())
{
if (!feature.TryLocateHandJoints(
handData.trackerHandle,
refSpace,
ref type,
out handData.isActive,
handData.joints,
out var result))
{
handData.isActive = false;
Debug.LogWarning("Fail LocateHandJoints: " + result);
}
}
}
}
joints = handData.joints;
return handData.isActive;
}
public static bool GetJointLocation(bool isleft, out XrHandJointLocationEXT[] joints, out XrHandJointVelocityEXT[] velocities, bool forceUpdate = false)
{
var handData = GetHandData(isleft);
if (handData.isCreated)
{
if (forceUpdate || handData.jointUpdatedFrame != Time.frameCount)
{
handData.jointUpdatedFrame = Time.frameCount;
if (InitializeRefSpace())
{
if (!feature.TryLocateHandJoints(
handData.trackerHandle,
refSpace,
out handData.isActive,
handData.joints,
handData.velocities,
out var result))
{
handData.isActive = false;
Debug.LogWarning("Fail LocateHandJoints: " + result);
}
}
}
}
joints = handData.joints;
velocities = handData.velocities;
return handData.isActive;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ffbd7154b240117469bbc995d51d58a1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,429 @@
using System;
using System.Runtime.InteropServices;
using UnityEditor;
using UnityEngine.XR.OpenXR.Features;
#if UNITY_EDITOR
using UnityEditor.XR.OpenXR.Features;
#endif
namespace VIVE
{
namespace HandTracking
{
#if UNITY_EDITOR
[OpenXRFeature(UiName = "Hand Tracking",
BuildTargetGroups = new[] { BuildTargetGroup.Standalone },
Company = "HTC",
Desc = "Hand Tracking OpenXR Feature",
DocumentationLink = "https://developer.vive.com/resources/openxr/openxr-pcvr/tutorials/unity/how-integrate-hand-tracking-data-your-hand-model/",
OpenxrExtensionStrings = "XR_EXT_hand_tracking",
Version = "0.0.1",
FeatureId = featureId)]
#endif
public class HandTracking_OpenXR_API : OpenXRFeature
{
/// <summary>
/// The feature id string. This is used to give the feature a well known id for reference.
/// </summary>
public const string featureId = "com.company.openxr.handtracking.feature";
private IntPtr oldxrGetInstanceProcAddr;
private IntPtr oldWaitFrame;
private ulong m_xrInstance;
private ulong m_xrSession;
private ulong m_systemId;
private XrFrameWaitInfo m_frameWaitInfo;
private XrFrameState m_frameState;
[Obsolete] public ulong m_space;
[Obsolete] public XrSystemProperties systemProperties;
[Obsolete] public ulong m_leftHandle;
[Obsolete] public ulong m_rightHandle;
public bool IsInitialized { get { return m_xrGetSystemProperties != null; } }
public bool IsEnabledAndInitialized { get { return enabled && IsInitialized; } }
public bool IsSessionCreated { get { return XrSession != default; } }
public ulong XrInstance { get { return m_xrInstance; } }
public ulong XrSession { get { return m_xrSession; } }
public ulong SystemId { get { return m_systemId; } }
public event Action<ulong> onSessionCreate;
public event Action<ulong> onSessionDestroy;
public event Action<ulong> onSystemChange;
protected override IntPtr HookGetInstanceProcAddr(IntPtr func)
{
UnityEngine.Debug.Log("EXT: registering our own xrGetInstanceProcAddr");
oldxrGetInstanceProcAddr = func;
m_intercept_xrWaitFrame_xrGetInstanceProcAddr = intercept_xrWaitFrame_xrGetInstanceProcAddr;
return Marshal.GetFunctionPointerForDelegate(m_intercept_xrWaitFrame_xrGetInstanceProcAddr);
}
private int intercept_xrWaitFrame_xrGetInstanceProcAddr(ulong instance, string name, out IntPtr function)
{
if (oldxrGetInstanceProcAddr == null || oldxrGetInstanceProcAddr == IntPtr.Zero)
{
UnityEngine.Debug.LogError("oldxrGetInstanceProcAddr is null");
function = IntPtr.Zero;
return -1;
}
// Get delegate of old xrGetInstanceProcAddr.
var xrGetProc = Marshal.GetDelegateForFunctionPointer<xrGetInstanceProcDelegate>(oldxrGetInstanceProcAddr);
int result = xrGetProc(instance, name,out function);
if(name == "xrWaitFrame")
{
oldWaitFrame = function;
m_intercept_xrWaitFrame = intercepted_xrWaitFrame;
function = Marshal.GetFunctionPointerForDelegate(m_intercept_xrWaitFrame); ;
UnityEngine.Debug.Log("Getting xrWaitFrame func");
}
return result;
}
private int intercepted_xrWaitFrame(ulong session,ref XrFrameWaitInfo frameWaitInfo, ref XrFrameState frameState)
{
// Get delegate of old xrWaitFrame.
var xrWaitFrame = Marshal.GetDelegateForFunctionPointer<xrWaitFrameDelegate>(oldWaitFrame);
int res = xrWaitFrame(session, ref frameWaitInfo, ref frameState);
m_frameWaitInfo = frameWaitInfo;
m_frameState = frameState;
return res;
}
/// <inheritdoc />
protected override bool OnInstanceCreate(ulong xrInstance)
{
UnityEngine.Debug.Log($"OnInstanceCreate({xrInstance:X})");
m_xrInstance = xrInstance;
return GetXrFunctionDelegates(xrInstance);
}
/// <inheritdoc />
protected override void OnInstanceDestroy(ulong xrInstance)
{
UnityEngine.Debug.Log($"OnInstanceDestroy({xrInstance:X})");
m_xrInstance = default;
//ClearXrFunctionDelegates();
}
/// <inheritdoc />
protected override void OnSessionCreate(ulong xrSession)
{
UnityEngine.Debug.Log($"OnSessionCreate({xrSession:X})");
m_xrSession = xrSession;
try { onSessionCreate?.Invoke(xrSession); }
catch (Exception e) { UnityEngine.Debug.LogError(e); }
}
/// <inheritdoc />
protected override void OnSystemChange(ulong xrSystem)
{
UnityEngine.Debug.Log($"OnSystemChange({xrSystem:X})");
m_systemId = xrSystem;
try { onSystemChange?.Invoke(xrSystem); }
catch (Exception e) { UnityEngine.Debug.LogError(e); }
}
/// <inheritdoc />
protected override void OnSessionDestroy(ulong xrSession)
{
UnityEngine.Debug.Log($"OnSessionDestroy({xrSession:X})");
m_xrSession = default;
try { onSessionDestroy?.Invoke(xrSession); }
catch (Exception e) { UnityEngine.Debug.LogError(e); }
}
/// <summary>Return true if the result equals zero. </summary>
private bool GetXrFunctionDelegates(ulong xrInstance)
{
if (xrGetInstanceProcAddr == null || xrGetInstanceProcAddr == IntPtr.Zero)
{
UnityEngine.Debug.LogError("xrGetInstanceProcAddr is null");
return false;
}
// Get delegate of xrGetInstanceProcAddr.
var xrGetProc = Marshal.GetDelegateForFunctionPointer<xrGetInstanceProcDelegate>(xrGetInstanceProcAddr);
if (!MarshelFunc(xrInstance, xrGetProc, "xrGetSystemProperties", ref m_xrGetSystemProperties)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrEnumerateReferenceSpaces", ref m_xrEnumerateReferenceSpaces)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrEnumerateReferenceSpaces", ref m_xrEnumerateReferenceSpaces2)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrCreateReferenceSpace", ref m_xrCreateReferenceSpace)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrDestroySpace", ref m_xrDestroySpace)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrCreateHandTrackerEXT", ref m_xrCreateHandTrackerEXT)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrDestroyHandTrackerEXT", ref m_xrDestroyHandTrackerEXT)) { return false; }
if (!MarshelFunc(xrInstance, xrGetProc, "xrLocateHandJointsEXT", ref m_xrLocateHandJointsEXT)) { return false; }
return true;
}
private void ClearXrFunctionDelegates()
{
m_xrGetSystemProperties = null;
m_xrEnumerateReferenceSpaces = null;
m_xrEnumerateReferenceSpaces2 = null;
m_xrCreateReferenceSpace = null;
m_xrDestroySpace = null;
m_xrCreateHandTrackerEXT = null;
m_xrDestroyHandTrackerEXT = null;
m_xrLocateHandJointsEXT = null;
}
private static bool MarshelFunc<T>(ulong instance, xrGetInstanceProcDelegate instanceProc, string funcName, ref T func, bool verbose = true)
where T : Delegate
{
if (instanceProc(instance, funcName, out var fp) != 0)
{
if (verbose)
{
UnityEngine.Debug.LogError("Fail getting function " + funcName);
}
return false;
}
func = Marshal.GetDelegateForFunctionPointer<T>(fp);
return true;
}
private xrGetInstanceProcDelegate m_intercept_xrWaitFrame_xrGetInstanceProcAddr;
private delegate int xrGetSystemPropertiesDelegate(ulong instance, ulong systemId, ref XrSystemProperties properties);
private xrGetSystemPropertiesDelegate m_xrGetSystemProperties;
public int xrGetSystemProperties(ref XrSystemProperties properties) =>
m_xrGetSystemProperties(XrInstance, SystemId, ref properties);
public int xrGetSystemProperties(ulong instance, ulong systemId, ref XrSystemProperties properties) =>
m_xrGetSystemProperties(instance, systemId, ref properties);
private delegate int xrWaitFrameDelegate(ulong session,ref XrFrameWaitInfo frameWaitInfo, ref XrFrameState frameState);
private xrWaitFrameDelegate m_intercept_xrWaitFrame;
#region space
private delegate int xrEnumerateReferenceSpacesDelegate(ulong session, int spaceCapacityInput, out int spaceCountOutput, out XrReferenceSpaceType spaces);
private xrEnumerateReferenceSpacesDelegate m_xrEnumerateReferenceSpaces;
public int xrEnumerateReferenceSpaces(int spaceCapacityInput, out int spaceCountOutput, out XrReferenceSpaceType spaces) =>
m_xrEnumerateReferenceSpaces(XrSession, spaceCapacityInput, out spaceCountOutput, out spaces);
private delegate int xrEnumerateReferenceSpacesDelegate2(ulong session, int spaceCapacityInput, out int spaceCountOutput, IntPtr spaces);
private xrEnumerateReferenceSpacesDelegate2 m_xrEnumerateReferenceSpaces2;
public int xrEnumerateReferenceSpaces(ulong session, int spaceCapacityInput, out int spaceCountOutput, IntPtr spaces) =>
m_xrEnumerateReferenceSpaces2(session, spaceCapacityInput, out spaceCountOutput, spaces);
private delegate int xrCreateReferenceSpaceDelegate(ulong session, ref XrReferenceSpaceCreateInfo createInfo, out ulong space);
private xrCreateReferenceSpaceDelegate m_xrCreateReferenceSpace;
public int xrCreateReferenceSpace(ref XrReferenceSpaceCreateInfo createInfo, out ulong space) =>
m_xrCreateReferenceSpace(XrSession, ref createInfo, out space);
public int xrCreateReferenceSpace(ulong session, ref XrReferenceSpaceCreateInfo createInfo, out ulong space) =>
m_xrCreateReferenceSpace(session, ref createInfo, out space);
private delegate int xrDestroySpaceDelegate(ulong space);
private xrDestroySpaceDelegate m_xrDestroySpace;
public int xrDestroySpace(ulong space) =>
m_xrDestroySpace(space);
#endregion
private delegate int xrCreateHandTrackerEXTDelegate(ulong session, XrHandTrackerCreateInfoEXT createInfo, out ulong handTracker);
private xrCreateHandTrackerEXTDelegate m_xrCreateHandTrackerEXT;
public int xrCreateHandTrackerEXT(XrHandTrackerCreateInfoEXT createInfo, out ulong handle) =>
m_xrCreateHandTrackerEXT(XrSession, createInfo, out handle);
public int xrCreateHandTrackerEXT(ulong session, XrHandTrackerCreateInfoEXT createInfo, out ulong handle) =>
m_xrCreateHandTrackerEXT(session, createInfo, out handle);
private delegate int xrDestroyHandTrackerEXTDelegate(ulong handTracker);
private xrDestroyHandTrackerEXTDelegate m_xrDestroyHandTrackerEXT;
public int xrDestroyHandTrackerEXT(ulong handle) =>
m_xrDestroyHandTrackerEXT(handle);
private delegate int xrLocateHandJointsEXTDelegate(ulong handTracker,ref XrHandJointsLocateInfoEXT locateInfo, ref XrHandJointLocationsEXT locations);
private xrLocateHandJointsEXTDelegate m_xrLocateHandJointsEXT;
public int xrLocateHandJointsEXT(ulong handTracker,ref XrHandJointsLocateInfoEXT locateInfo, ref XrHandJointLocationsEXT locations) =>
m_xrLocateHandJointsEXT(handTracker,ref locateInfo, ref locations);
public unsafe bool SystemSupportsHandTracking(out XrResult result)
{
var handTrackingSystemProp = new XrSystemHandTrackingPropertiesEXT()
{
type = XrStructureType.XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT,
next = IntPtr.Zero,
};
var systemProp = new XrSystemProperties()
{
type = XrStructureType.XR_TYPE_SYSTEM_PROPERTIES,
next = (IntPtr)(&handTrackingSystemProp),
};
result = (XrResult)xrGetSystemProperties(XrInstance, SystemId, ref systemProp);
return result == XrResult.XR_SUCCESS && handTrackingSystemProp.supportsHandTracking != 0u;
}
public bool TryGetSupportedReferenceSpaceTypeCount(out int count, out XrResult result)
{
result = (XrResult)m_xrEnumerateReferenceSpaces2(XrSession, 0, out count, IntPtr.Zero);
return result == XrResult.XR_SUCCESS;
}
public bool TryGetSupportedReferenceSpaceTypes(XrReferenceSpaceType[] spaces, out XrResult result)
{
if (spaces == null || spaces.Length == 0)
{
result = default;
return true;
}
result = (XrResult)m_xrEnumerateReferenceSpaces2(XrSession, spaces.Length, out _, ArrayPtr(spaces));
return result == XrResult.XR_SUCCESS;
}
public bool TryGetSupportedReferenceSpaceType(XrReferenceSpaceType preferType, out XrReferenceSpaceType supportedType, out XrResult result)
{
supportedType = default;
if (!TryGetSupportedReferenceSpaceTypeCount(out var count, out result)) { return false; }
if (count == 0) { return false; } // FIXME: error code?
var spaces = new XrReferenceSpaceType[count];
if (!TryGetSupportedReferenceSpaceTypes(spaces, out result)) { return false; }
for (int i = 0; i < count; ++i)
{
supportedType = spaces[i];
if (supportedType == preferType) { break; }
}
return true;
}
public bool TryCreateReferenceSpace(XrReferenceSpaceType refSpaceType, XrVector3f position, XrQuaternionf orientation, out ulong handle, out XrResult result)
{
var createInfo = new XrReferenceSpaceCreateInfo()
{
type = XrStructureType.XR_TYPE_REFERENCE_SPACE_CREATE_INFO,
next = IntPtr.Zero,
referencespacetype = refSpaceType,
poseInReferenceSpace = new XrPosef()
{
position = position,
orientation = orientation,
},
};
result = (XrResult)xrCreateReferenceSpace(XrSession, ref createInfo, out handle);
return result == XrResult.XR_SUCCESS;
}
public bool TryDestroyReferenceSpace(ulong handle, out XrResult result)
{
result = (XrResult)xrDestroySpace(handle);
return result == XrResult.XR_SUCCESS;
}
public bool TryCreateHandTracker(XrHandEXT hand, out ulong handle, out XrResult result, XrHandJointSetEXT jointSet = XrHandJointSetEXT.XR_HAND_JOINT_SET_DEFAULT_EXT)
{
var createInfo = new XrHandTrackerCreateInfoEXT()
{
type = XrStructureType.XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT,
next = IntPtr.Zero,
hand = hand,
handJointSet = XrHandJointSetEXT.XR_HAND_JOINT_SET_DEFAULT_EXT,
};
result = (XrResult)xrCreateHandTrackerEXT(XrSession, createInfo, out handle);
return result == XrResult.XR_SUCCESS;
}
public bool TryDestroyHandTracker(ulong handle, out XrResult result)
{
result = (XrResult)xrDestroyHandTrackerEXT(handle);
return result == XrResult.XR_SUCCESS;
}
public bool TryLocateHandJoints(ulong handle, ulong space, out bool isActive, XrHandJointLocationEXT[] locationArray, out XrResult result)
{
return TryLocateHandJoints(handle, space, out isActive, locationArray, null, out result);
}
public bool TryLocateHandJoints(ulong handle, ulong space, out bool isActive, XrHandJointLocationEXT[] locationArray, XrHandJointVelocityEXT[] velocityArray, out XrResult result)
{
return TryLocateHandJoints(handle, space, IntPtr.Zero, out isActive, locationArray, velocityArray, out result);
}
public bool TryLocateHandJoints(ulong handle, ulong space, ref XrHandJointsMotionRangeEXT motionRange, out bool isActive, XrHandJointLocationEXT[] locationArray, out XrResult result)
{
return TryLocateHandJoints(handle, space, ref motionRange, out isActive, locationArray, null, out result);
}
public unsafe bool TryLocateHandJoints(ulong handle, ulong space, ref XrHandJointsMotionRangeEXT motionRange, out bool isActive, XrHandJointLocationEXT[] locationArray, XrHandJointVelocityEXT[] velocityArray, out XrResult result)
{
var motionRangeInfo = new XrHandJointsMotionRangeInfoEXT()
{
type = XrStructureType.XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT,
next = IntPtr.Zero,
handJointsMotionRange = motionRange,
};
bool res = TryLocateHandJoints(handle, space, (IntPtr)(&motionRangeInfo), out isActive, locationArray, velocityArray, out result);
motionRange = motionRangeInfo.handJointsMotionRange;
return res;
}
private unsafe bool TryLocateHandJoints(ulong handle, ulong space, IntPtr motionRangeInfo, out bool isActive, XrHandJointLocationEXT[] locationArray, XrHandJointVelocityEXT[] velocityArray, out XrResult result)
{
var locateInfo = new XrHandJointsLocateInfoEXT()
{
type = XrStructureType.XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT,
next = motionRangeInfo,
baseSpace = space,
time = m_frameState.predictedDisplayTime, //An arbitrary number greater than 0
};
var locVelocitiesPtr = IntPtr.Zero;
if (velocityArray != null)
{
var locVelocities = new XrHandJointVelocitiesEXT()
{
type = XrStructureType.XR_TYPE_HAND_JOINT_VELOCITIES_EXT,
next = IntPtr.Zero,
jointCount = (uint)velocityArray.Length,
jointVelocities = ArrayPtr(velocityArray)
};
locVelocitiesPtr = (IntPtr)(&locVelocities);
}
var locations = new XrHandJointLocationsEXT()
{
type = XrStructureType.XR_TYPE_HAND_JOINT_LOCATIONS_EXT,
next = locVelocitiesPtr,
jointCount = locationArray == null ? 0 : locationArray.Length,
jointLocations = ArrayPtr(locationArray),
};
result = (XrResult)xrLocateHandJointsEXT(handle,ref locateInfo, ref locations);
isActive = locations.isActive != 0u;
return result == XrResult.XR_SUCCESS;
}
private unsafe static IntPtr ArrayPtr(XrReferenceSpaceType[] array)
{
if (array == null) { return IntPtr.Zero; }
fixed (XrReferenceSpaceType* p = array) { return (IntPtr)p; }
}
private unsafe static IntPtr ArrayPtr(XrHandJointLocationEXT[] array)
{
if (array == null) { return IntPtr.Zero; }
fixed (XrHandJointLocationEXT* p = array) { return (IntPtr)p; }
}
private unsafe static IntPtr ArrayPtr(XrHandJointVelocityEXT[] array)
{
if (array == null) { return IntPtr.Zero; }
fixed (XrHandJointVelocityEXT* p = array) { return (IntPtr)p; }
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 38169f0e301608a469f311ebb2233162
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: