diff --git a/Assets/MainBehaviour.cs b/Assets/MainBehaviour.cs index b4499c5..2823943 100644 --- a/Assets/MainBehaviour.cs +++ b/Assets/MainBehaviour.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Models; using UnityEngine; +using Utils.PoseTransformHandlers; public class MainBehaviour : MonoBehaviour { @@ -27,7 +28,7 @@ private void Update() { for (var i = 0; i < PoseLandmarkType.MaxValue; i++) { - _nodes[i].transform.position = _poseTransforms[i].AveragePos * -5; + _nodes[i].transform.position = _poseTransforms[i].ResultPosition * -5; } foreach (var bond in _bonds) @@ -51,7 +52,7 @@ private void OnReceive(List landmarks) private void CreateNodes() { - for (var i = 0; i < (int)PoseLandmarkType.MaxValue; i++) + for (var i = 0; i < PoseLandmarkType.MaxValue; i++) { var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere); @@ -71,7 +72,7 @@ private void CreateNodes() } _nodes[i] = ball; - _poseTransforms[i] = new PoseTransform(i); + _poseTransforms[i] = new PoseTransform(i, new AverageHandler()); } } diff --git a/Assets/ModelBehaviour.cs b/Assets/ModelBehaviour.cs index 826aff0..908fe6e 100644 --- a/Assets/ModelBehaviour.cs +++ b/Assets/ModelBehaviour.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Models; using UnityEngine; +using Utils.PoseTransformHandlers; public class ModelBehaviour : MonoBehaviour { @@ -34,12 +35,12 @@ private void Update() foreach (var parent in landmark.Parent) { - parentsum += PoseTransforms[parent.Value].AveragePos; + parentsum += PoseTransforms[parent.Value].ResultPosition; } parentsum /= landmark.Parent.Count; - transfrom.rotation = Quaternion.FromToRotation(transfrom.rotation.eulerAngles,landmark.AveragePos-parentsum); + transfrom.rotation = Quaternion.FromToRotation(transfrom.rotation.eulerAngles,landmark.ResultPosition-parentsum); } } @@ -71,7 +72,7 @@ private static void RigPoint(List landmarks) PoseTransform.UpdatePosition(ref PoseTransforms[landmark.Type.Value], landmark); - Debug.Log(PoseTransforms[landmark.Type.Value].UnityName+":"+PoseTransforms[landmark.Type.Value].AveragePos); + Debug.Log(PoseTransforms[landmark.Type.Value].UnityName+":"+PoseTransforms[landmark.Type.Value].ResultPosition); } } @@ -83,7 +84,7 @@ private void InitPoseTransformList() { for (var type = 0; type <= PoseLandmarkType.RightFootIndex; type++) { - var item = new PoseTransform(type); + var item = new PoseTransform(type, new NormalHandler()); if (item.UnityName != HumanBodyBones.LastBone) { diff --git a/Assets/Models/PoseLandmarkType.cs b/Assets/Models/PoseLandmarkType.cs index a781564..513df64 100644 --- a/Assets/Models/PoseLandmarkType.cs +++ b/Assets/Models/PoseLandmarkType.cs @@ -3,7 +3,7 @@ namespace Models { //名字 - public struct PoseLandmarkType + public readonly struct PoseLandmarkType { public const int Nose = 0; public const int LeftEyeInner = 1; diff --git a/Assets/Models/PoseTransform.cs b/Assets/Models/PoseTransform.cs index 293a22c..877e33c 100644 --- a/Assets/Models/PoseTransform.cs +++ b/Assets/Models/PoseTransform.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using UnityEngine; -using System; -using System.Collections; +using Utils; namespace Models { @@ -23,12 +22,12 @@ public struct PoseTransform /// /// 取平均的长度 /// - public static int AverageLength; + public static int AverageLength = 3; /// /// 取平均之后的结果 /// - public Vector3 AveragePos; + public Vector3 ResultPosition => _transformHandler.GetResultPosition(); /// /// 节点的父节点列表 @@ -44,56 +43,26 @@ public struct PoseTransform /// 骨骼节点的当前角度 /// public Quaternion CurrentQuaternion; - - private int _count; - private readonly Queue _landmarkQueue; + + private readonly IPoseTransformHandler _transformHandler; public PoseTransform( int type, - int averageLength = 5 + IPoseTransformHandler handler ) { MediaPipeName = new PoseLandmarkType(type); UnityName = GetRelatedBone(MediaPipeName); - AveragePos = new Vector3(); Parent = new List(); PreviousQuaternion = new Quaternion(); CurrentQuaternion = new Quaternion(); - AverageLength = averageLength; - _count = 0; - _landmarkQueue = new Queue(); + _transformHandler = handler; } public static void UpdatePosition(ref PoseTransform pose, PoseLandmark landmark) { - if (pose._count < AverageLength) - { - pose._landmarkQueue.Enqueue(landmark); - pose._count++; - } - else - { - pose._landmarkQueue.Dequeue(); - pose._landmarkQueue.Enqueue(landmark); - - var sum = new Vector3(); - - var parentsum = new Vector3(0f,0f,0f); - - foreach (var poseLandmark in pose._landmarkQueue) - { - sum += new Vector3(poseLandmark.X, poseLandmark.Y, poseLandmark.Z); - } - - pose.AveragePos = sum / AverageLength; - - - - - //pose.CurrentQuaternion = Quaternion.LookRotation(pose.AveragePos - parentsum).normalized; - - } + pose._transformHandler.ReceivePoseLandmark(landmark); } public static void CalculateRotation(ref PoseTransform poseTransform, PoseLandmark landmark) diff --git a/Assets/Utils/IPoseTransformHandler.cs b/Assets/Utils/IPoseTransformHandler.cs new file mode 100644 index 0000000..808d6ae --- /dev/null +++ b/Assets/Utils/IPoseTransformHandler.cs @@ -0,0 +1,23 @@ +using Models; +using UnityEngine; + +namespace Utils +{ + /// + /// 坐标处理接口 + /// + public interface IPoseTransformHandler + { + /// + /// 传入新收到的坐标点 + /// + /// + public void ReceivePoseLandmark(PoseLandmark landmark); + + /// + /// 获得处理之后的坐标点 + /// + /// + public Vector3 GetResultPosition(); + } +} \ No newline at end of file diff --git a/Assets/Utils/IPoseTransformHandler.cs.meta b/Assets/Utils/IPoseTransformHandler.cs.meta new file mode 100644 index 0000000..c08d74b --- /dev/null +++ b/Assets/Utils/IPoseTransformHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 09e98a9502f0470f827a472058068bc4 +timeCreated: 1677676325 \ No newline at end of file diff --git a/Assets/Utils/PoseTransformHandlers.meta b/Assets/Utils/PoseTransformHandlers.meta new file mode 100644 index 0000000..b41ce0e --- /dev/null +++ b/Assets/Utils/PoseTransformHandlers.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 790fe29ab090465183945d02718de6a9 +timeCreated: 1677676888 \ No newline at end of file diff --git a/Assets/Utils/PoseTransformHandlers/AverageHandler.cs b/Assets/Utils/PoseTransformHandlers/AverageHandler.cs new file mode 100644 index 0000000..11c0442 --- /dev/null +++ b/Assets/Utils/PoseTransformHandlers/AverageHandler.cs @@ -0,0 +1,41 @@ +using Models; +using UnityEngine; +using System.Collections.Concurrent; + +namespace Utils.PoseTransformHandlers +{ + public class AverageHandler : IPoseTransformHandler + { + public static int AverageLength = 3; + // 线程安全的队列集合 + // 据文档描述甚至没有使用锁 + private readonly ConcurrentQueue _queue = new ConcurrentQueue(); + + public void ReceivePoseLandmark(PoseLandmark landmark) + { + if (_queue.Count < AverageLength) + { + _queue.Enqueue(landmark); + } + else + { + if (_queue.TryDequeue(out _)) + { + _queue.Enqueue(landmark); + } + } + } + + public Vector3 GetResultPosition() + { + var sum = new Vector3(); + + foreach (var item in _queue) + { + sum += new Vector3(item.X, item.Y, item.Z); + } + + return sum / AverageLength; + } + } +} \ No newline at end of file diff --git a/Assets/Utils/PoseTransformHandlers/AverageHandler.cs.meta b/Assets/Utils/PoseTransformHandlers/AverageHandler.cs.meta new file mode 100644 index 0000000..47ced42 --- /dev/null +++ b/Assets/Utils/PoseTransformHandlers/AverageHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c02b0d03301d408faf81931a69679f5c +timeCreated: 1677676898 \ No newline at end of file diff --git a/Assets/Utils/PoseTransformHandlers/NormalHandler.cs b/Assets/Utils/PoseTransformHandlers/NormalHandler.cs new file mode 100644 index 0000000..3020fbf --- /dev/null +++ b/Assets/Utils/PoseTransformHandlers/NormalHandler.cs @@ -0,0 +1,20 @@ +using Models; +using UnityEngine; + +namespace Utils.PoseTransformHandlers +{ + public class NormalHandler : IPoseTransformHandler + { + private Vector3 _result; + + public void ReceivePoseLandmark(PoseLandmark landmark) + { + _result = new Vector3(landmark.X, landmark.Y, landmark.Z); + } + + public Vector3 GetResultPosition() + { + return _result; + } + } +} \ No newline at end of file diff --git a/Assets/Utils/PoseTransformHandlers/NormalHandler.cs.meta b/Assets/Utils/PoseTransformHandlers/NormalHandler.cs.meta new file mode 100644 index 0000000..40473c0 --- /dev/null +++ b/Assets/Utils/PoseTransformHandlers/NormalHandler.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 93a33f47f3654fd3b27dd18db88fcc55 +timeCreated: 1677678654 \ No newline at end of file