using System.Collections.Generic; using Models; using UnityEngine; 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); } // Update is called once per frame private void Update() { foreach (var poseTransform in _poseTransforms) { 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; } foreach (var bond in _bonds) { bond.UpdateBond(); } /*foreach (var vs in _virtualSkeletons) { vs.UpdateVS(); }*/ } 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(Scale, Scale, Scale); if (i <= 10) { ball.GetComponent().material.color = Color.red;//给头部添加颜色 } else if (i <= 22) { ball.GetComponent().material.color = Color.blue;//给手部添加颜色 } else if (i <= 32) { ball.GetComponent().material.color = Color.green;//给脚部添加颜色 } _nodes.Add(ball); var poseTransform = new PoseTransform((PoseLandmarkType)i); _poseTransforms.Add(poseTransform); } } 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, 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) { 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; } } /// /// 创建棍子列表 /// /// 需要连接起来的关键点 需要按顺序设置 /// 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; } }