MotionCapture/Assets/MainBehaviour.cs

133 lines
3.9 KiB
C#
Raw Normal View History

2023-02-21 21:40:12 +08:00
using System;
using System.Collections.Generic;
using Models;
using UnityEngine;
public class MainBehaviour : MonoBehaviour
{
private readonly List<GameObject> _nodes = new List<GameObject>();
private readonly List<PoseTransform> _poseTransforms = new List<PoseTransform>();
private readonly UdpListener _listener = new UdpListener();
2023-02-22 20:35:20 +08:00
private const float _scale = 0.2f;
2023-02-21 21:40:12 +08:00
// 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;
var temp = new Vector4(_poseTransforms[index].MediaPipePos.x,
_poseTransforms[index].MediaPipePos.y,
_poseTransforms[index].MediaPipePos.z,1);
2023-02-22 20:35:20 +08:00
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
}
}
private void OnDisable()
{
_listener.DisConnect();
}
private void CreateNodes()
{
for (var i = 0; i < 33; i++)
{
var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere);
2023-02-22 20:35:20 +08:00
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 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;
}
}
//绕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;
}
2023-02-21 21:40:12 +08:00
}