parent
333fae2309
commit
28659f0c4e
|
@ -29872,3 +29872,10 @@ AnimationClip:
|
||||||
floatParameter: 0
|
floatParameter: 0
|
||||||
intParameter: 0
|
intParameter: 0
|
||||||
messageOptions: 0
|
messageOptions: 0
|
||||||
|
- time: 5.233333
|
||||||
|
functionName: SetBasePosPoint
|
||||||
|
data:
|
||||||
|
objectReferenceParameter: {fileID: 0}
|
||||||
|
floatParameter: 0
|
||||||
|
intParameter: 0
|
||||||
|
messageOptions: 0
|
||||||
|
|
|
@ -989,7 +989,8 @@ MonoBehaviour:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
backgroundImage: {fileID: 21300000, guid: fa5ad33758d1e094b91bd2a227631ec5, type: 3}
|
backgroundImage: {fileID: 21300000, guid: fa5ad33758d1e094b91bd2a227631ec5, type: 3}
|
||||||
buttonTitle: Meditation
|
buttonTitle: Meditation
|
||||||
buttonDescription: DESCRIPTION
|
buttonDescription: Spiritual Yoga, which can relieving mental stress, enhance your
|
||||||
|
focus
|
||||||
useCustomResources: 0
|
useCustomResources: 0
|
||||||
enableStatus: 1
|
enableStatus: 1
|
||||||
statusItem: 0
|
statusItem: 0
|
||||||
|
@ -1579,8 +1580,8 @@ RectTransform:
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 0}
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
m_AnchorMax: {x: 0, y: 0}
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
m_AnchoredPosition: {x: 0, y: 0}
|
m_AnchoredPosition: {x: 125, y: 0}
|
||||||
m_SizeDelta: {x: 0, y: 0}
|
m_SizeDelta: {x: 200, y: 0}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &3299300514319254663
|
--- !u!222 &3299300514319254663
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
|
@ -3998,8 +3999,8 @@ RectTransform:
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 0}
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
m_AnchorMax: {x: 0, y: 0}
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
m_AnchoredPosition: {x: 0, y: 0}
|
m_AnchoredPosition: {x: 125, y: 0}
|
||||||
m_SizeDelta: {x: 0, y: 0}
|
m_SizeDelta: {x: 200, y: 0}
|
||||||
m_Pivot: {x: 0.5, y: 0.5}
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!222 &1105460671971188788
|
--- !u!222 &1105460671971188788
|
||||||
CanvasRenderer:
|
CanvasRenderer:
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -449,8 +449,7 @@ MonoBehaviour:
|
||||||
m_RequiresDepthTextureOption: 2
|
m_RequiresDepthTextureOption: 2
|
||||||
m_RequiresOpaqueTextureOption: 2
|
m_RequiresOpaqueTextureOption: 2
|
||||||
m_CameraType: 0
|
m_CameraType: 0
|
||||||
m_Cameras:
|
m_Cameras: []
|
||||||
- {fileID: 1969623179}
|
|
||||||
m_RendererIndex: -1
|
m_RendererIndex: -1
|
||||||
m_VolumeLayerMask:
|
m_VolumeLayerMask:
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
|
@ -478,6 +477,53 @@ MonoBehaviour:
|
||||||
mipBias: 0
|
mipBias: 0
|
||||||
varianceClampScale: 0.9
|
varianceClampScale: 0.9
|
||||||
contrastAdaptiveSharpening: 0
|
contrastAdaptiveSharpening: 0
|
||||||
|
--- !u!1 &709787121
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 709787123}
|
||||||
|
- component: {fileID: 709787122}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: USBFaceDetectManager
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 0
|
||||||
|
--- !u!114 &709787122
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 709787121}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: b1a3af86bea67944b9cce9661ba1bfc6, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
image: {fileID: 1878964050}
|
||||||
|
cutImage: {fileID: 1838964607}
|
||||||
|
UVCFilters: []
|
||||||
|
--- !u!4 &709787123
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 709787121}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: -0.25406203, y: 2994.0242, z: -0.2102798}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1014002332
|
--- !u!1 &1014002332
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -491,7 +537,7 @@ GameObject:
|
||||||
- component: {fileID: 1014002335}
|
- component: {fileID: 1014002335}
|
||||||
- component: {fileID: 1014002334}
|
- component: {fileID: 1014002334}
|
||||||
- component: {fileID: 1014002339}
|
- component: {fileID: 1014002339}
|
||||||
- component: {fileID: 1014002338}
|
- component: {fileID: 1014002340}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: FaceDetectManager
|
m_Name: FaceDetectManager
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
|
@ -586,18 +632,6 @@ Transform:
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!114 &1014002338
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1014002332}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: 3d8102f8264d54f4099a5fd817383837, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
--- !u!114 &1014002339
|
--- !u!114 &1014002339
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -622,8 +656,8 @@ MonoBehaviour:
|
||||||
onInitialized:
|
onInitialized:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls:
|
m_Calls:
|
||||||
- m_Target: {fileID: 1014002338}
|
- m_Target: {fileID: 1014002340}
|
||||||
m_TargetAssemblyTypeName: FaceDetectManager, Assembly-CSharp
|
m_TargetAssemblyTypeName: WebCamFaceDetectManager, Assembly-CSharp
|
||||||
m_MethodName: OnWebCamTextureToMatHelperInitialized
|
m_MethodName: OnWebCamTextureToMatHelperInitialized
|
||||||
m_Mode: 1
|
m_Mode: 1
|
||||||
m_Arguments:
|
m_Arguments:
|
||||||
|
@ -637,8 +671,8 @@ MonoBehaviour:
|
||||||
onDisposed:
|
onDisposed:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls:
|
m_Calls:
|
||||||
- m_Target: {fileID: 1014002338}
|
- m_Target: {fileID: 1014002340}
|
||||||
m_TargetAssemblyTypeName: FaceDetectManager, Assembly-CSharp
|
m_TargetAssemblyTypeName: WebCamFaceDetectManager, Assembly-CSharp
|
||||||
m_MethodName: OnWebCamTextureToMatHelperDisposed
|
m_MethodName: OnWebCamTextureToMatHelperDisposed
|
||||||
m_Mode: 1
|
m_Mode: 1
|
||||||
m_Arguments:
|
m_Arguments:
|
||||||
|
@ -652,8 +686,8 @@ MonoBehaviour:
|
||||||
onErrorOccurred:
|
onErrorOccurred:
|
||||||
m_PersistentCalls:
|
m_PersistentCalls:
|
||||||
m_Calls:
|
m_Calls:
|
||||||
- m_Target: {fileID: 1014002338}
|
- m_Target: {fileID: 1014002340}
|
||||||
m_TargetAssemblyTypeName: FaceDetectManager, Assembly-CSharp
|
m_TargetAssemblyTypeName: WebCamFaceDetectManager, Assembly-CSharp
|
||||||
m_MethodName: OnWebCamTextureToMatHelperErrorOccurred
|
m_MethodName: OnWebCamTextureToMatHelperErrorOccurred
|
||||||
m_Mode: 0
|
m_Mode: 0
|
||||||
m_Arguments:
|
m_Arguments:
|
||||||
|
@ -665,6 +699,20 @@ MonoBehaviour:
|
||||||
m_BoolArgument: 0
|
m_BoolArgument: 0
|
||||||
m_CallState: 2
|
m_CallState: 2
|
||||||
avoidAndroidFrontCameraLowLightIssue: 0
|
avoidAndroidFrontCameraLowLightIssue: 0
|
||||||
|
--- !u!114 &1014002340
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1014002332}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 23c90b7e25f07ce4298ce424fedeb5e4, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
image: {fileID: 1878964050}
|
||||||
|
cutImage: {fileID: 1838964607}
|
||||||
--- !u!1 &1359769552
|
--- !u!1 &1359769552
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -760,6 +808,8 @@ RectTransform:
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 288140066}
|
- {fileID: 288140066}
|
||||||
|
- {fileID: 1878964052}
|
||||||
|
- {fileID: 1838964606}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
m_AnchorMin: {x: 0, y: 0}
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
@ -767,7 +817,7 @@ RectTransform:
|
||||||
m_AnchoredPosition: {x: 0, y: 0}
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
m_SizeDelta: {x: 0, y: 0}
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
m_Pivot: {x: 0, y: 0}
|
m_Pivot: {x: 0, y: 0}
|
||||||
--- !u!1 &1969623176
|
--- !u!1 &1838964605
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
@ -775,135 +825,142 @@ GameObject:
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 1969623180}
|
- component: {fileID: 1838964606}
|
||||||
- component: {fileID: 1969623179}
|
- component: {fileID: 1838964608}
|
||||||
- component: {fileID: 1969623178}
|
- component: {fileID: 1838964607}
|
||||||
- component: {fileID: 1969623177}
|
m_Layer: 5
|
||||||
m_Layer: 0
|
m_Name: 'CutRawImage '
|
||||||
m_Name: DebugCamera
|
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
m_Icon: {fileID: 0}
|
m_Icon: {fileID: 0}
|
||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
m_StaticEditorFlags: 0
|
m_StaticEditorFlags: 0
|
||||||
m_IsActive: 0
|
m_IsActive: 1
|
||||||
--- !u!114 &1969623177
|
--- !u!224 &1838964606
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1838964605}
|
||||||
|
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: 1359769556}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: 353.00073, y: -240}
|
||||||
|
m_SizeDelta: {x: -1515.9985, y: -520}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
|
--- !u!114 &1838964607
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 1969623176}
|
m_GameObject: {fileID: 1838964605}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_EditorHideFlags: 0
|
m_EditorHideFlags: 0
|
||||||
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
|
||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
m_RenderShadows: 1
|
m_Material: {fileID: 0}
|
||||||
m_RequiresDepthTextureOption: 2
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
m_RequiresOpaqueTextureOption: 2
|
m_RaycastTarget: 1
|
||||||
m_CameraType: 1
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
m_Cameras: []
|
m_Maskable: 1
|
||||||
m_RendererIndex: -1
|
m_OnCullStateChanged:
|
||||||
m_VolumeLayerMask:
|
m_PersistentCalls:
|
||||||
serializedVersion: 2
|
m_Calls: []
|
||||||
m_Bits: 1
|
m_Texture: {fileID: 0}
|
||||||
m_VolumeTrigger: {fileID: 0}
|
m_UVRect:
|
||||||
m_VolumeFrameworkUpdateModeOption: 2
|
|
||||||
m_RenderPostProcessing: 0
|
|
||||||
m_Antialiasing: 0
|
|
||||||
m_AntialiasingQuality: 2
|
|
||||||
m_StopNaN: 0
|
|
||||||
m_Dithering: 0
|
|
||||||
m_ClearDepth: 1
|
|
||||||
m_AllowXRRendering: 1
|
|
||||||
m_AllowHDROutput: 1
|
|
||||||
m_UseScreenCoordOverride: 0
|
|
||||||
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
|
||||||
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
|
||||||
m_RequiresDepthTexture: 0
|
|
||||||
m_RequiresColorTexture: 0
|
|
||||||
m_Version: 2
|
|
||||||
m_TaaSettings:
|
|
||||||
quality: 3
|
|
||||||
frameInfluence: 0.1
|
|
||||||
jitterScale: 1
|
|
||||||
mipBias: 0
|
|
||||||
varianceClampScale: 0.9
|
|
||||||
contrastAdaptiveSharpening: 0
|
|
||||||
--- !u!81 &1969623178
|
|
||||||
AudioListener:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1969623176}
|
|
||||||
m_Enabled: 1
|
|
||||||
--- !u!20 &1969623179
|
|
||||||
Camera:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1969623176}
|
|
||||||
m_Enabled: 1
|
|
||||||
serializedVersion: 2
|
|
||||||
m_ClearFlags: 4
|
|
||||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
|
||||||
m_projectionMatrixMode: 1
|
|
||||||
m_GateFitMode: 2
|
|
||||||
m_FOVAxisMode: 0
|
|
||||||
m_Iso: 200
|
|
||||||
m_ShutterSpeed: 0.005
|
|
||||||
m_Aperture: 16
|
|
||||||
m_FocusDistance: 10
|
|
||||||
m_FocalLength: 50
|
|
||||||
m_BladeCount: 5
|
|
||||||
m_Curvature: {x: 2, y: 11}
|
|
||||||
m_BarrelClipping: 0.25
|
|
||||||
m_Anamorphism: 0
|
|
||||||
m_SensorSize: {x: 36, y: 24}
|
|
||||||
m_LensShift: {x: 0, y: 0}
|
|
||||||
m_NormalizedViewPortRect:
|
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
x: 0
|
x: 0
|
||||||
y: 0
|
y: 0
|
||||||
width: 1
|
width: 1
|
||||||
height: 1
|
height: 1
|
||||||
near clip plane: 0.3
|
--- !u!222 &1838964608
|
||||||
far clip plane: 500
|
CanvasRenderer:
|
||||||
field of view: 23
|
|
||||||
orthographic: 0
|
|
||||||
orthographic size: 5
|
|
||||||
m_Depth: 0
|
|
||||||
m_CullingMask:
|
|
||||||
serializedVersion: 2
|
|
||||||
m_Bits: 1
|
|
||||||
m_RenderingPath: -1
|
|
||||||
m_TargetTexture: {fileID: 0}
|
|
||||||
m_TargetDisplay: 0
|
|
||||||
m_TargetEye: 3
|
|
||||||
m_HDR: 1
|
|
||||||
m_AllowMSAA: 1
|
|
||||||
m_AllowDynamicResolution: 0
|
|
||||||
m_ForceIntoRT: 0
|
|
||||||
m_OcclusionCulling: 1
|
|
||||||
m_StereoConvergence: 10
|
|
||||||
m_StereoSeparation: 0.022
|
|
||||||
--- !u!4 &1969623180
|
|
||||||
Transform:
|
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
m_PrefabInstance: {fileID: 0}
|
m_PrefabInstance: {fileID: 0}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 1969623176}
|
m_GameObject: {fileID: 1838964605}
|
||||||
serializedVersion: 2
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!1 &1878964049
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1878964052}
|
||||||
|
- component: {fileID: 1878964051}
|
||||||
|
- component: {fileID: 1878964050}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: RawImage
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &1878964050
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1878964049}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||||
|
m_RaycastTarget: 1
|
||||||
|
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_Maskable: 1
|
||||||
|
m_OnCullStateChanged:
|
||||||
|
m_PersistentCalls:
|
||||||
|
m_Calls: []
|
||||||
|
m_Texture: {fileID: 0}
|
||||||
|
m_UVRect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 0
|
||||||
|
y: 0
|
||||||
|
width: 1
|
||||||
|
height: 1
|
||||||
|
--- !u!222 &1878964051
|
||||||
|
CanvasRenderer:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1878964049}
|
||||||
|
m_CullTransparentMesh: 1
|
||||||
|
--- !u!224 &1878964052
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1878964049}
|
||||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
m_LocalPosition: {x: -3604, y: 481, z: 699}
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 1359769556}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 1, y: 1}
|
||||||
|
m_AnchoredPosition: {x: -529.30554, y: -240}
|
||||||
|
m_SizeDelta: {x: -1118.6111, y: -520}
|
||||||
|
m_Pivot: {x: 0.5, y: 0.5}
|
||||||
--- !u!1 &2144637746
|
--- !u!1 &2144637746
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -981,4 +1038,4 @@ SceneRoots:
|
||||||
- {fileID: 575233881}
|
- {fileID: 575233881}
|
||||||
- {fileID: 1359769556}
|
- {fileID: 1359769556}
|
||||||
- {fileID: 2144637749}
|
- {fileID: 2144637749}
|
||||||
- {fileID: 1969623180}
|
- {fileID: 709787123}
|
||||||
|
|
|
@ -165,7 +165,7 @@ public class OpenPoseEsimater : Estimator
|
||||||
|
|
||||||
if (!YogaManager.Instance.ActionCheckPoints(points))
|
if (!YogaManager.Instance.ActionCheckPoints(points))
|
||||||
{
|
{
|
||||||
LogPrint.Log("ActionCheckPoints failed. Re-Estimation.");
|
//LogPrint.Log("ActionCheckPoints failed. Re-Estimation.");
|
||||||
return false; //重新检测
|
return false; //重新检测
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -11,7 +11,7 @@ public class HoldPosition : PoseBase
|
||||||
if (points.Count < 2) // 0级实现逻辑 不做操作
|
if (points.Count < 2) // 0级实现逻辑 不做操作
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
var distance = Vector2.zero;
|
float distance = 0;
|
||||||
TimeSpan totalTimeSpan = TimeSpan.MinValue;
|
TimeSpan totalTimeSpan = TimeSpan.MinValue;
|
||||||
|
|
||||||
var startPoint = points.FirstOrDefault().Item2;
|
var startPoint = points.FirstOrDefault().Item2;
|
||||||
|
@ -29,7 +29,7 @@ public class HoldPosition : PoseBase
|
||||||
var p2 = points[i + 1].Item2;
|
var p2 = points[i + 1].Item2;
|
||||||
|
|
||||||
var vector = GetBasicVectorDirection(p1, p2);
|
var vector = GetBasicVectorDirection(p1, p2);
|
||||||
distance += vector;
|
distance += vector.magnitude;
|
||||||
|
|
||||||
TimeSpan timeSpan = points[i + 1].Item1 - points[i].Item1;
|
TimeSpan timeSpan = points[i + 1].Item1 - points[i].Item1;
|
||||||
totalTimeSpan = timeSpan;
|
totalTimeSpan = timeSpan;
|
||||||
|
@ -38,7 +38,7 @@ public class HoldPosition : PoseBase
|
||||||
LogPrint.Warning($"angle: {angle}", PrintLevel.Normal);
|
LogPrint.Warning($"angle: {angle}", PrintLevel.Normal);
|
||||||
LogPrint.Log($"distance: {distance}, totalTimeSpan: {totalTimeSpan}", PrintLevel.Normal);
|
LogPrint.Log($"distance: {distance}, totalTimeSpan: {totalTimeSpan}", PrintLevel.Normal);
|
||||||
|
|
||||||
return (angle < 10 || MovementValidation(distance, totalTimeSpan, 1).GetValueOrDefault());
|
return (angle < 8 && (distance/ points.Count < 8f));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Vector2 GetBasicVectorDirection(List<Point> startPoint, List<Point> endPoint)
|
public override Vector2 GetBasicVectorDirection(List<Point> startPoint, List<Point> endPoint)
|
||||||
|
@ -66,7 +66,7 @@ public class HoldPosition : PoseBase
|
||||||
|
|
||||||
//保持姿势不发生移动
|
//保持姿势不发生移动
|
||||||
|
|
||||||
if (distance.magnitude < 15f)//允许一定误差
|
if (distance.magnitude < 10f)//允许一定误差
|
||||||
{
|
{
|
||||||
//EventManager.Instance.Dispatch(YogaEventType.Action_Success);
|
//EventManager.Instance.Dispatch(YogaEventType.Action_Success);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -9,6 +9,7 @@ using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Xml.Serialization;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Rendering.Universal;
|
using UnityEngine.Rendering.Universal;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
@ -112,6 +113,10 @@ public class YogaManager : MonoSingleton<YogaManager>
|
||||||
_currentCheckPointSuccessCount = 0;
|
_currentCheckPointSuccessCount = 0;
|
||||||
_comboTimes = 0;
|
_comboTimes = 0;
|
||||||
|
|
||||||
|
_baseNose = -Vector2.one;
|
||||||
|
_baseLEye = -Vector2.one;
|
||||||
|
_baseREye = -Vector2.one;
|
||||||
|
|
||||||
//根据用户选择的动作索引,获取相应的资源
|
//根据用户选择的动作索引,获取相应的资源
|
||||||
LevelData = YogaDataLoader.LoadData(LevelIndex);
|
LevelData = YogaDataLoader.LoadData(LevelIndex);
|
||||||
EventManager.Instance.Dispatch(YogaEventType.UpdateProgress, CurrentCheckPointSuccessCount, CurrentCheckPointCount);
|
EventManager.Instance.Dispatch(YogaEventType.UpdateProgress, CurrentCheckPointSuccessCount, CurrentCheckPointCount);
|
||||||
|
@ -160,6 +165,7 @@ public class YogaManager : MonoSingleton<YogaManager>
|
||||||
}
|
}
|
||||||
private void OnActionFailed()
|
private void OnActionFailed()
|
||||||
{
|
{
|
||||||
|
_comboTimes = 0;
|
||||||
_currentCheckPointCount++;
|
_currentCheckPointCount++;
|
||||||
UpdateData();
|
UpdateData();
|
||||||
}
|
}
|
||||||
|
@ -240,6 +246,8 @@ public class YogaManager : MonoSingleton<YogaManager>
|
||||||
|
|
||||||
#region 事件监听
|
#region 事件监听
|
||||||
|
|
||||||
|
private AvatarAction _lastAction = AvatarAction.None;
|
||||||
|
private AvatarAction _currentAction = AvatarAction.None;
|
||||||
|
|
||||||
private void OnSamplingStart()
|
private void OnSamplingStart()
|
||||||
{
|
{
|
||||||
|
@ -258,13 +266,64 @@ public class YogaManager : MonoSingleton<YogaManager>
|
||||||
}
|
}
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
_lastAction = _currentAction;
|
||||||
AvatarAction actionType = (AvatarAction)args.FirstOrDefault();
|
AvatarAction actionType = (AvatarAction)args.FirstOrDefault();
|
||||||
var startTime = ActionStartTime;
|
var startTime = ActionStartTime;
|
||||||
_samplingResult = SampleQualityEvaluation(actionType, ActionStartTime, DateTime.Now);
|
_samplingResult = SampleQualityEvaluation(actionType, ActionStartTime, DateTime.Now);
|
||||||
|
_currentAction = actionType;
|
||||||
//只有hold动作检测
|
//只有hold动作检测
|
||||||
if (actionType == AvatarAction.Hold)
|
if (actionType == AvatarAction.Hold)
|
||||||
{
|
{
|
||||||
_samplingYogaResult = _samplingResult;
|
_samplingYogaResult = _samplingResult;
|
||||||
|
var pointList = _estimateKeyPointsCache.Where(x => x.Item1 >= startTime && x.Item1 <= DateTime.Now).ToList();
|
||||||
|
var nose = getAveragePointVector(pointList, "Nose");
|
||||||
|
var neck = getAveragePointVector(pointList, "Neck");
|
||||||
|
var LEye = getAveragePointVector(pointList, "LEye");
|
||||||
|
var REye = getAveragePointVector(pointList, "REye");
|
||||||
|
|
||||||
|
if (_lastAction == AvatarAction.HeadTurnLeft)
|
||||||
|
{
|
||||||
|
if (_baseNose == -Vector2.one)
|
||||||
|
return;
|
||||||
|
var angle = Mathf.Abs(Vector2.SignedAngle(Vector2.left, (nose - _baseNose)));
|
||||||
|
_samplingYogaResult = _samplingYogaResult.GetValueOrDefault() && (angle < 90);
|
||||||
|
}
|
||||||
|
else if (_lastAction == AvatarAction.HeadTurnRight)
|
||||||
|
{
|
||||||
|
if (_baseNose == -Vector2.one)
|
||||||
|
return;
|
||||||
|
var angle = Mathf.Abs(Vector2.SignedAngle(Vector2.right, (nose - _baseNose)));
|
||||||
|
_samplingYogaResult = _samplingYogaResult.GetValueOrDefault() && (angle < 90);
|
||||||
|
}
|
||||||
|
else if (_lastAction == AvatarAction.HeadTurnDown)
|
||||||
|
{
|
||||||
|
if (_baseNose == -Vector2.one)
|
||||||
|
return;
|
||||||
|
var angle = Mathf.Abs(Vector2.SignedAngle(Vector2.down, -(nose - _baseNose)));//坐标系起始点左上,取y轴位移时需取反
|
||||||
|
_samplingYogaResult = _samplingYogaResult.GetValueOrDefault() && (angle < 90);
|
||||||
|
}
|
||||||
|
else if (_lastAction == AvatarAction.HeadTurnUp)
|
||||||
|
{
|
||||||
|
if (_baseNose == -Vector2.one)
|
||||||
|
return;
|
||||||
|
var angle = Mathf.Abs(Vector2.SignedAngle(Vector2.up, -(nose - _baseNose))); //坐标系起始点左上,取y轴位移时需取反
|
||||||
|
_samplingYogaResult = _samplingYogaResult.GetValueOrDefault() && (angle < 90);
|
||||||
|
}
|
||||||
|
else if (_lastAction == AvatarAction.LeftLateralHead)
|
||||||
|
{
|
||||||
|
if (_baseLEye == -Vector2.one || _baseREye == -Vector2.one)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var angle = Vector2.SignedAngle((LEye - REye), (_baseLEye - _baseREye));
|
||||||
|
_samplingYogaResult = _samplingYogaResult.GetValueOrDefault() && (angle > 10);
|
||||||
|
}
|
||||||
|
else if (_lastAction == AvatarAction.RightLateralHead)
|
||||||
|
{
|
||||||
|
if (_baseLEye == -Vector2.one || _baseREye == -Vector2.one)
|
||||||
|
return;
|
||||||
|
var angle = Vector2.SignedAngle((LEye - REye), (_baseLEye - _baseREye));
|
||||||
|
_samplingYogaResult = _samplingYogaResult.GetValueOrDefault() && (angle < -10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
|
@ -359,4 +418,43 @@ public class YogaManager : MonoSingleton<YogaManager>
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Vector2 _baseNose = -Vector2.one;
|
||||||
|
private Vector2 _baseNeck = -Vector2.one;
|
||||||
|
private Vector2 _baseLEye = -Vector2.one;
|
||||||
|
private Vector2 _baseREye = -Vector2.one;
|
||||||
|
|
||||||
|
public void SetBasePosPoint()
|
||||||
|
{
|
||||||
|
//获取近1秒内所有关键点的平均值
|
||||||
|
var cacheCopy = new List<(DateTime, List<Point>)>(_estimateKeyPointsCache);
|
||||||
|
var poinsList = cacheCopy.Where(x => x.Item1 >= DateTime.Now.AddSeconds(-1) && x.Item1 <= DateTime.Now).ToList();
|
||||||
|
|
||||||
|
_baseNose = getAveragePointVector(poinsList, "Nose");
|
||||||
|
_baseNeck = getAveragePointVector(poinsList, "Neck");
|
||||||
|
_baseLEye = getAveragePointVector(poinsList, "LEye");
|
||||||
|
_baseREye = getAveragePointVector(poinsList, "REye");
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector2 getAveragePointVector(List<(DateTime, List<Point>)> poinsList, string partName)
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
Vector2 retVal = -Vector2.one;
|
||||||
|
Vector2 totalVector = Vector2.zero;
|
||||||
|
foreach (var item in poinsList)
|
||||||
|
{
|
||||||
|
Vector2 vector = partName.vector(item.Item2);
|
||||||
|
if (vector != -Vector2.one)
|
||||||
|
{
|
||||||
|
totalVector += vector;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (index != 0)
|
||||||
|
{
|
||||||
|
retVal = totalVector / index;
|
||||||
|
}
|
||||||
|
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
|
using OpenCVCompact;
|
||||||
using OpenCVForUnity.CoreModule;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
public class PictureUtility
|
public class PictureUtility
|
||||||
|
@ -30,27 +29,114 @@ public class PictureUtility
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Mat HorizontalFlipMat(Mat mat)
|
public static OpenCVForUnity.CoreModule.Mat HorizontalFlipMat(OpenCVForUnity.CoreModule.Mat mat)
|
||||||
{
|
{
|
||||||
Mat dst = new Mat();
|
OpenCVForUnity.CoreModule.Mat dst = new OpenCVForUnity.CoreModule.Mat();
|
||||||
Core.flip(mat, dst, 1);
|
OpenCVForUnity.CoreModule.Core.flip(mat, dst, 1);
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
//纠正鱼眼透视畸变
|
//纠正鱼眼透视畸变
|
||||||
public static Mat Undistort(Mat src)
|
public static OpenCVForUnity.CoreModule.Mat Undistort(OpenCVForUnity.CoreModule.Mat src)
|
||||||
{
|
{
|
||||||
//摄像机的4个畸变系数:k1,k2,k3,k4
|
//摄像机的4个畸变系数:k1,k2,k3,k4
|
||||||
Mat K = new Mat(3, 3, CvType.CV_64FC1);
|
OpenCVForUnity.CoreModule.Mat K = new OpenCVForUnity.CoreModule.Mat(3, 3, OpenCVForUnity.CoreModule.CvType.CV_64FC1);
|
||||||
K.put(0, 0, 1151.7, 0, 985.6, 0, 1153.4, 573.004, 0, 0, 1);
|
K.put(0, 0, 1151.7, 0, 985.6, 0, 1153.4, 573.004, 0, 0, 1);
|
||||||
|
|
||||||
Mat D = new Mat(5, 1, CvType.CV_64FC1);
|
OpenCVForUnity.CoreModule.Mat D = new OpenCVForUnity.CoreModule.Mat(5, 1, OpenCVForUnity.CoreModule.CvType.CV_64FC1);
|
||||||
//D.put(0, 0, -0.42, 0.2196, 0.0038, 0.013, -0.06);
|
//D.put(0, 0, -0.42, 0.2196, 0.0038, 0.013, -0.06);
|
||||||
D.put(0, 0, -0.01, 0.09, 0, 0, -0.19);
|
D.put(0, 0, -0.01, 0.09, 0, 0, -0.19);
|
||||||
|
|
||||||
Mat retVal = src.clone();
|
OpenCVForUnity.CoreModule.Mat retVal = src.clone();
|
||||||
OpenCVForUnity.Calib3dModule.Calib3d.undistort(src, retVal, K, D);
|
OpenCVForUnity.Calib3dModule.Calib3d.undistort(src, retVal, K, D);
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static OpenCVCompact.Mat GetROIRect(OpenCVCompact.Mat bgrMat, out int[] roiRegion)
|
||||||
|
{
|
||||||
|
OpenCVCompact.Rect roiRect;
|
||||||
|
roiRegion = GetPositionRect(bgrMat.width(), bgrMat.height());
|
||||||
|
roiRect = new OpenCVCompact.Rect(
|
||||||
|
(int)roiRegion[0],
|
||||||
|
(int)roiRegion[1],
|
||||||
|
Mathf.Abs((int)(roiRegion[2] - roiRegion[0])),
|
||||||
|
Mathf.Abs((int)(roiRegion[3] - roiRegion[1])));
|
||||||
|
OpenCVCompact.Mat personRectImg = new OpenCVCompact.Mat(bgrMat, roiRect);
|
||||||
|
return personRectImg;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int[] GetPositionRect(int width, int height)
|
||||||
|
{
|
||||||
|
int[] retVal = new int[4];
|
||||||
|
int shift = (int)(width / 2 * 0.2f);
|
||||||
|
if (!GlobalData.Instance.IsDriverPosition) //副驾驶
|
||||||
|
{
|
||||||
|
retVal[0] = 0; //left
|
||||||
|
retVal[1] = 0; //top
|
||||||
|
retVal[2] = (width / 2) - shift; //right
|
||||||
|
retVal[3] = height; //bottom
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retVal[0] = (width / 2) + shift; //left
|
||||||
|
retVal[1] = 0; //top
|
||||||
|
retVal[2] = width; //right
|
||||||
|
retVal[3] = height; //bottom
|
||||||
|
}
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DrawAimBox(OpenCVForUnity.CoreModule.Mat img, float[] box, float shift, int lineLength)
|
||||||
|
{
|
||||||
|
float left = box[0] + shift;
|
||||||
|
float top = box[1] + shift;
|
||||||
|
float right = box[2] - shift;
|
||||||
|
float bottom = box[3] - shift;
|
||||||
|
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.cvtColor(img, img, OpenCVForUnity.ImgprocModule.Imgproc.COLOR_RGBA2RGB);
|
||||||
|
|
||||||
|
//界面蓝 RGB = 19, 115, 230
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.rectangle(img, new OpenCVForUnity.CoreModule.Point(left, top), new OpenCVForUnity.CoreModule.Point(right, bottom), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 50), 2, 3);
|
||||||
|
//右下角
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(right, bottom), new OpenCVForUnity.CoreModule.Point(right - lineLength, bottom), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(right, bottom), new OpenCVForUnity.CoreModule.Point(right, bottom - lineLength), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
//左下角
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(left, bottom), new OpenCVForUnity.CoreModule.Point(left + lineLength, bottom), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(left, bottom), new OpenCVForUnity.CoreModule.Point(left, bottom - lineLength), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
//右上角
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(right, top), new OpenCVForUnity.CoreModule.Point(right - lineLength, top), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(right, top), new OpenCVForUnity.CoreModule.Point(right, top + lineLength), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
//左上角
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(left, top), new OpenCVForUnity.CoreModule.Point(left + lineLength, top), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.line(img, new OpenCVForUnity.CoreModule.Point(left, top), new OpenCVForUnity.CoreModule.Point(left, top + lineLength), new OpenCVForUnity.CoreModule.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVForUnity.ImgprocModule.Imgproc.cvtColor(img, img, OpenCVForUnity.ImgprocModule.Imgproc.COLOR_RGB2RGBA);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DrawAimBoxFaceDetect(OpenCVCompact.Mat img, float[] box, float shift, int lineLength)
|
||||||
|
{
|
||||||
|
float left = box[0] + shift;
|
||||||
|
float top = box[1] + shift;
|
||||||
|
float right = box[2] - shift;
|
||||||
|
float bottom = box[3] - shift;
|
||||||
|
|
||||||
|
OpenCVCompact.Imgproc.cvtColor(img, img, OpenCVCompact.Imgproc.COLOR_RGBA2RGB);
|
||||||
|
|
||||||
|
//界面蓝 RGB = 19, 115, 230
|
||||||
|
OpenCVCompact.Imgproc.rectangle(img, new OpenCVCompact.Point(left, top), new OpenCVCompact.Point(right, bottom), new OpenCVCompact.Scalar(255, 255, 255, 50), 2, 3);
|
||||||
|
//右下角
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(right, bottom), new OpenCVCompact.Point(right - lineLength, bottom), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(right, bottom), new OpenCVCompact.Point(right, bottom - lineLength), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
//左下角
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(left, bottom), new OpenCVCompact.Point(left + lineLength, bottom), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(left, bottom), new OpenCVCompact.Point(left, bottom - lineLength), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
//右上角
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(right, top), new OpenCVCompact.Point(right - lineLength, top), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(right, top), new OpenCVCompact.Point(right, top + lineLength), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
//左上角
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(left, top), new OpenCVCompact.Point(left + lineLength, top), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVCompact.Imgproc.line(img, new OpenCVCompact.Point(left, top), new OpenCVCompact.Point(left, top + lineLength), new OpenCVCompact.Scalar(255, 255, 255, 255), 10, 3);
|
||||||
|
OpenCVCompact.Imgproc.cvtColor(img, img, OpenCVCompact.Imgproc.COLOR_RGB2RGBA);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -81,14 +81,8 @@ namespace Yoga
|
||||||
|
|
||||||
if (YogaManager.Instance.PersonRectResult.Count > 0)
|
if (YogaManager.Instance.PersonRectResult.Count > 0)
|
||||||
{
|
{
|
||||||
var box = YogaManager.Instance.PersonRectResult[0];
|
|
||||||
float left = box[0];
|
|
||||||
float top = box[1];
|
|
||||||
float right = box[2];
|
|
||||||
float bottom = box[3];
|
|
||||||
//Imgproc.rectangle(img, new Point(left, top), new Point(right, bottom), new Scalar(0, 0, 255), 5, 3);
|
//Imgproc.rectangle(img, new Point(left, top), new Point(right, bottom), new Scalar(0, 0, 255), 5, 3);
|
||||||
|
PictureUtility.DrawAimBox(img, YogaManager.Instance.PersonRectResult[0], 10, 40);
|
||||||
DrawAimBox(img, left + 10, top + 10, right - 10, bottom - 10, 40);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//打印
|
//打印
|
||||||
|
@ -125,26 +119,7 @@ namespace Yoga
|
||||||
Utils.matToTexture2D(img, DisplayTexture);
|
Utils.matToTexture2D(img, DisplayTexture);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DrawAimBox(Mat img, float left, float top, float right, float bottom, int lineLength)
|
|
||||||
{
|
|
||||||
Imgproc.cvtColor(img, img, Imgproc.COLOR_RGBA2RGB);
|
|
||||||
|
|
||||||
//界面蓝 RGB = 19, 115, 230
|
|
||||||
Imgproc.rectangle(img, new Point(left, top), new Point(right, bottom), new Scalar(255, 255, 255, 50), 2, 3);
|
|
||||||
//右下角
|
|
||||||
Imgproc.line(img, new Point(right, bottom), new Point(right - lineLength, bottom), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
Imgproc.line(img, new Point(right, bottom), new Point(right, bottom - lineLength), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
//左下角
|
|
||||||
Imgproc.line(img, new Point(left, bottom), new Point(left + lineLength, bottom), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
Imgproc.line(img, new Point(left, bottom), new Point(left, bottom - lineLength), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
//右上角
|
|
||||||
Imgproc.line(img, new Point(right, top), new Point(right - lineLength, top), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
Imgproc.line(img, new Point(right, top), new Point(right, top + lineLength), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
//左上角
|
|
||||||
Imgproc.line(img, new Point(left, top), new Point(left + lineLength, top), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
Imgproc.line(img, new Point(left, top), new Point(left, top + lineLength), new Scalar(255, 255, 255, 255), 10, 3);
|
|
||||||
Imgproc.cvtColor(img, img, Imgproc.COLOR_RGB2RGBA);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnDestroy()
|
private void OnDestroy()
|
||||||
{
|
{
|
||||||
|
|
|
@ -2,28 +2,25 @@
|
||||||
using OpenCVCompact;
|
using OpenCVCompact;
|
||||||
using System;
|
using System;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using OpenCVForUnity.UnityUtils.Helper;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using OpenCVForUnity.UnityUtils.Helper;
|
||||||
|
using dnn;
|
||||||
|
|
||||||
[RequireComponent(typeof(OpenCVCompact.WebCamTextureToMatHelper))]
|
public abstract class FaceDetectManagerBase : MonoBehaviour
|
||||||
public class FaceDetectManager : MonoBehaviour
|
|
||||||
{
|
{
|
||||||
//Related To DNN Model
|
//Related To DNN Model
|
||||||
dnn.DNNUtils dnnUtils;
|
protected dnn.DNNUtils dnnUtils;
|
||||||
|
|
||||||
//Image Capture
|
protected Texture2D videoTexture;
|
||||||
OpenCVCompact.WebCamTextureToMatHelper _webCamTextureToMatHelper;
|
protected double _lndmrkEstScore;
|
||||||
Texture2D videoTexture;
|
protected Mat mat4Process;
|
||||||
private double _lndmrkEstScore;
|
protected Mat grayMat4Process;
|
||||||
private Mat mat4Process;
|
protected Mat mat4Display;
|
||||||
private Mat grayMat4Process;
|
protected Mat mat4DisplayTexture;
|
||||||
private Mat mat4Display;
|
protected Mat lndmrk;
|
||||||
private Mat mat4DisplayTexture;
|
protected MatOfRect detectionResult;
|
||||||
private Mat lndmrk;
|
protected Rect detectRect;
|
||||||
private MatOfRect detectionResult;
|
protected int[] faceRect = new int[4];
|
||||||
private Rect detectRect;
|
|
||||||
int[] faceRect = new int[4];
|
|
||||||
bool webCamReady = false;
|
|
||||||
|
|
||||||
//int webCamOrVideoOrImage = 0; //0 : webcam, 1 : video, 2 : image
|
//int webCamOrVideoOrImage = 0; //0 : webcam, 1 : video, 2 : image
|
||||||
int lndmrkMode = 1; //0: 51, 1: 84
|
int lndmrkMode = 1; //0: 51, 1: 84
|
||||||
|
@ -32,7 +29,7 @@ public class FaceDetectManager : MonoBehaviour
|
||||||
|
|
||||||
float lndmrkEstScore;
|
float lndmrkEstScore;
|
||||||
|
|
||||||
private FaceDetectUI panel;
|
protected FaceDetectUI panel;
|
||||||
|
|
||||||
// Start is called before the first frame update
|
// Start is called before the first frame update
|
||||||
void Awake()
|
void Awake()
|
||||||
|
@ -42,9 +39,7 @@ public class FaceDetectManager : MonoBehaviour
|
||||||
|
|
||||||
InitModel();
|
InitModel();
|
||||||
InitVariable();
|
InitVariable();
|
||||||
|
InitMatHelper();
|
||||||
_webCamTextureToMatHelper = gameObject.GetComponent<OpenCVCompact.WebCamTextureToMatHelper>();
|
|
||||||
_webCamTextureToMatHelper.Initialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDestroy()
|
private void OnDestroy()
|
||||||
|
@ -73,8 +68,10 @@ public class FaceDetectManager : MonoBehaviour
|
||||||
//if (probExp != null)
|
//if (probExp != null)
|
||||||
// probExp.Dispose();
|
// probExp.Dispose();
|
||||||
|
|
||||||
_webCamTextureToMatHelper.Dispose();
|
|
||||||
}
|
}
|
||||||
|
protected abstract void InitMatHelper();
|
||||||
|
|
||||||
|
protected abstract void DestroyManager();
|
||||||
|
|
||||||
private void InitVariable()
|
private void InitVariable()
|
||||||
{
|
{
|
||||||
|
@ -176,29 +173,31 @@ public class FaceDetectManager : MonoBehaviour
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AnalyzingFace()
|
protected abstract Mat GetMat();
|
||||||
{
|
|
||||||
if (!_webCamTextureToMatHelper.IsPlaying() || !_webCamTextureToMatHelper.DidUpdateThisFrame())
|
|
||||||
return;
|
|
||||||
|
|
||||||
mat4Display = _webCamTextureToMatHelper.GetMat();
|
//update
|
||||||
|
protected virtual void AnalyzingFace()
|
||||||
|
{
|
||||||
|
mat4Display = GetMat();
|
||||||
|
if (mat4Display == null)
|
||||||
|
return;
|
||||||
//mat4Display.copyTo(mat4Process);
|
//mat4Display.copyTo(mat4Process);
|
||||||
mat4Process = mat4Display.clone();
|
|
||||||
|
|
||||||
|
mat4Process = PictureUtility.GetROIRect(mat4Display.clone(), out var roiRegion);
|
||||||
|
|
||||||
//Face Detect
|
//Face Detect
|
||||||
panel.RefreshData(LandmarkDetect());
|
panel.RefreshData(LandmarkDetect());
|
||||||
|
|
||||||
if (webCamReady == true)
|
var point1 = new Point(roiRegion[0], roiRegion[1]);
|
||||||
{
|
var point2 = new Point(roiRegion[0] + roiRegion[2], roiRegion[0] + roiRegion[3]);
|
||||||
if (mat4Display.rows() == videoTexture.height)
|
Imgproc.rectangle(mat4Display, point1, point2, new Scalar(255, 0, 0), 2);
|
||||||
{
|
DebugPint();
|
||||||
mat4Display.copyTo(mat4DisplayTexture);
|
|
||||||
Utils.matToTexture2D(mat4DisplayTexture, videoTexture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dictionary<string, string> LandmarkDetect()
|
protected abstract void DebugPint();
|
||||||
|
|
||||||
|
protected Dictionary<string, string> LandmarkDetect()
|
||||||
{
|
{
|
||||||
if (dnnUtils.GetEstimateLandmarkSuccessOrNot() == false || lndmrkEstScore < 0.25) //If It Failed To Track Facial Landmark in Previous Frame
|
if (dnnUtils.GetEstimateLandmarkSuccessOrNot() == false || lndmrkEstScore < 0.25) //If It Failed To Track Facial Landmark in Previous Frame
|
||||||
{
|
{
|
||||||
|
@ -242,55 +241,9 @@ public class FaceDetectManager : MonoBehaviour
|
||||||
|
|
||||||
idx = idx + 1;
|
idx = idx + 1;
|
||||||
}
|
}
|
||||||
LogPrint.Warning(text.Substring(0, text.Length - 1));
|
|
||||||
}
|
}
|
||||||
prob.Dispose();
|
prob.Dispose();
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnWebCamTextureToMatHelperInitialized()
|
|
||||||
{
|
|
||||||
Mat webCamTextureMat = _webCamTextureToMatHelper.GetMat();
|
|
||||||
|
|
||||||
videoTexture = new Texture2D(webCamTextureMat.cols(), webCamTextureMat.rows(), TextureFormat.RGBA32, false);
|
|
||||||
gameObject.GetComponent<Renderer>().material.mainTexture = videoTexture;
|
|
||||||
gameObject.transform.localScale = new Vector3(webCamTextureMat.cols(), webCamTextureMat.rows(), 1);
|
|
||||||
|
|
||||||
mat4Display = new Mat(webCamTextureMat.rows(), webCamTextureMat.cols(), CvType.CV_8UC4);
|
|
||||||
mat4DisplayTexture = new Mat(webCamTextureMat.rows(), webCamTextureMat.cols(), CvType.CV_8UC4);
|
|
||||||
|
|
||||||
LogPrint.Log("Screen.width " + Screen.width + " Screen.height " + Screen.height + " Screen.orientation " + Screen.orientation);
|
|
||||||
|
|
||||||
float width = webCamTextureMat.width();
|
|
||||||
float height = webCamTextureMat.height();
|
|
||||||
|
|
||||||
float widthScale = (float)Screen.width / width;
|
|
||||||
float heightScale = (float)Screen.height / height;
|
|
||||||
if (widthScale < heightScale)
|
|
||||||
{
|
|
||||||
Camera.main.orthographicSize = (width * (float)Screen.height / (float)Screen.width) / 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Camera.main.orthographicSize = height / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
dnnUtils.InitHeadPoseEstimationCameraInfo(webCamTextureMat.cols(), webCamTextureMat.rows());
|
|
||||||
|
|
||||||
webCamReady = true;
|
|
||||||
LogPrint.Log("OnWebCamTextureToMatHelperInitialized");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void OnWebCamTextureToMatHelperDisposed()
|
|
||||||
{
|
|
||||||
LogPrint.Log("OnWebCamTextureToMatHelperDisposed");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnWebCamTextureToMatHelperErrorOccurred(OpenCVCompact.WebCamTextureToMatHelper.ErrorCode errorCode)
|
|
||||||
{
|
|
||||||
LogPrint.Log("OnWebCamTextureToMatHelperErrorOccurred " + errorCode);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -12,23 +12,22 @@ public class GudieAnimationManager : MonoBehaviour
|
||||||
|
|
||||||
private List<string> _actionNameList = new List<string>();
|
private List<string> _actionNameList = new List<string>();
|
||||||
|
|
||||||
private float _animationLength = 0;
|
|
||||||
public float AnimationLength
|
public float AnimationLength
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_animationLength == 0)
|
float length = 0;
|
||||||
|
AnimationClip[] clips = Animator.runtimeAnimatorController.animationClips;
|
||||||
|
foreach (AnimationClip clip in clips)
|
||||||
{
|
{
|
||||||
AnimationClip[] clips = Animator.runtimeAnimatorController.animationClips;
|
if (ActionNameList.Contains(clip.name))
|
||||||
foreach (AnimationClip clip in clips)
|
|
||||||
{
|
{
|
||||||
if (ActionNameList.Contains(clip.name))
|
length += clip.length;
|
||||||
{
|
LogPrint.Log("clip.name:" + clip.name + " clip.length:" + clip.length);
|
||||||
_animationLength += clip.length;
|
LogPrint.Log("length:" + length);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return _animationLength;
|
return length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +47,10 @@ public class GudieAnimationManager : MonoBehaviour
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_actionNameList.Count == 0)
|
if (_actionNameList.Count != YogaManager.Instance.LevelData.Actions.Count)
|
||||||
{
|
{
|
||||||
foreach (var item in _actionList)
|
_actionNameList.Clear();
|
||||||
|
foreach (var item in YogaManager.Instance.LevelData.Actions)
|
||||||
{
|
{
|
||||||
_actionNameList.Add(item.ToString());
|
_actionNameList.Add(item.ToString());
|
||||||
}
|
}
|
||||||
|
@ -77,17 +77,6 @@ public class GudieAnimationManager : MonoBehaviour
|
||||||
{
|
{
|
||||||
_actionList = actionList;
|
_actionList = actionList;
|
||||||
|
|
||||||
AnimationClip[] clips = Animator.runtimeAnimatorController.animationClips;
|
|
||||||
_animationLength = 0;
|
|
||||||
foreach (AnimationClip clip in clips)
|
|
||||||
{
|
|
||||||
if (_actionNameList.Contains(clip.name))
|
|
||||||
{
|
|
||||||
_animationLength += clip.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Play(Enum.GetName(typeof(AvatarAction), _actionList[YogaManager.Instance.ActionIndex]));
|
Play(Enum.GetName(typeof(AvatarAction), _actionList[YogaManager.Instance.ActionIndex]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,7 +86,7 @@ public class GudieAnimationManager : MonoBehaviour
|
||||||
return;
|
return;
|
||||||
|
|
||||||
//当未达到指标且动画播放完毕时,重新播放
|
//当未达到指标且动画播放完毕时,重新播放
|
||||||
if (Animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f)
|
if (Animator.GetCurrentAnimatorStateInfo(0).normalizedTime >= 1.0f && GetCurrentAnimationName().Equals(Enum.GetName(typeof(AvatarAction), _actionList[YogaManager.Instance.ActionIndex])))
|
||||||
{
|
{
|
||||||
//如果列表动画index小于列表长度,播放下一个动画
|
//如果列表动画index小于列表长度,播放下一个动画
|
||||||
YogaManager.Instance.ActionIndex++;
|
YogaManager.Instance.ActionIndex++;
|
||||||
|
|
|
@ -0,0 +1,196 @@
|
||||||
|
using OpenCVCompact;
|
||||||
|
using Serenegiant.UVC;
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
public class USBFaceDetectManager : FaceDetectManagerBase, IUVCDrawer
|
||||||
|
{
|
||||||
|
public RawImage image;
|
||||||
|
public RawImage cutImage;
|
||||||
|
private Material _flipImg;
|
||||||
|
private int[] _positionRect;
|
||||||
|
private Texture2D _cutTexture;
|
||||||
|
protected override void InitMatHelper()
|
||||||
|
{
|
||||||
|
_flipImg = new Material(Shader.Find("Unlit/FlipHorizontal")); ;
|
||||||
|
InvokeRepeating("GCCollection", 0, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void GCCollection()
|
||||||
|
{
|
||||||
|
if (enabled == true && gameObject.activeInHierarchy == true)
|
||||||
|
StartCoroutine(CleanUp());
|
||||||
|
}
|
||||||
|
protected IEnumerator CleanUp()
|
||||||
|
{
|
||||||
|
GC.Collect();
|
||||||
|
yield return Resources.UnloadUnusedAssets();
|
||||||
|
GC.Collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Mat GetMat()
|
||||||
|
{
|
||||||
|
Mat img = null;
|
||||||
|
if (UVCManager.Instance != null &&
|
||||||
|
UVCManager.Instance.GetAttachedDevices() != null && UVCManager.Instance.GetAttachedDevices().Count > 0)
|
||||||
|
{
|
||||||
|
var devices = UVCManager.Instance.GetAttachedDevices();
|
||||||
|
for (int i = 0; i < devices.Count; i++)
|
||||||
|
{
|
||||||
|
UVCManager.CameraInfo device = devices[i];
|
||||||
|
//LogPrint.Log($"device: {device}, device name:{device.DeviceName} texture: {device.previewTexture}");
|
||||||
|
}
|
||||||
|
//image.texture = devices.FirstOrDefault().previewTexture;
|
||||||
|
textureToFlipTexture2D(devices.FirstOrDefault().previewTexture, videoTexture);
|
||||||
|
|
||||||
|
img = new Mat(UVCManager.Instance.DefaultHeight, UVCManager.Instance.DefaultWidth, CvType.CV_8UC4);
|
||||||
|
Utils.texture2DToMat(videoTexture, img);
|
||||||
|
}
|
||||||
|
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
private void textureToFlipTexture2D(Texture texture, Texture2D texture2D)
|
||||||
|
{
|
||||||
|
if (texture == null)
|
||||||
|
throw new ArgumentNullException("texture");
|
||||||
|
|
||||||
|
if (texture2D == null)
|
||||||
|
throw new ArgumentNullException("texture2D");
|
||||||
|
|
||||||
|
if (texture.width != texture2D.width || texture.height != texture2D.height)
|
||||||
|
throw new ArgumentException("texture and texture2D need to be the same size.");
|
||||||
|
|
||||||
|
RenderTexture prevRT = RenderTexture.active;
|
||||||
|
|
||||||
|
RenderTexture tempRT = RenderTexture.GetTemporary(texture.width, texture.height, 0, RenderTextureFormat.ARGB32);
|
||||||
|
Graphics.Blit(texture, tempRT, _flipImg);
|
||||||
|
|
||||||
|
RenderTexture.active = tempRT;
|
||||||
|
texture2D.ReadPixels(new UnityEngine.Rect(0f, 0f, texture.width, texture.height), 0, 0, false);
|
||||||
|
texture2D.Apply(false, false);
|
||||||
|
RenderTexture.ReleaseTemporary(tempRT);
|
||||||
|
|
||||||
|
RenderTexture.active = prevRT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//protected override void AnalyzingFace()
|
||||||
|
//{
|
||||||
|
// mat4Display = GetMat();
|
||||||
|
// if (mat4Display == null)
|
||||||
|
// return;
|
||||||
|
// //mat4Display.copyTo(mat4Process);
|
||||||
|
// var roiRect = new OpenCVCompact.Rect(
|
||||||
|
// _positionRect[0],
|
||||||
|
// _positionRect[1],
|
||||||
|
// Mathf.Abs(_positionRect[2] - _positionRect[0]),
|
||||||
|
// Mathf.Abs(_positionRect[3] - _positionRect[1]));
|
||||||
|
|
||||||
|
// mat4Process = new Mat(mat4Display, roiRect);
|
||||||
|
|
||||||
|
|
||||||
|
// //Face Detect
|
||||||
|
// panel.RefreshData(LandmarkDetect());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Imgproc.rectangle(mat4Display, roiRect, new Scalar(255, 0, 0), 2);
|
||||||
|
// DebugPint();
|
||||||
|
//}
|
||||||
|
|
||||||
|
protected override void DebugPint()
|
||||||
|
{
|
||||||
|
//image.texture = videoTexture;
|
||||||
|
if (mat4Process.rows() == _cutTexture.height)
|
||||||
|
{
|
||||||
|
LogPrint.Log("mat4Process.rows() " + mat4Process.rows() + " mat4Process.cols() " + mat4Process.cols());
|
||||||
|
Mat cutMat = mat4Process.clone();
|
||||||
|
|
||||||
|
LogPrint.Log($"mat4Display type:{mat4Display.type()}.{CvType.CV_8UC3},{CvType.CV_8UC4}");
|
||||||
|
|
||||||
|
//Utils.matToTexture2D(cutMat, _cutTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mat4Display.rows() == videoTexture.height)
|
||||||
|
{
|
||||||
|
//mat4Display.copyTo(mat4DisplayTexture);
|
||||||
|
Mat display = mat4Display.clone();
|
||||||
|
//Utils.matToTexture2D(display, videoTexture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void DestroyManager()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#region UVC
|
||||||
|
public UVCFilter[] UVCFilters;
|
||||||
|
private Texture SavedTexture;
|
||||||
|
public bool OnUVCAttachEvent(UVCManager manager, UVCDevice device)
|
||||||
|
{
|
||||||
|
var result = !device.IsRicoh || device.IsTHETA;
|
||||||
|
|
||||||
|
result &= UVCFilter.Match(device, UVCFilters);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUVCDetachEvent(UVCManager manager, UVCDevice device)
|
||||||
|
{
|
||||||
|
LogPrint.Log("OnUVCDetachEvent " + device);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CanDraw(UVCManager manager, UVCDevice device)
|
||||||
|
{
|
||||||
|
return UVCFilter.Match(device, UVCFilters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUVCStartEvent(UVCManager manager, UVCDevice device, Texture tex)
|
||||||
|
{
|
||||||
|
HandleOnStartPreview(tex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUVCStopEvent(UVCManager manager, UVCDevice device)
|
||||||
|
{
|
||||||
|
HandleOnStopPreview();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleOnStartPreview(Texture tex)
|
||||||
|
{
|
||||||
|
SavedTexture = videoTexture;
|
||||||
|
|
||||||
|
videoTexture = new Texture2D(UVCManager.Instance.DefaultWidth, UVCManager.Instance.DefaultHeight, TextureFormat.RGBA32, false);
|
||||||
|
_positionRect = PictureUtility.GetPositionRect(UVCManager.Instance.DefaultWidth, UVCManager.Instance.DefaultHeight);
|
||||||
|
_cutTexture = new Texture2D(_positionRect[2], _positionRect[3], TextureFormat.RGBA32, false);
|
||||||
|
image.texture = videoTexture;
|
||||||
|
cutImage.texture = _cutTexture;
|
||||||
|
|
||||||
|
//mat4Display = new Mat(UVCManager.Instance.DefaultWidth, UVCManager.Instance.DefaultHeight, CvType.CV_8UC4);
|
||||||
|
mat4DisplayTexture = new Mat(UVCManager.Instance.DefaultWidth, UVCManager.Instance.DefaultHeight, CvType.CV_8UC4);
|
||||||
|
|
||||||
|
LogPrint.Log("Screen.width " + Screen.width + " Screen.height " + Screen.height + " Screen.orientation " + Screen.orientation);
|
||||||
|
|
||||||
|
dnnUtils.InitHeadPoseEstimationCameraInfo(UVCManager.Instance.DefaultWidth, UVCManager.Instance.DefaultHeight);
|
||||||
|
}
|
||||||
|
private void HandleOnStopPreview()
|
||||||
|
{
|
||||||
|
RestoreTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RestoreTexture()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
transform.GetComponent<Renderer>().material.mainTexture = SavedTexture;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogException(e);
|
||||||
|
}
|
||||||
|
SavedTexture = null;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b1a3af86bea67944b9cce9661ba1bfc6
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -0,0 +1,99 @@
|
||||||
|
using OpenCVCompact;
|
||||||
|
using Serenegiant.UVC;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UI;
|
||||||
|
|
||||||
|
[RequireComponent(typeof(OpenCVCompact.WebCamTextureToMatHelper))]
|
||||||
|
public class WebCamFaceDetectManager : FaceDetectManagerBase
|
||||||
|
{
|
||||||
|
public RawImage image;
|
||||||
|
public RawImage cutImage;
|
||||||
|
bool webCamReady = false;
|
||||||
|
private int[] _positionRect;
|
||||||
|
private Texture2D _cutTexture;
|
||||||
|
|
||||||
|
//Image Capture
|
||||||
|
OpenCVCompact.WebCamTextureToMatHelper _webCamTextureToMatHelper;
|
||||||
|
protected override void InitMatHelper()
|
||||||
|
{
|
||||||
|
_webCamTextureToMatHelper = gameObject.GetComponent<OpenCVCompact.WebCamTextureToMatHelper>();
|
||||||
|
_webCamTextureToMatHelper.Initialize();
|
||||||
|
}
|
||||||
|
protected override Mat GetMat()
|
||||||
|
{
|
||||||
|
if (!_webCamTextureToMatHelper.IsPlaying() || !_webCamTextureToMatHelper.DidUpdateThisFrame())
|
||||||
|
return null;
|
||||||
|
return _webCamTextureToMatHelper.GetMat();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void DestroyManager()
|
||||||
|
{
|
||||||
|
_webCamTextureToMatHelper.Dispose();
|
||||||
|
}
|
||||||
|
protected override void DebugPint()
|
||||||
|
{
|
||||||
|
if (webCamReady == true)
|
||||||
|
{
|
||||||
|
if (mat4Display.rows() == videoTexture.height)
|
||||||
|
{
|
||||||
|
mat4Display.copyTo(mat4DisplayTexture);
|
||||||
|
Utils.matToTexture2D(mat4DisplayTexture, videoTexture);
|
||||||
|
|
||||||
|
}
|
||||||
|
if (mat4Process.rows() == cutImage.texture.height)
|
||||||
|
{
|
||||||
|
Mat cutMat = mat4Process.clone();
|
||||||
|
Texture2D cutTexture = new Texture2D(cutMat.cols(), cutMat.rows(), TextureFormat.RGBA32, false);
|
||||||
|
Utils.matToTexture2D(cutMat, cutTexture);
|
||||||
|
cutImage.texture = cutTexture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void OnWebCamTextureToMatHelperInitialized()
|
||||||
|
{
|
||||||
|
Mat webCamTextureMat = _webCamTextureToMatHelper.GetMat();
|
||||||
|
|
||||||
|
videoTexture = new Texture2D(webCamTextureMat.cols(), webCamTextureMat.rows(), TextureFormat.RGBA32, false);
|
||||||
|
//gameObject.GetComponent<Renderer>().material.mainTexture = videoTexture;
|
||||||
|
image.texture = videoTexture;
|
||||||
|
_positionRect = PictureUtility.GetPositionRect(webCamTextureMat.cols(), webCamTextureMat.rows());
|
||||||
|
_cutTexture = new Texture2D(_positionRect[2], _positionRect[3], TextureFormat.RGBA32, false);
|
||||||
|
cutImage.texture = _cutTexture;
|
||||||
|
|
||||||
|
mat4Display = new Mat(webCamTextureMat.rows(), webCamTextureMat.cols(), CvType.CV_8UC4);
|
||||||
|
mat4DisplayTexture = new Mat(webCamTextureMat.rows(), webCamTextureMat.cols(), CvType.CV_8UC4);
|
||||||
|
|
||||||
|
LogPrint.Log("Screen.width " + Screen.width + " Screen.height " + Screen.height + " Screen.orientation " + Screen.orientation);
|
||||||
|
|
||||||
|
float width = webCamTextureMat.width();
|
||||||
|
float height = webCamTextureMat.height();
|
||||||
|
|
||||||
|
float widthScale = (float)Screen.width / width;
|
||||||
|
float heightScale = (float)Screen.height / height;
|
||||||
|
if (widthScale < heightScale)
|
||||||
|
{
|
||||||
|
Camera.main.orthographicSize = (width * (float)Screen.height / (float)Screen.width) / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Camera.main.orthographicSize = height / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
dnnUtils.InitHeadPoseEstimationCameraInfo(webCamTextureMat.cols(), webCamTextureMat.rows());
|
||||||
|
|
||||||
|
webCamReady = true;
|
||||||
|
LogPrint.Log("OnWebCamTextureToMatHelperInitialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void OnWebCamTextureToMatHelperDisposed()
|
||||||
|
{
|
||||||
|
LogPrint.Log("OnWebCamTextureToMatHelperDisposed");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnWebCamTextureToMatHelperErrorOccurred(OpenCVCompact.WebCamTextureToMatHelper.ErrorCode errorCode)
|
||||||
|
{
|
||||||
|
LogPrint.Log("OnWebCamTextureToMatHelperErrorOccurred " + errorCode);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 23c90b7e25f07ce4298ce424fedeb5e4
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -8,7 +8,7 @@ public class FaceDetectUI : UIPanelBase
|
||||||
|
|
||||||
private Dictionary<string, string> itemDetail = new Dictionary<string, string>();
|
private Dictionary<string, string> itemDetail = new Dictionary<string, string>();
|
||||||
private Transform _content;
|
private Transform _content;
|
||||||
private List<string> _lockedItem = new List<string>() { "Blond_Hair", "Wearing_Hat" };
|
private List<string> _lockedItem = new List<string>() { "Blond_Hair", "Wearing_Hat" };
|
||||||
|
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
|
@ -72,8 +72,22 @@ public class FaceDetectUI : UIPanelBase
|
||||||
|
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AddFixObj("Heart rate"); //Heart rate
|
||||||
|
AddFixObj("Blood oxygen"); //Blood oxygen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddFixObj(string title)
|
||||||
|
{
|
||||||
|
var fixGo = Instantiate(ItemPrefab, _content);
|
||||||
|
var mgr = fixGo.GetComponent<PanelItemManager>();
|
||||||
|
mgr.Title.text = title;
|
||||||
|
fixGo.transform.gameObject.SetActive(true);
|
||||||
|
fixGo.transform.SetSiblingIndex(_content.transform.childCount);
|
||||||
|
mgr.Lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void OnBackBtnClicked()
|
public void OnBackBtnClicked()
|
||||||
{
|
{
|
||||||
UIManager.Instance.CloseCurrent();
|
UIManager.Instance.CloseCurrent();
|
||||||
|
|
|
@ -183,7 +183,7 @@ public class GuideUI : UIPanelBase
|
||||||
YogaManager.Instance.ActionIndex = 0;
|
YogaManager.Instance.ActionIndex = 0;
|
||||||
EventManager.Instance.Dispatch(YogaEventType.PlayAnimation, YogaManager.Instance.LevelData.Actions);
|
EventManager.Instance.Dispatch(YogaEventType.PlayAnimation, YogaManager.Instance.LevelData.Actions);
|
||||||
_startTime = DateTime.Now;
|
_startTime = DateTime.Now;
|
||||||
InvokeRepeating("ProgressUpdate", 0, 0.05f); //20fps
|
InvokeRepeating("ProgressUpdate", 0, 0.1f); //20fps
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnExit()
|
public override void OnExit()
|
||||||
|
|
|
@ -7,6 +7,11 @@ using static UnityEngine.Rendering.GPUSort;
|
||||||
|
|
||||||
public class RobotController : MonoBehaviour
|
public class RobotController : MonoBehaviour
|
||||||
{
|
{
|
||||||
|
public void SetBasePosPoint()
|
||||||
|
{
|
||||||
|
YogaManager.Instance.SetBasePosPoint();
|
||||||
|
}
|
||||||
|
|
||||||
public void ActionEnd()
|
public void ActionEnd()
|
||||||
{
|
{
|
||||||
AudioManager.Instance.PlayCVInQueue("End");
|
AudioManager.Instance.PlayCVInQueue("End");
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
|
@ -0,0 +1,124 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 22f3692ba25f06c4cbb69c64cd7ef9f7
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 12
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 1
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 0
|
||||||
|
wrapV: 0
|
||||||
|
wrapW: 0
|
||||||
|
nPOTScale: 1
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 0
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 0
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Android
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
|
@ -1,4 +1,4 @@
|
||||||
#define ENABLE_LOG
|
//#define ENABLE_LOG
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014 - 2022 t_saki@serenegiant.com
|
* Copyright (c) 2014 - 2022 t_saki@serenegiant.com
|
||||||
*/
|
*/
|
||||||
|
@ -715,11 +715,15 @@ namespace Serenegiant.UVC
|
||||||
Debug.Log($"{TAG}InitPlugin:has no IUVCDrawer, try to get from gameObject");
|
Debug.Log($"{TAG}InitPlugin:has no IUVCDrawer, try to get from gameObject");
|
||||||
#endif
|
#endif
|
||||||
var objs = FindObjectsByType<CaptureManagerBase>(FindObjectsSortMode.None);
|
var objs = FindObjectsByType<CaptureManagerBase>(FindObjectsSortMode.None);
|
||||||
|
var faceObjs = FindObjectsByType<FaceDetectManagerBase>(FindObjectsSortMode.None);
|
||||||
List<Component> drawers = new List<Component>();
|
List<Component> drawers = new List<Component>();
|
||||||
foreach (var obj in objs)
|
foreach (var obj in objs)
|
||||||
{
|
{
|
||||||
drawers.AddRange(obj.GetComponents(typeof(IUVCDrawer)));
|
drawers.AddRange(obj.GetComponents(typeof(IUVCDrawer)));
|
||||||
|
}
|
||||||
|
foreach (var obj in faceObjs)
|
||||||
|
{
|
||||||
|
drawers.AddRange(obj.GetComponents(typeof(IUVCDrawer)));
|
||||||
}
|
}
|
||||||
LogPrint.Warning("drawers: " + drawers.Count);
|
LogPrint.Warning("drawers: " + drawers.Count);
|
||||||
if ((drawers != null) && (drawers.Count > 0))
|
if ((drawers != null) && (drawers.Count > 0))
|
||||||
|
|
Loading…
Reference in New Issue