From d699e357dbb0480b0233565be6b750be1841bde5 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Tue, 21 Feb 2023 21:40:12 +0800 Subject: [PATCH 01/10] =?UTF-8?q?add:=20=E6=B7=BB=E5=8A=A0=E7=90=83?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=A4=BA=E6=84=8F=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 66 ++++++ Assets/MainBehaviour.cs.meta | 11 + Assets/Models/PoseTransform.cs | 4 +- Assets/Scenes/BallScene.unity | 361 +++++++++++++++++++++++++++++ Assets/Scenes/BallScene.unity.meta | 7 + 5 files changed, 448 insertions(+), 1 deletion(-) create mode 100644 Assets/MainBehaviour.cs create mode 100644 Assets/MainBehaviour.cs.meta create mode 100644 Assets/Scenes/BallScene.unity create mode 100644 Assets/Scenes/BallScene.unity.meta diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs new file mode 100644 index 0000000..2e7ebf4 --- /dev/null +++ b/Assets/MainBehaviour.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Models; +using Unity.VisualScripting; +using UnityEngine; + +public class MainBehaviour : MonoBehaviour +{ + private readonly List _nodes = new List(); + private readonly List _poseTransforms = new List(); + private readonly UdpListener _listener = new UdpListener(); + + // Start is called before the first frame update + private void Start() + { + CreateNodes(); + + _listener.AddHandler(OnReceive); + _listener.Connect(5000); + } + + // Update is called once per frame + private void Update() + { + foreach (var poseTransform in _poseTransforms) + { + var index = (int)poseTransform.MediaPipeName; + _nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; + } + } + + private void OnDisable() + { + _listener.DisConnect(); + } + + private void CreateNodes() + { + for (var i = 0; i < 33; i++) + { + var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); + + ball.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); + + _nodes.Add(ball); + + var poseTransform = new PoseTransform((PoseLandmarkType)i); + + _poseTransforms.Add(poseTransform); + } + } + + private void OnReceive(List landmarks) + { + foreach (var landmark in landmarks) + { + var poseTransform = new PoseTransform(landmark.Type) + { + MediaPipePos = new Vector3(landmark.X, -landmark.Y, landmark.Z) + }; + + _poseTransforms[(int)landmark.Type] = poseTransform; + } + } +} diff --git a/Assets/MainBehaviour.cs.meta b/Assets/MainBehaviour.cs.meta new file mode 100644 index 0000000..e8b942d --- /dev/null +++ b/Assets/MainBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 574a3724e040787f7afd9341fba89cf2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Models/PoseTransform.cs b/Assets/Models/PoseTransform.cs index d20e446..f62c320 100644 --- a/Assets/Models/PoseTransform.cs +++ b/Assets/Models/PoseTransform.cs @@ -56,7 +56,9 @@ PoseLandmarkType type /// public void CalculateCurrentQuaternion(PoseLandmark landmark) { - + MediaPipePos.x = landmark.X; + MediaPipePos.y = landmark.Y; + MediaPipePos.z = landmark.Z; } /// diff --git a/Assets/Scenes/BallScene.unity b/Assets/Scenes/BallScene.unity new file mode 100644 index 0000000..3252943 --- /dev/null +++ b/Assets/Scenes/BallScene.unity @@ -0,0 +1,361 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18029127, g: 0.22572401, b: 0.3069303, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &182244630 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 182244631} + - component: {fileID: 182244632} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &182244631 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182244630} + 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: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &182244632 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 182244630} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 574a3724e040787f7afd9341fba89cf2, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &443683957 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 443683959} + - component: {fileID: 443683958} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &443683958 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443683957} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &443683959 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 443683957} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &2045151417 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2045151420} + - component: {fileID: 2045151419} + - component: {fileID: 2045151418} + - component: {fileID: 2045151421} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2045151418 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_Enabled: 1 +--- !u!20 &2045151419 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + 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 &2045151420 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -7.44} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2045151421 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045151417} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9189b565e8ba9bfc3bdaa38149e3e13f, type: 3} + m_Name: + m_EditorClassIdentifier: + target: {fileID: 182244631} diff --git a/Assets/Scenes/BallScene.unity.meta b/Assets/Scenes/BallScene.unity.meta new file mode 100644 index 0000000..867553f --- /dev/null +++ b/Assets/Scenes/BallScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 53edd235eaf7da249a8204f606eb1489 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: From dba10abb293c63c80cf9a33f29a8fff35d375733 Mon Sep 17 00:00:00 2001 From: Ichirinko <1621543655@qq.com> Date: Wed, 22 Feb 2023 19:51:22 +0800 Subject: [PATCH 02/10] =?UTF-8?q?add:=E4=B8=89=E7=BB=B4=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E7=9A=84=E4=B8=89=E4=B8=AA=E6=96=B9=E6=B3=95=EF=BC=9B=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E7=BB=99=E4=B8=8D=E5=90=8C=E9=83=A8=E4=BD=8D=E4=B8=8A?= =?UTF-8?q?=E8=89=B2=E6=96=B9=E4=BE=BF=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 73 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index 2e7ebf4..56668c0 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -10,6 +10,7 @@ public class MainBehaviour : MonoBehaviour private readonly List _nodes = new List(); private readonly List _poseTransforms = new List(); private readonly UdpListener _listener = new UdpListener(); + // Start is called before the first frame update private void Start() @@ -26,7 +27,15 @@ private void Update() foreach (var poseTransform in _poseTransforms) { var index = (int)poseTransform.MediaPipeName; - _nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; + + var temp = new Vector4(_poseTransforms[index].MediaPipePos.x, + _poseTransforms[index].MediaPipePos.y, + _poseTransforms[index].MediaPipePos.z,1); + //temp = RotateAxisZ(180) * temp; + //warning:乘法的顺序不能改! + + _nodes[index].transform.position = new Vector3(temp.x, temp.y, temp.z) * 5; + //_nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; } } @@ -41,7 +50,20 @@ private void CreateNodes() { var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); - ball.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); + ball.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); + + if (i <= 10) + { + ball.GetComponent().material.color = Color.red;//给头部添加颜色 + } + else if (i > 10 && i <= 22) + { + ball.GetComponent().material.color = Color.blue;//给手部添加颜色 + } + else if (i > 12 && i <= 32) + { + ball.GetComponent().material.color = Color.green;//给脚部添加颜色 + } _nodes.Add(ball); @@ -57,10 +79,55 @@ private void OnReceive(List landmarks) { var poseTransform = new PoseTransform(landmark.Type) { - MediaPipePos = new Vector3(landmark.X, -landmark.Y, landmark.Z) + MediaPipePos = new Vector3(landmark.X, landmark.Y, landmark.Z) }; _poseTransforms[(int)landmark.Type] = poseTransform; } } + + //绕X轴旋转 + private Matrix4x4 RotateAxisX(float rot) + { + var matrix = new Matrix4x4(); + float cosrot = MathF.Cos(rot); + float sinrot = MathF.Sin(rot); + + matrix.SetRow(0, new Vector4(1,0,0,0)); + matrix.SetRow(1, new Vector4(0,cosrot,-sinrot,0)); + matrix.SetRow(2, new Vector4(0,sinrot,cosrot,0)); + matrix.SetRow(3, new Vector4(0,0,0,1)); + + return matrix; + } + + //绕Y轴旋转 + private Matrix4x4 RotateAxisY(float rot) + { + var matrix = new Matrix4x4(); + float cosrot = MathF.Cos(rot); + float sinrot = MathF.Sin(rot); + + matrix.SetRow(0, new Vector4(cosrot,0,sinrot,0)); + matrix.SetRow(1, new Vector4(0,1,0,0)); + matrix.SetRow(2, new Vector4(-sinrot,0,cosrot,0)); + matrix.SetRow(3, new Vector4(0,0,0,1)); + + return matrix; + } + + //绕Z轴旋转 + private Matrix4x4 RotateAxisZ(float rot) + { + var matrix = new Matrix4x4(); + float cosrot = MathF.Cos(rot); + float sinrot = MathF.Sin(rot); + + matrix.SetRow(0, new Vector4(cosrot,-sinrot,0,0)); + matrix.SetRow(1, new Vector4(sinrot,cosrot,0,0)); + matrix.SetRow(2, new Vector4(0,0,1,0)); + matrix.SetRow(3, new Vector4(0,0,0,1)); + + return matrix; + } } From ff2ae6b25ce0c6b956a6b8903956bc0dac85c133 Mon Sep 17 00:00:00 2001 From: Ichirinko <1621543655@qq.com> Date: Wed, 22 Feb 2023 19:52:36 +0800 Subject: [PATCH 03/10] =?UTF-8?q?add:=E4=B8=89=E7=BB=B4=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E7=9A=84=E4=B8=89=E4=B8=AA=E6=96=B9=E6=B3=95=EF=BC=9B=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E7=BB=99=E4=B8=8D=E5=90=8C=E9=83=A8=E4=BD=8D=E4=B8=8A?= =?UTF-8?q?=E8=89=B2=E6=96=B9=E4=BE=BF=E5=8C=BA=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index 56668c0..ac1b512 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -32,7 +32,7 @@ private void Update() _poseTransforms[index].MediaPipePos.y, _poseTransforms[index].MediaPipePos.z,1); //temp = RotateAxisZ(180) * temp; - //warning:乘法的顺序不能改! + //warning:乘法的顺序不能改! _nodes[index].transform.position = new Vector3(temp.x, temp.y, temp.z) * 5; //_nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; From 7de82ae644b9954a017cc85b17b6c5347c37297e Mon Sep 17 00:00:00 2001 From: jackfiled Date: Wed, 22 Feb 2023 20:35:20 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix:=20=E4=BA=BA=E7=89=A9=E5=9D=90?= =?UTF-8?q?=E6=A0=87=E6=97=8B=E8=BD=AC=E4=B8=BA=E6=AD=A3=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 13 ++-- Assets/Materials.meta | 8 ++ Assets/Materials/PlaneMaterial.mat | 80 ++++++++++++++++++++ Assets/Materials/PlaneMaterial.mat.meta | 8 ++ Assets/Scenes/BallScene.unity | 98 +++++++++++++++++++++++++ 5 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 Assets/Materials.meta create mode 100644 Assets/Materials/PlaneMaterial.mat create mode 100644 Assets/Materials/PlaneMaterial.mat.meta diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index ac1b512..b6fc64a 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -1,8 +1,6 @@ using System; -using System.Collections; using System.Collections.Generic; using Models; -using Unity.VisualScripting; using UnityEngine; public class MainBehaviour : MonoBehaviour @@ -10,6 +8,7 @@ public class MainBehaviour : MonoBehaviour private readonly List _nodes = new List(); private readonly List _poseTransforms = new List(); private readonly UdpListener _listener = new UdpListener(); + private const float _scale = 0.2f; // Start is called before the first frame update @@ -31,10 +30,10 @@ private void Update() var temp = new Vector4(_poseTransforms[index].MediaPipePos.x, _poseTransforms[index].MediaPipePos.y, _poseTransforms[index].MediaPipePos.z,1); - //temp = RotateAxisZ(180) * temp; + temp = RotateAxisX(-45) * temp; //warning:乘法的顺序不能改! - _nodes[index].transform.position = new Vector3(temp.x, temp.y, temp.z) * 5; + _nodes[index].transform.position = new Vector3(-temp.x, -temp.y, -temp.z) * 5; //_nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; } } @@ -50,17 +49,17 @@ private void CreateNodes() { var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); - ball.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f); + ball.transform.localScale = new Vector3(_scale, _scale, _scale); if (i <= 10) { ball.GetComponent().material.color = Color.red;//给头部添加颜色 } - else if (i > 10 && i <= 22) + else if (i <= 22) { ball.GetComponent().material.color = Color.blue;//给手部添加颜色 } - else if (i > 12 && i <= 32) + else if (i <= 32) { ball.GetComponent().material.color = Color.green;//给脚部添加颜色 } diff --git a/Assets/Materials.meta b/Assets/Materials.meta new file mode 100644 index 0000000..c309ed8 --- /dev/null +++ b/Assets/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c2963c03969c7f6d480483b45e36590b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Materials/PlaneMaterial.mat b/Assets/Materials/PlaneMaterial.mat new file mode 100644 index 0000000..28c017d --- /dev/null +++ b/Assets/Materials/PlaneMaterial.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: PlaneMaterial + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0.29922488, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Materials/PlaneMaterial.mat.meta b/Assets/Materials/PlaneMaterial.mat.meta new file mode 100644 index 0000000..9f5d305 --- /dev/null +++ b/Assets/Materials/PlaneMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6083fe04391087ca294999838984a59c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/BallScene.unity b/Assets/Scenes/BallScene.unity index 3252943..b62cd46 100644 --- a/Assets/Scenes/BallScene.unity +++ b/Assets/Scenes/BallScene.unity @@ -123,6 +123,104 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &99618223 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 99618227} + - component: {fileID: 99618226} + - component: {fileID: 99618225} + - component: {fileID: 99618224} + m_Layer: 0 + m_Name: Plane + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &99618224 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 4 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &99618225 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 6083fe04391087ca294999838984a59c, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &99618226 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &99618227 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 99618223} + 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: 1 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &182244630 GameObject: m_ObjectHideFlags: 0 From d13b0b0b2bddfaa6458f351535c9c869c58179ff Mon Sep 17 00:00:00 2001 From: Ichirinko <1621543655@qq.com> Date: Fri, 24 Feb 2023 18:18:56 +0800 Subject: [PATCH 05/10] =?UTF-8?q?add:=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=90=84?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E4=B9=8B=E9=97=B4=E7=9A=84=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=9E=84=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Bonds.cs | 49 ++++++++++++++++ Assets/Bonds.cs.meta | 3 + Assets/MainBehaviour.cs | 122 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 Assets/Bonds.cs create mode 100644 Assets/Bonds.cs.meta diff --git a/Assets/Bonds.cs b/Assets/Bonds.cs new file mode 100644 index 0000000..bd58eac --- /dev/null +++ b/Assets/Bonds.cs @@ -0,0 +1,49 @@ +using UnityEngine; + +namespace Models +{ + public class Bonds + { + private GameObject start; + private GameObject end; + private GameObject bond; + + + public Bonds(GameObject start,GameObject end,float scale) + { + this.start = start; + this.end = end; + + bond = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + + bond.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + } + + + public void UpdateBond() + { + var startpos = start.transform.position; + var endpos = end.transform.position; + Vector3 rightPosition = (startpos + endpos) / 2; + Vector3 rightRotation = endpos - startpos; + float HalfLength = Vector3.Distance(startpos, endpos) / 2; + float LThickness = 0.1f;//线的粗细 + + //创建圆柱体 + + //bond.gameObject.transform.parent = transform; + bond.transform.position = rightPosition; + bond.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); + bond.transform.localScale = new Vector3(LThickness, HalfLength, LThickness); + + //这里可以设置材质,具体自己设置 + bond.GetComponent().material.color = Color.cyan; + + } + } + + + + + +} \ No newline at end of file diff --git a/Assets/Bonds.cs.meta b/Assets/Bonds.cs.meta new file mode 100644 index 0000000..5dc5c31 --- /dev/null +++ b/Assets/Bonds.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 94a8f8c83e58421d9447173d38482d74 +timeCreated: 1677230676 \ No newline at end of file diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index b6fc64a..7b3787e 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -6,6 +6,7 @@ public class MainBehaviour : MonoBehaviour { private readonly List _nodes = new List(); + private readonly List _bonds = new List(); private readonly List _poseTransforms = new List(); private readonly UdpListener _listener = new UdpListener(); private const float _scale = 0.2f; @@ -15,7 +16,7 @@ public class MainBehaviour : MonoBehaviour private void Start() { CreateNodes(); - + CreateBonds(); _listener.AddHandler(OnReceive); _listener.Connect(5000); } @@ -30,12 +31,17 @@ private void Update() var temp = new Vector4(_poseTransforms[index].MediaPipePos.x, _poseTransforms[index].MediaPipePos.y, _poseTransforms[index].MediaPipePos.z,1); - temp = RotateAxisX(-45) * temp; + //temp = RotateAxisX(-45) * temp; //warning:乘法的顺序不能改! _nodes[index].transform.position = new Vector3(-temp.x, -temp.y, -temp.z) * 5; //_nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; } + + foreach (var bond in _bonds) + { + bond.UpdateBond(); + } } private void OnDisable() @@ -72,6 +78,118 @@ private void CreateNodes() } } + private void CreateBonds() + { + //shit code,it's my fault + Bonds temp; + temp = new Bonds(_nodes[0], _nodes[4], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[0], _nodes[1], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[1], _nodes[2], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[2], _nodes[3], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[3], _nodes[7], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[4], _nodes[5], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[5], _nodes[6], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[6], _nodes[8], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[9], _nodes[10], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[2], _nodes[3], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[11], _nodes[12], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[12], _nodes[14], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[14], _nodes[16], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[16], _nodes[22], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[16], _nodes[18], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[18], _nodes[20], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[16], _nodes[20], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[11], _nodes[13], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[13], _nodes[15], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[15], _nodes[17], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[15], _nodes[21], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[15], _nodes[19], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[17], _nodes[19], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[12], _nodes[24], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[23], _nodes[24], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[11], _nodes[23], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[24], _nodes[26], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[26], _nodes[28], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[28], _nodes[32], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[28], _nodes[30], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[23], _nodes[25], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[25], _nodes[27], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[27], _nodes[29], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[27], _nodes[31], _scale); + _bonds.Add(temp); + + temp = new Bonds(_nodes[29], _nodes[31], _scale); + _bonds.Add(temp); + } + + + private void OnReceive(List landmarks) { foreach (var landmark in landmarks) From 31ce446737d7795837a2df8b25df41d9d3a8c967 Mon Sep 17 00:00:00 2001 From: Ichirinko <1621543655@qq.com> Date: Sun, 26 Feb 2023 21:02:08 +0800 Subject: [PATCH 06/10] =?UTF-8?q?add:=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E9=AA=A8=E9=AA=BC=EF=BC=8C=E7=94=A8=E4=BA=8E=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E6=96=B9=E5=90=91=E8=AE=A1=E7=AE=97=E7=9A=84=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Bonds.cs | 11 +++++--- Assets/MainBehaviour.cs | 23 ++++++++++++++--- Assets/Scenes/BallScene.unity | 8 +++--- Assets/VirtualSkeleton.cs | 46 ++++++++++++++++++++++++++++++++++ Assets/VirtualSkeleton.cs.meta | 3 +++ 5 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 Assets/VirtualSkeleton.cs create mode 100644 Assets/VirtualSkeleton.cs.meta diff --git a/Assets/Bonds.cs b/Assets/Bonds.cs index bd58eac..574f966 100644 --- a/Assets/Bonds.cs +++ b/Assets/Bonds.cs @@ -4,8 +4,8 @@ namespace Models { public class Bonds { - private GameObject start; - private GameObject end; + public GameObject start; + public GameObject end; private GameObject bond; @@ -17,6 +17,9 @@ public Bonds(GameObject start,GameObject end,float scale) bond = GameObject.CreatePrimitive(PrimitiveType.Cylinder); bond.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + + //这里可以设置材质,具体自己设置 + bond.GetComponent().material.color = Color.cyan; } @@ -36,8 +39,8 @@ public void UpdateBond() bond.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); bond.transform.localScale = new Vector3(LThickness, HalfLength, LThickness); - //这里可以设置材质,具体自己设置 - bond.GetComponent().material.color = Color.cyan; + + } } diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index 7b3787e..c3272ce 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -7,16 +7,19 @@ public class MainBehaviour : MonoBehaviour { private readonly List _nodes = new List(); private readonly List _bonds = new List(); + private readonly List _virtualSkeletons = new List(); private readonly List _poseTransforms = new List(); private readonly UdpListener _listener = new UdpListener(); private const float _scale = 0.2f; - + private GameObject sample ; // Start is called before the first frame update private void Start() { CreateNodes(); CreateBonds(); + + _listener.AddHandler(OnReceive); _listener.Connect(5000); } @@ -42,6 +45,11 @@ private void Update() { bond.UpdateBond(); } + + /*foreach (var vs in _virtualSkeletons) + { + vs.UpdateVS(); + }*/ } private void OnDisable() @@ -186,9 +194,18 @@ private void CreateBonds() temp = new Bonds(_nodes[29], _nodes[31], _scale); _bonds.Add(temp); + + + + /*foreach (var bond in _bonds) + { + var temp2 = new VirtualSkeleton(bond.start, bond.end, _scale); + _virtualSkeletons.Add(temp2); + }*/ + } - - + + private void OnReceive(List landmarks) { diff --git a/Assets/Scenes/BallScene.unity b/Assets/Scenes/BallScene.unity index b62cd46..b8324e2 100644 --- a/Assets/Scenes/BallScene.unity +++ b/Assets/Scenes/BallScene.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.18029127, g: 0.22572401, b: 0.3069303, a: 1} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -436,14 +436,14 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2045151417} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -7.44} + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 0, y: 0, z: 7} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!114 &2045151421 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/VirtualSkeleton.cs b/Assets/VirtualSkeleton.cs new file mode 100644 index 0000000..4e286b2 --- /dev/null +++ b/Assets/VirtualSkeleton.cs @@ -0,0 +1,46 @@ +using UnityEngine; +using UnityEngine.PlayerLoop; + +namespace Models +{ + public class VirtualSkeleton : Bonds + { + //private GameObject start; + //private GameObject end; + private GameObject virtualskeleton; + + + + public VirtualSkeleton(GameObject start,GameObject end,float scale) : base(start,end,scale) + { + this.start = start; + this.end = end; + + virtualskeleton = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + + virtualskeleton.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + + virtualskeleton.GetComponent().material.color = Color.white; + } + + public void UpdateVS() + { + + var startpos = start.transform.position; + var endpos = end.transform.position; + Vector3 rightPosition = (startpos + endpos) / 2; + Vector3 rightRotation = endpos - startpos; + + float LThickness = 0.2f;//线的粗细 + + //创建圆柱体 + + //bond.gameObject.transform.parent = transform; + virtualskeleton.transform.position = rightPosition; + virtualskeleton.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); + //virtualskeleton.transform.rotation = Quaternion.LookRotation(rightRotation, Vector3.forward); + virtualskeleton.transform.localScale = new Vector3(LThickness, LThickness, LThickness); + } + + } +} \ No newline at end of file diff --git a/Assets/VirtualSkeleton.cs.meta b/Assets/VirtualSkeleton.cs.meta new file mode 100644 index 0000000..067f9c7 --- /dev/null +++ b/Assets/VirtualSkeleton.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5f725336fc6a4481a4c7d74ec0e3b17b +timeCreated: 1677413910 \ No newline at end of file From 7199424893ca3bc08e9b30caa2e0778d5a72b8d9 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Sun, 26 Feb 2023 23:50:14 +0800 Subject: [PATCH 07/10] =?UTF-8?q?refact:=20=E5=B0=86=E6=97=8B=E8=BD=AC?= =?UTF-8?q?=E7=9F=A9=E9=98=B5=E7=9A=84=E8=AE=A1=E7=AE=97=E6=8A=BD=E8=B1=A1?= =?UTF-8?q?=E4=B8=BA=E6=97=8B=E8=BD=AC=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 49 +---------------------- Assets/Utils/RotateUtils.cs | 67 ++++++++++++++++++++++++++++++++ Assets/Utils/RotateUtils.cs.meta | 3 ++ 3 files changed, 71 insertions(+), 48 deletions(-) create mode 100644 Assets/Utils/RotateUtils.cs create mode 100644 Assets/Utils/RotateUtils.cs.meta diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index c3272ce..347103e 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -88,9 +88,7 @@ private void CreateNodes() private void CreateBonds() { - //shit code,it's my fault - Bonds temp; - temp = new Bonds(_nodes[0], _nodes[4], _scale); + var temp = new Bonds(_nodes[0], _nodes[4], _scale); _bonds.Add(temp); temp = new Bonds(_nodes[0], _nodes[1], _scale); @@ -219,49 +217,4 @@ private void OnReceive(List landmarks) _poseTransforms[(int)landmark.Type] = poseTransform; } } - - //绕X轴旋转 - private Matrix4x4 RotateAxisX(float rot) - { - var matrix = new Matrix4x4(); - float cosrot = MathF.Cos(rot); - float sinrot = MathF.Sin(rot); - - matrix.SetRow(0, new Vector4(1,0,0,0)); - matrix.SetRow(1, new Vector4(0,cosrot,-sinrot,0)); - matrix.SetRow(2, new Vector4(0,sinrot,cosrot,0)); - matrix.SetRow(3, new Vector4(0,0,0,1)); - - return matrix; - } - - //绕Y轴旋转 - private Matrix4x4 RotateAxisY(float rot) - { - var matrix = new Matrix4x4(); - float cosrot = MathF.Cos(rot); - float sinrot = MathF.Sin(rot); - - matrix.SetRow(0, new Vector4(cosrot,0,sinrot,0)); - matrix.SetRow(1, new Vector4(0,1,0,0)); - matrix.SetRow(2, new Vector4(-sinrot,0,cosrot,0)); - matrix.SetRow(3, new Vector4(0,0,0,1)); - - return matrix; - } - - //绕Z轴旋转 - private Matrix4x4 RotateAxisZ(float rot) - { - var matrix = new Matrix4x4(); - float cosrot = MathF.Cos(rot); - float sinrot = MathF.Sin(rot); - - matrix.SetRow(0, new Vector4(cosrot,-sinrot,0,0)); - matrix.SetRow(1, new Vector4(sinrot,cosrot,0,0)); - matrix.SetRow(2, new Vector4(0,0,1,0)); - matrix.SetRow(3, new Vector4(0,0,0,1)); - - return matrix; - } } diff --git a/Assets/Utils/RotateUtils.cs b/Assets/Utils/RotateUtils.cs new file mode 100644 index 0000000..5a8e52f --- /dev/null +++ b/Assets/Utils/RotateUtils.cs @@ -0,0 +1,67 @@ +using System; +using UnityEngine; + +namespace Utils +{ + /// + /// 旋转工具类 + /// + public static class RotateUtils + { + private static Matrix4x4 _matrix; + + /// + /// 获得绕X轴旋转矩阵 + /// + /// 旋转的角度 + /// + public static Matrix4x4 RotateAxisX(float degree) + { + var sin = MathF.Sin(degree); + var cos = MathF.Cos(degree); + + _matrix.SetRow(0 ,new Vector4(1,0,0,0)); + _matrix.SetRow(1, new Vector4(0, cos, -sin, 0)); + _matrix.SetRow(2, new Vector4(0, sin, cos, 0)); + _matrix.SetRow(3, new Vector4(0, 0, 0, 1)); + + return _matrix; + } + + /// + /// 获得绕Y轴旋转矩阵 + /// + /// 旋转的角度 + /// + public static Matrix4x4 RotateAxisY(float degree) + { + var sin = MathF.Sin(degree); + var cos = MathF.Cos(degree); + + _matrix.SetRow(0, new Vector4(cos, 0, sin, 0)); + _matrix.SetRow(1, new Vector4(0, 1, 0, 1)); + _matrix.SetRow(2, new Vector4(-sin, 0, cos, 0)); + _matrix.SetRow(3, new Vector4(0, 0, 0, 1)); + + return _matrix; + } + + /// + /// 获得绕Z轴旋转矩阵 + /// + /// 旋转的角度 + /// + public static Matrix4x4 RotateAxisZ(float degree) + { + var sin = MathF.Sin(degree); + var cos = MathF.Cos(degree); + + _matrix.SetRow(0, new Vector4(cos, -sin, 0, 0)); + _matrix.SetRow(1, new Vector4(sin, cos, 0, 0)); + _matrix.SetRow(2, new Vector4(0, 0, 1, 0)); + _matrix.SetRow(3, new Vector4(0, 0, 0, 1)); + + return _matrix; + } + } +} \ No newline at end of file diff --git a/Assets/Utils/RotateUtils.cs.meta b/Assets/Utils/RotateUtils.cs.meta new file mode 100644 index 0000000..3f6599f --- /dev/null +++ b/Assets/Utils/RotateUtils.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d748c6669d714e65a5ca9164c5798583 +timeCreated: 1677319275 \ No newline at end of file From 5113929728e2040685c3e21fc0fd747dfeab53d8 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Mon, 27 Feb 2023 11:07:44 +0800 Subject: [PATCH 08/10] =?UTF-8?q?feature:=20=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=96=B0=E5=BB=BA=E6=A3=8D=E5=AD=90=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20refact:=20=E9=87=8D=E6=9E=84=E4=BA=86Bond?= =?UTF-8?q?=E5=92=8CVirutalSkeleton=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Bonds.cs | 52 ----- Assets/MainBehaviour.cs | 183 +++++++++++++----- Assets/Models/Bond.cs | 44 +++++ Assets/{Bonds.cs.meta => Models/Bond.cs.meta} | 0 Assets/Models/VirtualSkeleton.cs | 35 ++++ Assets/{ => Models}/VirtualSkeleton.cs.meta | 0 Assets/VirtualSkeleton.cs | 46 ----- 7 files changed, 214 insertions(+), 146 deletions(-) delete mode 100644 Assets/Bonds.cs create mode 100644 Assets/Models/Bond.cs rename Assets/{Bonds.cs.meta => Models/Bond.cs.meta} (100%) create mode 100644 Assets/Models/VirtualSkeleton.cs rename Assets/{ => Models}/VirtualSkeleton.cs.meta (100%) delete mode 100644 Assets/VirtualSkeleton.cs diff --git a/Assets/Bonds.cs b/Assets/Bonds.cs deleted file mode 100644 index 574f966..0000000 --- a/Assets/Bonds.cs +++ /dev/null @@ -1,52 +0,0 @@ -using UnityEngine; - -namespace Models -{ - public class Bonds - { - public GameObject start; - public GameObject end; - private GameObject bond; - - - public Bonds(GameObject start,GameObject end,float scale) - { - this.start = start; - this.end = end; - - bond = GameObject.CreatePrimitive(PrimitiveType.Cylinder); - - bond.transform.localScale = new Vector3(scale/2, scale/2, scale/2); - - //这里可以设置材质,具体自己设置 - bond.GetComponent().material.color = Color.cyan; - } - - - public void UpdateBond() - { - var startpos = start.transform.position; - var endpos = end.transform.position; - Vector3 rightPosition = (startpos + endpos) / 2; - Vector3 rightRotation = endpos - startpos; - float HalfLength = Vector3.Distance(startpos, endpos) / 2; - float LThickness = 0.1f;//线的粗细 - - //创建圆柱体 - - //bond.gameObject.transform.parent = transform; - bond.transform.position = rightPosition; - bond.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); - bond.transform.localScale = new Vector3(LThickness, HalfLength, LThickness); - - - - - } - } - - - - - -} \ No newline at end of file diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index 347103e..51b5518 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using Models; using UnityEngine; @@ -6,11 +5,11 @@ public class MainBehaviour : MonoBehaviour { private readonly List _nodes = new List(); - private readonly List _bonds = new List(); + private readonly List _bonds = new List(); private readonly List _virtualSkeletons = new List(); private readonly List _poseTransforms = new List(); private readonly UdpListener _listener = new UdpListener(); - private const float _scale = 0.2f; + private const float Scale = 0.2f; private GameObject sample ; // Start is called before the first frame update @@ -63,7 +62,7 @@ private void CreateNodes() { var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); - ball.transform.localScale = new Vector3(_scale, _scale, _scale); + ball.transform.localScale = new Vector3(Scale, Scale, Scale); if (i <= 10) { @@ -88,122 +87,190 @@ private void CreateNodes() private void CreateBonds() { - var temp = new Bonds(_nodes[0], _nodes[4], _scale); + /*var temp = new Bonds(_nodes[0], _nodes[4], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[0], _nodes[1], _scale); + temp = new Bonds(_nodes[0], _nodes[1], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[1], _nodes[2], _scale); + temp = new Bonds(_nodes[1], _nodes[2], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[2], _nodes[3], _scale); + temp = new Bonds(_nodes[2], _nodes[3], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[3], _nodes[7], _scale); + temp = new Bonds(_nodes[3], _nodes[7], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[4], _nodes[5], _scale); + temp = new Bonds(_nodes[4], _nodes[5], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[5], _nodes[6], _scale); + temp = new Bonds(_nodes[5], _nodes[6], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[6], _nodes[8], _scale); + temp = new Bonds(_nodes[6], _nodes[8], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[9], _nodes[10], _scale); + temp = new Bonds(_nodes[9], _nodes[10], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[2], _nodes[3], _scale); + temp = new Bonds(_nodes[2], _nodes[3], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[11], _nodes[12], _scale); + temp = new Bonds(_nodes[11], _nodes[12], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[12], _nodes[14], _scale); + temp = new Bonds(_nodes[12], _nodes[14], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[14], _nodes[16], _scale); + temp = new Bonds(_nodes[14], _nodes[16], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[16], _nodes[22], _scale); + temp = new Bonds(_nodes[16], _nodes[22], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[16], _nodes[18], _scale); + temp = new Bonds(_nodes[16], _nodes[18], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[18], _nodes[20], _scale); + temp = new Bonds(_nodes[18], _nodes[20], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[16], _nodes[20], _scale); + temp = new Bonds(_nodes[16], _nodes[20], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[11], _nodes[13], _scale); + temp = new Bonds(_nodes[11], _nodes[13], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[13], _nodes[15], _scale); + temp = new Bonds(_nodes[13], _nodes[15], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[15], _nodes[17], _scale); + temp = new Bonds(_nodes[15], _nodes[17], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[15], _nodes[21], _scale); + temp = new Bonds(_nodes[15], _nodes[21], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[15], _nodes[19], _scale); + temp = new Bonds(_nodes[15], _nodes[19], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[17], _nodes[19], _scale); + temp = new Bonds(_nodes[17], _nodes[19], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[12], _nodes[24], _scale); + temp = new Bonds(_nodes[12], _nodes[24], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[23], _nodes[24], _scale); + temp = new Bonds(_nodes[23], _nodes[24], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[11], _nodes[23], _scale); + temp = new Bonds(_nodes[11], _nodes[23], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[24], _nodes[26], _scale); + temp = new Bonds(_nodes[24], _nodes[26], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[26], _nodes[28], _scale); + temp = new Bonds(_nodes[26], _nodes[28], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[28], _nodes[32], _scale); + temp = new Bonds(_nodes[28], _nodes[32], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[28], _nodes[30], _scale); + temp = new Bonds(_nodes[28], _nodes[30], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[23], _nodes[25], _scale); + temp = new Bonds(_nodes[23], _nodes[25], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[25], _nodes[27], _scale); + temp = new Bonds(_nodes[25], _nodes[27], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[27], _nodes[29], _scale); + temp = new Bonds(_nodes[27], _nodes[29], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[27], _nodes[31], _scale); + temp = new Bonds(_nodes[27], _nodes[31], Scale); _bonds.Add(temp); - temp = new Bonds(_nodes[29], _nodes[31], _scale); - _bonds.Add(temp); + temp = new Bonds(_nodes[29], _nodes[31], Scale); + _bonds.Add(temp);*/ - - - /*foreach (var bond in _bonds) + var headBonds = new[] { - var temp2 = new VirtualSkeleton(bond.start, bond.end, _scale); - _virtualSkeletons.Add(temp2); - }*/ + PoseLandmarkType.RightEar, + PoseLandmarkType.RightEyeOuter, + PoseLandmarkType.RightEye, + PoseLandmarkType.RightEyeInner, + PoseLandmarkType.Nose, + PoseLandmarkType.LeftEyeInner, + PoseLandmarkType.LeftEye, + PoseLandmarkType.LeftEyeOuter, + PoseLandmarkType.LeftEar + }; + _bonds.AddRange(GenerateBondsList(headBonds)); + + var monthBonds = new[] + { + PoseLandmarkType.MouthLeft, + PoseLandmarkType.MouthRight, + }; + _bonds.AddRange(GenerateBondsList(monthBonds)); + + var leftArmBonds = new[] + { + PoseLandmarkType.LeftShoulder, + PoseLandmarkType.LeftElbow, + PoseLandmarkType.LeftWrist, + PoseLandmarkType.LeftPinky, + PoseLandmarkType.LeftIndex, + PoseLandmarkType.LeftWrist, + PoseLandmarkType.LeftThumb + }; + _bonds.AddRange(GenerateBondsList(leftArmBonds)); + + var rightArmBonds = new[] + { + PoseLandmarkType.RightShoulder, + PoseLandmarkType.RightElbow, + PoseLandmarkType.RightWrist, + PoseLandmarkType.RightPinky, + PoseLandmarkType.RightIndex, + PoseLandmarkType.RightWrist, + PoseLandmarkType.RightThumb + }; + _bonds.AddRange(GenerateBondsList(rightArmBonds)); + + var leftLegBonds = new[] + { + PoseLandmarkType.LeftShoulder, + PoseLandmarkType.LeftHip, + PoseLandmarkType.LeftKnee, + PoseLandmarkType.LeftAnkle, + PoseLandmarkType.LeftHeel, + PoseLandmarkType.LeftFootIndex, + PoseLandmarkType.LeftAnkle + }; + _bonds.AddRange(GenerateBondsList(leftLegBonds)); + + var rightLegBonds = new[] + { + PoseLandmarkType.RightShoulder, + PoseLandmarkType.RightHip, + PoseLandmarkType.RightKnee, + PoseLandmarkType.RightAnkle, + PoseLandmarkType.RightHeel, + PoseLandmarkType.RightFootIndex, + PoseLandmarkType.RightAnkle + }; + _bonds.AddRange(GenerateBondsList(rightLegBonds)); + // 最后手动添加身体上的两条横线 + _bonds.Add(new Bond( + _nodes[(int)PoseLandmarkType.LeftShoulder], + _nodes[(int)PoseLandmarkType.RightShoulder], + Scale)); + _bonds.Add(new Bond( + _nodes[(int)PoseLandmarkType.LeftHip], + _nodes[(int)PoseLandmarkType.RightHip], + Scale)); } - - private void OnReceive(List landmarks) { @@ -217,4 +284,24 @@ private void OnReceive(List landmarks) _poseTransforms[(int)landmark.Type] = poseTransform; } } + + /// + /// 创建棍子列表 + /// + /// 需要连接起来的关键点 需要按顺序设置 + /// + private List GenerateBondsList(PoseLandmarkType[] nodes) + { + var bonds = new List(); + + for (var i = 0; i < nodes.Length - 1; i++) + { + bonds.Add(new Bond( + _nodes[(int)nodes[i]], + _nodes[(int)nodes[i + 1]], + Scale)); + } + + return bonds; + } } diff --git a/Assets/Models/Bond.cs b/Assets/Models/Bond.cs new file mode 100644 index 0000000..a6868d1 --- /dev/null +++ b/Assets/Models/Bond.cs @@ -0,0 +1,44 @@ +using UnityEngine; + +namespace Models +{ + /// + /// 捕捉点之间的连接线 + /// + public class Bond + { + protected readonly GameObject Start; + protected readonly GameObject End; + private readonly GameObject _bond; + + public Bond(GameObject start,GameObject end,float scale) + { + Start = start; + End = end; + + _bond = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + + _bond.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + + //这里可以设置材质,具体自己设置 + _bond.GetComponent().material.color = Color.cyan; + } + + + public void UpdateBond() + { + var startPos = Start.transform.position; + var endPos = End.transform.position; + var rightPosition = (startPos + endPos) / 2; + var rightRotation = endPos - startPos; + var halfLength = Vector3.Distance(startPos, endPos) / 2; + var thickness = 0.1f;//线的粗细 + + //创建圆柱体 + //bond.gameObject.transform.parent = transform; + _bond.transform.position = rightPosition; + _bond.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); + _bond.transform.localScale = new Vector3(thickness, halfLength, thickness); + } + } +} \ No newline at end of file diff --git a/Assets/Bonds.cs.meta b/Assets/Models/Bond.cs.meta similarity index 100% rename from Assets/Bonds.cs.meta rename to Assets/Models/Bond.cs.meta diff --git a/Assets/Models/VirtualSkeleton.cs b/Assets/Models/VirtualSkeleton.cs new file mode 100644 index 0000000..d325d3f --- /dev/null +++ b/Assets/Models/VirtualSkeleton.cs @@ -0,0 +1,35 @@ +using UnityEngine; + +namespace Models +{ + public class VirtualSkeleton : Bond + { + private readonly GameObject _virtualSkeleton; + + public VirtualSkeleton(GameObject start,GameObject end,float scale) : base(start,end,scale) + { + _virtualSkeleton = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + + _virtualSkeleton.transform.localScale = new Vector3(scale/2, scale/2, scale/2); + + _virtualSkeleton.GetComponent().material.color = Color.white; + } + + /// + /// 覆盖基类的更新方法 + /// + public new void UpdateBond() + { + var startPos = Start.transform.position; + var endPos = End.transform.position; + + var rightPosition = (startPos + endPos) / 2; + var rightRotation = endPos - startPos; + var lThickness = 0.2f; + + _virtualSkeleton.transform.position = rightPosition; + _virtualSkeleton.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); + _virtualSkeleton.transform.localScale = new Vector3(lThickness, lThickness, lThickness); + } + } +} \ No newline at end of file diff --git a/Assets/VirtualSkeleton.cs.meta b/Assets/Models/VirtualSkeleton.cs.meta similarity index 100% rename from Assets/VirtualSkeleton.cs.meta rename to Assets/Models/VirtualSkeleton.cs.meta diff --git a/Assets/VirtualSkeleton.cs b/Assets/VirtualSkeleton.cs deleted file mode 100644 index 4e286b2..0000000 --- a/Assets/VirtualSkeleton.cs +++ /dev/null @@ -1,46 +0,0 @@ -using UnityEngine; -using UnityEngine.PlayerLoop; - -namespace Models -{ - public class VirtualSkeleton : Bonds - { - //private GameObject start; - //private GameObject end; - private GameObject virtualskeleton; - - - - public VirtualSkeleton(GameObject start,GameObject end,float scale) : base(start,end,scale) - { - this.start = start; - this.end = end; - - virtualskeleton = GameObject.CreatePrimitive(PrimitiveType.Cylinder); - - virtualskeleton.transform.localScale = new Vector3(scale/2, scale/2, scale/2); - - virtualskeleton.GetComponent().material.color = Color.white; - } - - public void UpdateVS() - { - - var startpos = start.transform.position; - var endpos = end.transform.position; - Vector3 rightPosition = (startpos + endpos) / 2; - Vector3 rightRotation = endpos - startpos; - - float LThickness = 0.2f;//线的粗细 - - //创建圆柱体 - - //bond.gameObject.transform.parent = transform; - virtualskeleton.transform.position = rightPosition; - virtualskeleton.transform.rotation = Quaternion.FromToRotation(Vector3.up, rightRotation); - //virtualskeleton.transform.rotation = Quaternion.LookRotation(rightRotation, Vector3.forward); - virtualskeleton.transform.localScale = new Vector3(LThickness, LThickness, LThickness); - } - - } -} \ No newline at end of file From 6eba30e2685bd3410be7f5608114d7850ec68dfc Mon Sep 17 00:00:00 2001 From: jackfiled Date: Mon, 27 Feb 2023 13:34:19 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=BA=86foreach?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E8=AD=A6=E5=91=8A=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20refact:=20=E7=A7=BB=E5=8A=A8UdpListener=E5=88=B0Utils?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 127 ++----------------------- Assets/{ => Utils}/UdpListener.cs | 0 Assets/{ => Utils}/UdpListener.cs.meta | 0 3 files changed, 8 insertions(+), 119 deletions(-) rename Assets/{ => Utils}/UdpListener.cs (100%) rename Assets/{ => Utils}/UdpListener.cs.meta (100%) diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index 51b5518..3c92bfc 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -10,15 +10,13 @@ public class MainBehaviour : MonoBehaviour private readonly List _poseTransforms = new List(); private readonly UdpListener _listener = new UdpListener(); private const float Scale = 0.2f; - private GameObject sample ; // Start is called before the first frame update private void Start() { CreateNodes(); CreateBonds(); - - + _listener.AddHandler(OnReceive); _listener.Connect(5000); } @@ -26,18 +24,14 @@ private void Start() // Update is called once per frame private void Update() { - foreach (var poseTransform in _poseTransforms) + for (var i = 0; i < 33; i++) { - var index = (int)poseTransform.MediaPipeName; - - var temp = new Vector4(_poseTransforms[index].MediaPipePos.x, - _poseTransforms[index].MediaPipePos.y, - _poseTransforms[index].MediaPipePos.z,1); - //temp = RotateAxisX(-45) * temp; - //warning:乘法的顺序不能改! - - _nodes[index].transform.position = new Vector3(-temp.x, -temp.y, -temp.z) * 5; - //_nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5; + var temp = new Vector4(_poseTransforms[i].MediaPipePos.x, + _poseTransforms[i].MediaPipePos.y, + _poseTransforms[i].MediaPipePos.z, + 1); + + _nodes[i].transform.position = new Vector3(-temp.x, -temp.y, -temp.z) * 5; } foreach (var bond in _bonds) @@ -87,111 +81,6 @@ private void CreateNodes() private void CreateBonds() { - /*var temp = new Bonds(_nodes[0], _nodes[4], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[0], _nodes[1], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[1], _nodes[2], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[2], _nodes[3], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[3], _nodes[7], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[4], _nodes[5], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[5], _nodes[6], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[6], _nodes[8], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[9], _nodes[10], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[2], _nodes[3], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[11], _nodes[12], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[12], _nodes[14], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[14], _nodes[16], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[16], _nodes[22], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[16], _nodes[18], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[18], _nodes[20], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[16], _nodes[20], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[11], _nodes[13], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[13], _nodes[15], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[15], _nodes[17], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[15], _nodes[21], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[15], _nodes[19], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[17], _nodes[19], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[12], _nodes[24], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[23], _nodes[24], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[11], _nodes[23], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[24], _nodes[26], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[26], _nodes[28], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[28], _nodes[32], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[28], _nodes[30], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[23], _nodes[25], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[25], _nodes[27], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[27], _nodes[29], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[27], _nodes[31], Scale); - _bonds.Add(temp); - - temp = new Bonds(_nodes[29], _nodes[31], Scale); - _bonds.Add(temp);*/ - var headBonds = new[] { PoseLandmarkType.RightEar, diff --git a/Assets/UdpListener.cs b/Assets/Utils/UdpListener.cs similarity index 100% rename from Assets/UdpListener.cs rename to Assets/Utils/UdpListener.cs diff --git a/Assets/UdpListener.cs.meta b/Assets/Utils/UdpListener.cs.meta similarity index 100% rename from Assets/UdpListener.cs.meta rename to Assets/Utils/UdpListener.cs.meta From 17553850356539781be50211b5a35aad5ecb6a58 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Tue, 28 Feb 2023 12:23:15 +0800 Subject: [PATCH 10/10] =?UTF-8?q?add:=20=E6=B7=BB=E5=8A=A0=E5=B9=B3?= =?UTF-8?q?=E5=9D=87=E6=BB=A4=E6=B3=A2=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/MainBehaviour.cs | 51 ++++++++++------------------- Assets/ModelBehaviour.cs | 24 -------------- Assets/Models/PoseLandmarkType.cs | 3 +- Assets/Models/PoseTransform.cs | 54 ++++++++++++++++++++++++------- 4 files changed, 61 insertions(+), 71 deletions(-) diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index 3c92bfc..00ff8bb 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -4,16 +4,17 @@ public class MainBehaviour : MonoBehaviour { - private readonly List _nodes = new List(); + private readonly GameObject[] _nodes = new GameObject[(int)PoseLandmarkType.MaxValue]; private readonly List _bonds = new List(); - private readonly List _virtualSkeletons = new List(); - private readonly List _poseTransforms = new List(); + private readonly PoseTransform[] _poseTransforms = new PoseTransform[(int)PoseLandmarkType.MaxValue]; private readonly UdpListener _listener = new UdpListener(); private const float Scale = 0.2f; // Start is called before the first frame update private void Start() { + PoseTransform.AverageLength = 3; + CreateNodes(); CreateBonds(); @@ -24,35 +25,33 @@ private void Start() // Update is called once per frame private void Update() { - for (var i = 0; i < 33; i++) + for (var i = 0; i < (int)PoseLandmarkType.MaxValue; i++) { - var temp = new Vector4(_poseTransforms[i].MediaPipePos.x, - _poseTransforms[i].MediaPipePos.y, - _poseTransforms[i].MediaPipePos.z, - 1); - - _nodes[i].transform.position = new Vector3(-temp.x, -temp.y, -temp.z) * 5; + _nodes[i].transform.position = _poseTransforms[i].AveragePos * -5; } foreach (var bond in _bonds) { bond.UpdateBond(); } - - /*foreach (var vs in _virtualSkeletons) - { - vs.UpdateVS(); - }*/ } private void OnDisable() { _listener.DisConnect(); } + + private void OnReceive(List landmarks) + { + foreach (var landmark in landmarks) + { + PoseTransform.UpdatePosition(ref _poseTransforms[(int)landmark.Type], landmark); + } + } private void CreateNodes() { - for (var i = 0; i < 33; i++) + for (var i = 0; i < (int)PoseLandmarkType.MaxValue; i++) { var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); @@ -70,12 +69,9 @@ private void CreateNodes() { ball.GetComponent().material.color = Color.green;//给脚部添加颜色 } - - _nodes.Add(ball); - var poseTransform = new PoseTransform((PoseLandmarkType)i); - - _poseTransforms.Add(poseTransform); + _nodes[i] = ball; + _poseTransforms[i] = new PoseTransform((PoseLandmarkType)i); } } @@ -160,19 +156,6 @@ private void CreateBonds() _nodes[(int)PoseLandmarkType.RightHip], Scale)); } - - private void OnReceive(List landmarks) - { - foreach (var landmark in landmarks) - { - var poseTransform = new PoseTransform(landmark.Type) - { - MediaPipePos = new Vector3(landmark.X, landmark.Y, landmark.Z) - }; - - _poseTransforms[(int)landmark.Type] = poseTransform; - } - } /// /// 创建棍子列表 diff --git a/Assets/ModelBehaviour.cs b/Assets/ModelBehaviour.cs index c153a57..f7e640b 100644 --- a/Assets/ModelBehaviour.cs +++ b/Assets/ModelBehaviour.cs @@ -58,31 +58,7 @@ private static void RigPoint(List landmarks) foreach (var landmark in landmarks) { - PoseTransforms[(int)landmark.Type].CalculateCurrentQuaternion(landmark); - - // var temp = _posLandmarks.Find(t=>t.mediaPipeName == landmark.Type.ToString()); - // var sum = new Vector3(0,0,0); - //var mediatemp = new Vector3(landmark.X, landmark.Y, landmark.Z); - //temp.mediaPipePos = new Vector3(landmark.X, landmark.Y, landmark.Z); - //temp.mediaPipePos.x = landmark.X; - //temp.mediaPipePos.y = landmark.Y; - //temp.mediaPipePos.z = landmark.Z; - //foreach (var parents in temp.parent) - //{ - // if (parents != null) - // { - // sum += parents.mediaPipePos; - // } - - - //} - - //var currentPos = sum / temp.parent.Count(); - - //temp.currentQ = Quaternion.Euler(temp.mediaPipePos - currentPos); - - //Debug.Log("Here!!"); } } diff --git a/Assets/Models/PoseLandmarkType.cs b/Assets/Models/PoseLandmarkType.cs index c32eda7..7b86f39 100644 --- a/Assets/Models/PoseLandmarkType.cs +++ b/Assets/Models/PoseLandmarkType.cs @@ -35,6 +35,7 @@ public enum PoseLandmarkType LeftHeel, RightHeel, LeftFootIndex, - RightFootIndex + RightFootIndex, + MaxValue } } \ No newline at end of file diff --git a/Assets/Models/PoseTransform.cs b/Assets/Models/PoseTransform.cs index f62c320..c2919b1 100644 --- a/Assets/Models/PoseTransform.cs +++ b/Assets/Models/PoseTransform.cs @@ -19,9 +19,14 @@ public struct PoseTransform public readonly HumanBodyBones UnityName; /// - /// MediaPipe捕捉空间坐标 + /// 取平均的长度 /// - public Vector3 MediaPipePos; + public static int AverageLength; + + /// + /// 取平均之后的结果 + /// + public Vector3 AveragePos; /// /// 节点的父节点列表 @@ -38,27 +43,52 @@ public struct PoseTransform /// public Quaternion CurrentQuaternion; + private int _count; + private readonly Queue _landmarkQueue; + public PoseTransform( - PoseLandmarkType type + PoseLandmarkType type, + int averageLength = 5 ) { MediaPipeName = type; UnityName = GetRelatedBone(type); - MediaPipePos = new Vector3(); + AveragePos = new Vector3(); Parent = new List(); PreviousQuaternion = new Quaternion(); CurrentQuaternion = new Quaternion(); + AverageLength = averageLength; + + _count = 0; + _landmarkQueue = new Queue(); } - /// - /// 计算当前的旋转四元数 - /// - /// - public void CalculateCurrentQuaternion(PoseLandmark landmark) + public static void UpdatePosition(ref PoseTransform pose, PoseLandmark landmark) { - MediaPipePos.x = landmark.X; - MediaPipePos.y = landmark.Y; - MediaPipePos.z = landmark.Z; + if (pose._count < AverageLength) + { + pose._landmarkQueue.Enqueue(landmark); + pose._count++; + } + else + { + pose._landmarkQueue.Dequeue(); + pose._landmarkQueue.Enqueue(landmark); + + var sum = new Vector3(); + + foreach (var poseLandmark in pose._landmarkQueue) + { + sum += new Vector3(poseLandmark.X, poseLandmark.Y, poseLandmark.Z); + } + + pose.AveragePos = sum / AverageLength; + } + } + + public static void CalculateRotation(PoseTransform poseTransform) + { + } ///