MotionCapture/Assets/MainBehaviour.cs

308 lines
9.2 KiB
C#
Raw Normal View History

2023-02-21 21:40:12 +08:00
using System.Collections.Generic;
using Models;
using UnityEngine;
public class MainBehaviour : MonoBehaviour
{
private readonly List<GameObject> _nodes = new List<GameObject>();
private readonly List<Bond> _bonds = new List<Bond>();
private readonly List<VirtualSkeleton> _virtualSkeletons = new List<VirtualSkeleton>();
2023-02-21 21:40:12 +08:00
private readonly List<PoseTransform> _poseTransforms = new List<PoseTransform>();
private readonly UdpListener _listener = new UdpListener();
private const float Scale = 0.2f;
private GameObject sample ;
2023-02-21 21:40:12 +08:00
// Start is called before the first frame update
private void Start()
{
CreateNodes();
CreateBonds();
2023-02-21 21:40:12 +08:00
_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:乘法的顺序不能改!
2023-02-22 20:35:20 +08:00
_nodes[index].transform.position = new Vector3(-temp.x, -temp.y, -temp.z) * 5;
//_nodes[index].transform.position = _poseTransforms[index].MediaPipePos * 5;
2023-02-21 21:40:12 +08:00
}
foreach (var bond in _bonds)
{
bond.UpdateBond();
}
/*foreach (var vs in _virtualSkeletons)
{
vs.UpdateVS();
}*/
2023-02-21 21:40:12 +08:00
}
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<Renderer>().material.color = Color.red;//给头部添加颜色
}
2023-02-22 20:35:20 +08:00
else if (i <= 22)
{
ball.GetComponent<Renderer>().material.color = Color.blue;//给手部添加颜色
}
2023-02-22 20:35:20 +08:00
else if (i <= 32)
{
ball.GetComponent<Renderer>().material.color = Color.green;//给脚部添加颜色
}
2023-02-21 21:40:12 +08:00
_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));
}
2023-02-21 21:40:12 +08:00
private void OnReceive(List<PoseLandmark> landmarks)
{
foreach (var landmark in landmarks)
{
var poseTransform = new PoseTransform(landmark.Type)
{
MediaPipePos = new Vector3(landmark.X, landmark.Y, landmark.Z)
2023-02-21 21:40:12 +08:00
};
_poseTransforms[(int)landmark.Type] = poseTransform;
}
}
/// <summary>
/// 创建棍子列表
/// </summary>
/// <param name="nodes">需要连接起来的关键点 需要按顺序设置</param>
/// <returns></returns>
private List<Bond> GenerateBondsList(PoseLandmarkType[] nodes)
{
var bonds = new List<Bond>();
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;
}
2023-02-21 21:40:12 +08:00
}