using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using Models; using UnityEngine; public class ModelController : MonoBehaviour { Animator animator; private readonly UdpListener _listener = new UdpListener(); private static List _posLandmarks = new List(); void Start() { animator = this.GetComponent(); // 获取动画控件 TransformatorInit(); //匹配初始化 _listener.AddHandler(LogLandmarks); _listener.AddHandler(RigPoint); _listener.Connect(5000); } // Update is called once per frame void Update() { foreach (var landmark in _posLandmarks) { //animator.GetBoneTransform(landmark.unityName).rotation = landmark.currentQ; } } private void OnDisable() { _listener.DisConnect(); } private static void LogLandmarks(List landmarks) { foreach (var landmark in landmarks) { Debug.Log(landmark.ToString()); } } //获取传上来的数据点坐标转换成四元数的回调函数 private static void RigPoint(List landmarks) { foreach (var landmark in landmarks) { 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!!"); } } private void TransformatorInit() { /*下面的语句的顺序最好别调换,不然可能会发生难以预料的事情*/ PosTransformator[] transformator = new PosTransformator[15]; { var temp = new PosTransformator(); temp.mediaPipeName = "LeftHip"; temp.unityName = HumanBodyBones.LeftUpperLeg; temp.parent.Add(null); transformator[0] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightHip"; temp.unityName = HumanBodyBones.RightUpperLeg; temp.parent.Add(null); transformator[1] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "LeftShoulder"; temp.unityName = HumanBodyBones.LeftUpperArm; temp.parent.Add(transformator[0]); temp.parent.Add(transformator[1]); transformator[2] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightShoulder"; temp.unityName = HumanBodyBones.RightUpperArm; temp.parent.Add(transformator[0]); temp.parent.Add(transformator[1]); transformator[3] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "Nose"; temp.unityName = HumanBodyBones.Head; temp.parent.Add(transformator[2]); temp.parent.Add(transformator[3]); transformator[4] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "LeftElbow"; temp.unityName = HumanBodyBones.LeftLowerArm; temp.parent.Add(transformator[2]); transformator[5] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightElbow"; temp.unityName = HumanBodyBones.RightLowerArm; temp.parent.Add(transformator[3]); transformator[6] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "LeftWrist"; temp.unityName = HumanBodyBones.LeftHand; temp.parent.Add(transformator[5]); transformator[7] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightWrist"; temp.unityName = HumanBodyBones.RightHand; temp.parent.Add(transformator[6]); transformator[8] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "LeftKnee"; temp.unityName = HumanBodyBones.LeftLowerLeg; temp.parent.Add(transformator[0]); transformator[9] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightKnee"; temp.unityName = HumanBodyBones.RightLowerLeg; temp.parent.Add(transformator[1]); transformator[10] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "LeftAnkle"; temp.unityName = HumanBodyBones.LeftFoot; temp.parent.Add(transformator[9]); transformator[11] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightAnkle"; temp.unityName = HumanBodyBones.RightFoot; temp.parent.Add(transformator[10]); transformator[12] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "LeftFootIndex"; temp.unityName = HumanBodyBones.LeftToes; temp.parent.Add(transformator[11]); transformator[13] = temp; } { var temp = new PosTransformator(); temp.mediaPipeName = "RightFootIndex"; temp.unityName = HumanBodyBones.RightToes; temp.parent.Add(transformator[12]); transformator[14] = temp; } //Landmarks_Mapping.Add("Nose",HumanBodyBones.Head); //0 10 //Landmarks_Mapping.Add("LeftShoulder",HumanBodyBones.LeftUpperArm); //11 //Landmarks_Mapping.Add("RightShoulder",HumanBodyBones.RightUpperArm); //12 //Landmarks_Mapping.Add("LeftElbow",HumanBodyBones.LeftLowerArm); //13 //Landmarks_Mapping.Add("RightElbow",HumanBodyBones.RightLowerArm); //14 //Landmarks_Mapping.Add("LeftWrist",HumanBodyBones.LeftHand); //15 //Landmarks_Mapping.Add("RightWrist",HumanBodyBones.RightHand); //16 //Landmarks_Mapping.Add("LeftHip",HumanBodyBones.LeftUpperLeg); //23 //Landmarks_Mapping.Add("RightHip",HumanBodyBones.RightUpperLeg); //24 //Landmarks_Mapping.Add("LeftKnee",HumanBodyBones.LeftLowerLeg); //25 //Landmarks_Mapping.Add("RightKnee",HumanBodyBones.RightLowerLeg); //26 //Landmarks_Mapping.Add("LeftAnkle",HumanBodyBones.LeftFoot); //27 //Landmarks_Mapping.Add("RightAnkle",HumanBodyBones.RightFoot); //28 //Landmarks_Mapping.Add("LeftFootIndex",HumanBodyBones.LeftToes); //31 //Landmarks_Mapping.Add("RightFootIndex",HumanBodyBones.RightToes); //32 foreach (var temp in transformator) { temp.prevQ = animator.GetBoneTransform(temp.unityName).rotation; //获得初始角度 temp.currentQ = temp.prevQ; _posLandmarks.Add(temp); } } }