diff --git a/Assets/OpenCVForUnity/Examples/MainModules/dnn/PoseEstimationMediaPipeExample/MediaPipePoseEstimator.cs b/Assets/OpenCVForUnity/Examples/MainModules/dnn/PoseEstimationMediaPipeExample/MediaPipePoseEstimator.cs index 0e78c38..7357e10 100644 --- a/Assets/OpenCVForUnity/Examples/MainModules/dnn/PoseEstimationMediaPipeExample/MediaPipePoseEstimator.cs +++ b/Assets/OpenCVForUnity/Examples/MainModules/dnn/PoseEstimationMediaPipeExample/MediaPipePoseEstimator.cs @@ -462,7 +462,6 @@ namespace OpenCVForUnityExample.DnnModel float[] landmarks_presence = new float[(39 - auxiliary_points_num)]; results_col4_199_39x5.colRange(new OpenCVRange(4, 5)).get(0, 0, landmarks_presence); - Mat results_col199_316_39x3 = results.rowRange(new OpenCVRange(199, 316 - (3 * auxiliary_points_num))).reshape(1, 39 - auxiliary_points_num); float[] landmarks_world = new float[(39 - auxiliary_points_num) * 3]; results_col199_316_39x3.get(0, 0, landmarks_world); diff --git a/Assets/Resources/UI/MainUI.prefab b/Assets/Resources/UI/MainUI.prefab index 8599a0c..665cc18 100644 --- a/Assets/Resources/UI/MainUI.prefab +++ b/Assets/Resources/UI/MainUI.prefab @@ -1,5 +1,155 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &812840956832231530 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1958927731802958260} + - component: {fileID: 2260945507531342483} + - component: {fileID: 3436322692073427523} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1958927731802958260 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 812840956832231530} + 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: 2576201504434113081} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -100, y: -100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2260945507531342483 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 812840956832231530} + m_CullTransparentMesh: 1 +--- !u!114 &3436322692073427523 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 812840956832231530} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, 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_Sprite: {fileID: 21300000, guid: 9b4580a483f26ac4388ec72c4c479a83, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &4637189147528760871 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4138242365235796459} + - component: {fileID: 7693179399692606510} + - component: {fileID: 3913808783048664634} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4138242365235796459 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4637189147528760871} + 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: 7867255813535008431} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -100, y: -100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7693179399692606510 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4637189147528760871} + m_CullTransparentMesh: 1 +--- !u!114 &3913808783048664634 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4637189147528760871} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, 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_Sprite: {fileID: 21300000, guid: c218c4357d09a2f4e94961d8b04540c6, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &4975108645149662689 GameObject: m_ObjectHideFlags: 0 @@ -87,6 +237,81 @@ CanvasGroup: m_Interactable: 1 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 +--- !u!1 &5012355027590094061 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8940443638627649355} + - component: {fileID: 5822777235898107403} + - component: {fileID: 5023932294307215150} + m_Layer: 5 + m_Name: Mask + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &8940443638627649355 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5012355027590094061} + 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: 2576201504434113081} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5822777235898107403 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5012355027590094061} + m_CullTransparentMesh: 1 +--- !u!114 &5023932294307215150 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5012355027590094061} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 21300000, guid: fc3cc6afdc9d6f645bad60ad7309189e, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &5611881615064894930 GameObject: m_ObjectHideFlags: 0 @@ -100,6 +325,7 @@ GameObject: - component: {fileID: 7069011303126796865} - component: {fileID: 4329244061302087914} - component: {fileID: 5061662039744333050} + - component: {fileID: 25324508393644868} m_Layer: 5 m_Name: Driver m_TagString: Untagged @@ -120,12 +346,14 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1449208219289806508} + - {fileID: 4138242365235796459} + - {fileID: 173739580069041147} m_Father: {fileID: 1888392902869825718} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -450, y: 0} - m_SizeDelta: {x: 700, y: 500} + m_AnchoredPosition: {x: -300, y: 0} + m_SizeDelta: {x: 256, y: 256} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2054363549373963548 CanvasRenderer: @@ -155,7 +383,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: f3df4d9369dcdc840b85c95d3e1176f4, type: 3} + m_Sprite: {fileID: 21300000, guid: 404ba9da9833aa0429c62a90c92f0e33, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -231,6 +459,19 @@ Animator: m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorStateOnDisable: 0 m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &25324508393644868 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5611881615064894930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 1 --- !u!1 &6036208431044648634 GameObject: m_ObjectHideFlags: 0 @@ -289,7 +530,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -310,6 +551,81 @@ MonoBehaviour: m_VerticalOverflow: 0 m_LineSpacing: 1 m_Text: Co-Driver +--- !u!1 &8039057556249263921 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 173739580069041147} + - component: {fileID: 3300850338272086747} + - component: {fileID: 1636194949858596997} + m_Layer: 5 + m_Name: Mask + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &173739580069041147 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039057556249263921} + 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: 7867255813535008431} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3300850338272086747 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039057556249263921} + m_CullTransparentMesh: 1 +--- !u!114 &1636194949858596997 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8039057556249263921} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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_Sprite: {fileID: 21300000, guid: fc3cc6afdc9d6f645bad60ad7309189e, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &8042575492156197460 GameObject: m_ObjectHideFlags: 0 @@ -344,8 +660,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0} m_AnchorMax: {x: 0.5, y: 0} - m_AnchoredPosition: {x: 0, y: 30} - m_SizeDelta: {x: 160, y: 160} + m_AnchoredPosition: {x: 0, y: 20} + m_SizeDelta: {x: 160, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &8391011484397638028 CanvasRenderer: @@ -368,7 +684,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 @@ -488,12 +804,14 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 6401048517044185304} + - {fileID: 1958927731802958260} + - {fileID: 8940443638627649355} m_Father: {fileID: 1888392902869825718} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 450, y: 0} - m_SizeDelta: {x: 700, y: 500} + m_AnchoredPosition: {x: 300, y: 0} + m_SizeDelta: {x: 256, y: 256} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &6645283475793646557 CanvasRenderer: @@ -523,7 +841,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 4c832a36ea64b7b4da0fffa78a702860, type: 3} + m_Sprite: {fileID: 21300000, guid: 404ba9da9833aa0429c62a90c92f0e33, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -629,7 +947,6 @@ RectTransform: m_Children: - {fileID: 7867255813535008431} - {fileID: 2576201504434113081} - - {fileID: 3633320821606894435} m_Father: {fileID: 5269051166812510682} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -637,137 +954,3 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &9208700712057849365 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3633320821606894435} - - component: {fileID: 6811689815506691815} - - component: {fileID: 5648383841688649297} - m_Layer: 5 - m_Name: label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &3633320821606894435 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9208700712057849365} - 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: 1888392902869825718} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 350} - m_SizeDelta: {x: 450, y: 150} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &6811689815506691815 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9208700712057849365} - m_CullTransparentMesh: 1 ---- !u!114 &5648383841688649297 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9208700712057849365} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Are you sitting at... - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4286085240 - m_fontColor: {r: 0.47058824, g: 0.47058824, b: 0.47058824, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 50 - m_fontSizeBase: 50 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Assets/Scripts/PoseCheck/EstimateModel/CVEstimator.cs b/Assets/Scripts/PoseCheck/EstimateModel/CVEstimator.cs index f568761..a931aa2 100644 --- a/Assets/Scripts/PoseCheck/EstimateModel/CVEstimator.cs +++ b/Assets/Scripts/PoseCheck/EstimateModel/CVEstimator.cs @@ -100,7 +100,6 @@ public class CVEstimator : Singleton { DateTime startTime = DateTime.Now; Mat bgrMat = new Mat(); - while (IsRunning) { Mat rgbaMat = MotionCaptureManager.Instance.RgbaMat; @@ -112,15 +111,12 @@ public class CVEstimator : Singleton } Imgproc.cvtColor(rgbaMat, bgrMat, Imgproc.COLOR_RGBA2BGR); - if (!YogaManager.Instance.CurrentEstimator.TryGetROIRegionMat(rgbaMat, bgrMat, out List voloResultBox)) + if (!YogaManager.Instance.CurrentEstimator.TryGetROIRegionMat(bgrMat, rgbaMat, out Mat result)) { continue; //重新检测 } - //更新人物框检测结果 - MotionCaptureManager.Instance.VoloResult = voloResultBox; - - if (!YogaManager.Instance.CurrentEstimator.Esitmate(bgrMat, voloResultBox, out List points)) + if (!YogaManager.Instance.CurrentEstimator.Esitmate(bgrMat, rgbaMat, result, out List points)) { Debug.LogWarning("Pose estimation failed. Re-Estimating."); continue; //重新检测 diff --git a/Assets/Scripts/PoseCheck/EstimateModel/Estimator.cs b/Assets/Scripts/PoseCheck/EstimateModel/Estimator.cs index 33fd708..d49161a 100644 --- a/Assets/Scripts/PoseCheck/EstimateModel/Estimator.cs +++ b/Assets/Scripts/PoseCheck/EstimateModel/Estimator.cs @@ -37,9 +37,9 @@ public abstract class Estimator public abstract void DisposeModel(); //检测到的人体框 默认使用VOLO7 - public virtual bool TryGetROIRegionMat(Mat rgbaMat, Mat bgrMat, out List voloResult) + public virtual bool TryGetROIRegionMat(Mat bgrMat, Mat rgbaMat, out Mat result) { - voloResult = null; + result = null; if (_objectDetector == null) { Debug.LogWarning("ObjectDetector is not ready. "); @@ -47,37 +47,8 @@ public abstract class Estimator } //获取数据 - Mat results = _objectDetector.infer(bgrMat); - var voloResultBox = new List(); - bool hasValidObject = false; - for (int i = results.rows() - 1; i >= 0; --i) - { - float[] box = new float[4]; - results.get(i, 0, box); //方框 - float[] conf = new float[1]; - results.get(i, 4, conf); //检测数据 - float[] cls = new float[1]; - results.get(i, 5, cls); //类别 + result = _objectDetector.infer(bgrMat); - if (!IsObjectValid(box, conf, cls, rgbaMat)) - { - return false; - } - hasValidObject = true; - voloResultBox.Clear(); - voloResultBox.Add(box); - voloResultBox.Add(conf); - voloResultBox.Add(cls); - break; - } - - if (!hasValidObject) //没有检测到人体 - { - Debug.Log("No person block found. Re-Estimation."); - return false; //重新检测 - } - - voloResult = voloResultBox; return true; } @@ -128,7 +99,7 @@ public abstract class Estimator Imgproc.putText(image, label, new Point(left, top), Imgproc.FONT_HERSHEY_SIMPLEX, 0.5, Scalar.all(255), 1, Imgproc.LINE_AA); } - public abstract bool Esitmate(Mat bgrMat, List voloResultBox, out List points); + public abstract bool Esitmate(Mat bgrMat, Mat rgbaMat, Mat result, out List points); public virtual void Check(ref Mat img) { } } diff --git a/Assets/Scripts/PoseCheck/EstimateModel/MediaPipeEstimator.cs b/Assets/Scripts/PoseCheck/EstimateModel/MediaPipeEstimator.cs index a13491b..e87eeaa 100644 --- a/Assets/Scripts/PoseCheck/EstimateModel/MediaPipeEstimator.cs +++ b/Assets/Scripts/PoseCheck/EstimateModel/MediaPipeEstimator.cs @@ -1,21 +1,148 @@ using OpenCVForUnity.CoreModule; +using OpenCVForUnity.ImgprocModule; +using OpenCVForUnity.UnityUtils; +using OpenCVForUnityExample.DnnModel; using System; using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Experimental.GlobalIllumination; +using static UnityEngine.Networking.UnityWebRequest; +using OpenCVRange = OpenCVForUnity.CoreModule.Range; public class MediaPipeEstimator : Estimator { + private MediaPipePersonDetector _personDetector; + private MediaPipePoseEstimator _poseEstimator; + private bool _mask = false; public override void InitModel() { - throw new NotImplementedException(); + var personDetectModelPath = Utils.getFilePath(YogaConfig.MODEL_PATHS[ModelType.MediapipePersonDetect]); + if (string.IsNullOrEmpty(personDetectModelPath)) + { + Debug.LogError(YogaConfig.MODEL_PATHS[ModelType.MediapipePersonDetect] + " is not loaded. Please read “StreamingAssets/OpenCVForUnity/dnn/setup_dnn_module.pdf” to make the necessary setup."); + } + else + { + _personDetector = new MediaPipePersonDetector(personDetectModelPath, 0.3f, 0.6f, 5000); + } + + var poseModelPath = Utils.getFilePath(YogaConfig.MODEL_PATHS[ModelType.MediapipePose]); + if (string.IsNullOrEmpty(poseModelPath)) + { + Debug.LogError(YogaConfig.MODEL_PATHS[ModelType.MediapipePose] + " is not loaded. Please read “StreamingAssets/OpenCVForUnity/dnn/setup_dnn_module.pdf” to make the necessary setup."); + } + else + { + _poseEstimator = new MediaPipePoseEstimator(poseModelPath, 0.9f); + } } - public override bool Esitmate(Mat bgrMat, List voloResultBox, out List points) + public override void Check(ref Mat img) { - throw new NotImplementedException(); + if (_personDetector == null || _poseEstimator == null) + { + Imgproc.putText(img, "model file is not loaded.", new Point(5, img.rows() - 30), Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(255, 255, 255, 255), 2, Imgproc.LINE_AA, false); + Imgproc.putText(img, "Please read console message.", new Point(5, img.rows() - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(255, 255, 255, 255), 2, Imgproc.LINE_AA, false); + } + } + + public override bool TryGetROIRegionMat(Mat bgrMat, Mat rgbaMat, out Mat result) + { + result = _personDetector.infer(bgrMat); + + if (result.rows() == 0) + { + return false; + } + + return true; + } + + public override bool Esitmate(Mat bgrMat, Mat rgbaMat, Mat result, out List points) + { + points = null; + for (int i = 0; i < result.rows(); ++i) + { + List results = _poseEstimator.infer(bgrMat, result.row(i)); + + //_poseEstimator.visualize(rgbaMat, results[0], false, false); + + points = GetKeypoints(results[0]); + if (points != null && YogaManager.Instance.ActionCheckPoints(points)) + { + return true; + } + } + //没有检测到人体 + return false; + } + + private List GetKeypoints(Mat result) + { + var retVal = new List(); + if (result.empty() || result.rows() < 317) + return retVal; + + //获取关键点 + float[] conf = new float[1]; + result.get(316, 0, conf); + float[] bbox = new float[4]; + result.get(0, 0, bbox); + + int auxiliary_points_num = 6; + Mat results_col4_199_39x5 = result.rowRange(new OpenCVRange(4, 199 - (5 * auxiliary_points_num))).reshape(1, 39 - auxiliary_points_num); + float[] landmarks_screen_xy = new float[(39 - auxiliary_points_num) * 2]; + results_col4_199_39x5.colRange(new OpenCVRange(0, 2)).get(0, 0, landmarks_screen_xy); + + float[] landmarks_screen_xyz = new float[(39 - auxiliary_points_num) * 3]; + results_col4_199_39x5.colRange(new OpenCVRange(0, 3)).get(0, 0, landmarks_screen_xyz); + + // # only show visible keypoints which presence bigger than 0.8 + float[] landmarks_presence = new float[(39 - auxiliary_points_num)]; + results_col4_199_39x5.colRange(new OpenCVRange(4, 5)).get(0, 0, landmarks_presence); + + + Mat results_col199_316_39x3 = result.rowRange(new OpenCVRange(199, 316 - (3 * auxiliary_points_num))).reshape(1, 39 - auxiliary_points_num); + float[] landmarks_world = new float[(39 - auxiliary_points_num) * 3]; + results_col199_316_39x3.get(0, 0, landmarks_world); + + + + //将关键点映射到现有的open pose关键点上 + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 0)); //Nose + retVal.Add(new Point(-1, -1)); //Neck + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 11)); //LShoulder + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 13)); //LElbow + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 15)); //LWrist + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 12)); //RShoulder + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 14)); //RElbow + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 16)); //RWrist + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 23)); //LHip + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 25)); //LKnee + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 27)); //LAnkle + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 24)); //RHip + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 26)); //RKnee + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 28)); //RAnkle + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 2)); //LEye + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 5)); //REye + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 7)); //LEar + retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 8)); //REar + retVal.Add(new Point(-1, -1)); //Background + + return retVal; + } + + private Point GetPointData(float[] landmarks, float[] _landmarks_presence, int index) + { + if (_landmarks_presence[index] < 0.8f) + return null; + + index = index * 2; + return new Point(landmarks[index], landmarks[index + 1]); } public override void DisposeModel() { - throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/Assets/Scripts/PoseCheck/EstimateModel/OpenPoseEsimater.cs b/Assets/Scripts/PoseCheck/EstimateModel/OpenPoseEsimater.cs index cb670a6..bc4fc3b 100644 --- a/Assets/Scripts/PoseCheck/EstimateModel/OpenPoseEsimater.cs +++ b/Assets/Scripts/PoseCheck/EstimateModel/OpenPoseEsimater.cs @@ -6,10 +6,11 @@ using System; using System.Collections.Generic; using UnityEngine; using Yoga; +using static UnityEngine.Networking.UnityWebRequest; public class OpenPoseEsimater : Estimator { - KeypointsModel _openPoseModel; + KeypointsModel _openPoseModel; private Net _net; private double threshold = 0.5; @@ -39,8 +40,42 @@ public class OpenPoseEsimater : Estimator _net.Dispose(); } - public override bool Esitmate(Mat bgrMat, List voloResultBox, out List points) + public override bool Esitmate(Mat bgrMat, Mat rgbaMat, Mat results, out List points) { + var voloResultBox = new List(); + points = null; + bool hasValidObject = false; + + for (int i = results.rows() - 1; i >= 0; --i) + { + float[] box = new float[4]; + results.get(i, 0, box); //方框 + float[] conf = new float[1]; + results.get(i, 4, conf); //检测数据 + float[] cls = new float[1]; + results.get(i, 5, cls); //类别 + + if (!IsObjectValid(box, conf, cls, rgbaMat)) + { + return false; + } + hasValidObject = true; + voloResultBox.Clear(); + voloResultBox.Add(box); + voloResultBox.Add(conf); + voloResultBox.Add(cls); + break; + } + + if (!hasValidObject) //没有检测到人体 + { + Debug.Log("No person block found. Re-Estimation."); + return false; //重新检测 + } + + //更新人物框检测结果 + MotionCaptureManager.Instance.VoloResult = voloResultBox; + points = null; if (_openPoseModel == null) diff --git a/Assets/Scripts/PoseCheck/HandsUp.cs b/Assets/Scripts/PoseCheck/HandsUp.cs index 93aa193..0dd5496 100644 --- a/Assets/Scripts/PoseCheck/HandsUp.cs +++ b/Assets/Scripts/PoseCheck/HandsUp.cs @@ -1,11 +1,13 @@ using OpenCVForUnity.CoreModule; +using System; using System.Collections.Generic; +using UnityEngine; public class HandsUp : PoseBase { public override bool CheckPose(List points) { - // 必须包含 Neck 和 LEar 和 Neck 的点位 + // 必须包含 "Nose", "RShoulder", "LShoulder", "RElbow", "LElbow" 点位 if (!YogaManager.Instance.ActionCheckPoints(points)) return false; @@ -13,6 +15,21 @@ public class HandsUp : PoseBase if (!YogaManager.Instance.ActionCheckPoints(basePoint)) return false; - return false; + + var rArmVector = ("RElbow".vector(points) - "RShoulder".vector(points)).normalized; + var lArmVector = ("LElbow".vector(points) - "LShoulder".vector(points)).normalized; + + var rArmBaseVector = ("RElbow".vector(basePoint) - "RShoulder".vector(basePoint)).normalized; + var lArmBaseVector = ("LElbow".vector(basePoint) - "LShoulder".vector(basePoint)).normalized; + + var angleR = Vector3.Angle(rArmVector, rArmBaseVector); + var angleL = Vector3.Angle(lArmVector, lArmBaseVector); + + Debug.LogWarning("angleR:" + angleR + " angleL:" + angleL); + + if (angleR < 10 || angleL < 10) + return false; + + return true; } } \ No newline at end of file diff --git a/Assets/Scripts/PoseCheck/MotionCaptureManager.cs b/Assets/Scripts/PoseCheck/MotionCaptureManager.cs index 698bd06..5885d58 100644 --- a/Assets/Scripts/PoseCheck/MotionCaptureManager.cs +++ b/Assets/Scripts/PoseCheck/MotionCaptureManager.cs @@ -61,10 +61,16 @@ namespace Yoga base.Init(); _webCamTextureToMatHelper = gameObject.GetComponent(); + +#if UNITY_ANDROID && !UNITY_EDITOR + // Avoids the front camera low light issue that occurs in only some Android devices (e.g. Google Pixel, Pixel2). + webCamTextureToMatHelper.avoidAndroidFrontCameraLowLightIssue = true; +#endif + _webCamTextureToMatHelper.Initialize(); UIManager.Instance.LoadReset(); - + if (YogaManager.Instance.Action == null) YogaManager.Instance.InitData(); @@ -78,7 +84,7 @@ namespace Yoga case ModelType.OpenPose: YogaManager.Instance.CurrentEstimator = new OpenPoseEsimater(); break; - case ModelType.Mediapipe: + case ModelType.MediapipePose: YogaManager.Instance.CurrentEstimator = new MediaPipeEstimator(); break; } diff --git a/Assets/Scripts/YogaConfig.cs b/Assets/Scripts/YogaConfig.cs index c5c9b8d..7a2dd87 100644 --- a/Assets/Scripts/YogaConfig.cs +++ b/Assets/Scripts/YogaConfig.cs @@ -57,6 +57,8 @@ public static class YogaConfig public static readonly Dictionary MODEL_PATHS = new Dictionary() { {ModelType.OpenPose,"OpenCVForUnity/dnn/lightweight_pose_estimation_201912.onnx" }, + {ModelType.MediapipePersonDetect,"OpenCVForUnity/dnn/person_detection_mediapipe_2023mar.onnx" }, + {ModelType.MediapipePose,"OpenCVForUnity/dnn/pose_estimation_mediapipe_2023mar.onnx" }, //{"","" }, }; diff --git a/Assets/Scripts/YogaDataLoader.cs b/Assets/Scripts/YogaDataLoader.cs index 9ee8b61..4029025 100644 --- a/Assets/Scripts/YogaDataLoader.cs +++ b/Assets/Scripts/YogaDataLoader.cs @@ -13,12 +13,12 @@ public class YogaDataLoader #if UNITY_EDITOR data[-1] = new YogaData() { - VideoPath = "Video/Action2", - Action = AvatarAction.Nod, - ModelType = ModelType.OpenPose, + VideoPath = "Video/Action3", + Action = AvatarAction.HandsUp, + ModelType = ModelType.MediapipePose, MaxActionCount = 1000, TotalSeconds = 20.0f, - MustPoints = new List() { "Nose", "REye", "LEye", "Neck" }, + MustPoints = new List() { "Nose", "RShoulder", "LShoulder", "RElbow", "LElbow" }, //AnyPoints = new List() { "RWrist", "LWrist" } }; #endif @@ -44,10 +44,10 @@ public class YogaDataLoader { VideoPath = "Video/Action3", Action = AvatarAction.HandsUp, - ModelType = ModelType.OpenPose, + ModelType = ModelType.MediapipePose, MaxActionCount = 4, TotalSeconds = 12.66f, - MustPoints = new List() { "Nose", "RShoulder", "LShoulder", "RightWrist" } + MustPoints = new List() { "Nose", "RShoulder", "LShoulder", "RElbow", "LElbow" } }; if (data.ContainsKey(index)) @@ -76,6 +76,7 @@ public enum ModelType { OpenPose, YoloV7, - Mediapipe, + MediapipePose, + MediapipePersonDetect, //, } \ No newline at end of file diff --git a/Assets/UI/Img/Steering wheel.png b/Assets/UI/Img/Steering wheel.png new file mode 100644 index 0000000..c54d8b7 Binary files /dev/null and b/Assets/UI/Img/Steering wheel.png differ diff --git a/Assets/UI/Img/Steering wheel.png.meta b/Assets/UI/Img/Steering wheel.png.meta new file mode 100644 index 0000000..7e5db3e --- /dev/null +++ b/Assets/UI/Img/Steering wheel.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: c218c4357d09a2f4e94961d8b04540c6 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Img/seat.png b/Assets/UI/Img/seat.png new file mode 100644 index 0000000..4d8d936 Binary files /dev/null and b/Assets/UI/Img/seat.png differ diff --git a/Assets/UI/Img/seat.png.meta b/Assets/UI/Img/seat.png.meta new file mode 100644 index 0000000..9b0843c --- /dev/null +++ b/Assets/UI/Img/seat.png.meta @@ -0,0 +1,124 @@ +fileFormatVersion: 2 +guid: 9b4580a483f26ac4388ec72c4c479a83 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + 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: 1 + wrapV: 1 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 8 + 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: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: