using System.Collections.Generic;
using UnityEngine;
using Utils;
namespace Models
{
///
/// 捕捉骨骼的动作转换
///
public struct PoseTransform
{
///
/// MediaPipe中动捕节点标识
///
public readonly PoseLandmarkType MediaPipeName;
///
/// Unity中绑定骨骼名称
///
public readonly HumanBodyBones UnityName;
///
/// 取平均的长度
///
public static int AverageLength = 3;
///
/// 取平均之后的结果
///
public Vector3 ResultPosition => _transformHandler.GetResultPosition();
///
/// 节点的父节点列表
///
public readonly List Parent;
private readonly IPoseTransformHandler _transformHandler;
public PoseTransform(
int type,
IPoseTransformHandler handler
)
{
MediaPipeName = new PoseLandmarkType(type);
UnityName = GetRelatedBone(MediaPipeName);
Parent = new List();
_transformHandler = handler;
}
public static void UpdatePosition(ref PoseTransform pose, PoseLandmark landmark)
{
pose._transformHandler.ReceivePoseLandmark(landmark);
}
public static Vector3 operator +(PoseTransform a) => a.ResultPosition;
public static Vector3 operator -(PoseTransform a) => -a.ResultPosition;
public static Vector3 operator +(PoseTransform a, PoseTransform b) =>
a.ResultPosition + b.ResultPosition;
public static Vector3 operator -(PoseTransform a, PoseTransform b) =>
a.ResultPosition - b.ResultPosition;
public static Vector3 operator *(PoseTransform a, int b) =>
a.ResultPosition * b;
public static Vector3 operator *(int a, PoseTransform b) =>
a * b.ResultPosition;
public static Vector3 operator /(PoseTransform a, int b) =>
a.ResultPosition / b;
///
/// 获得同相关捕捉点关联的骨骼
///
/// 捕捉点的种类
/// 关联骨骼的种类
private static HumanBodyBones GetRelatedBone(PoseLandmarkType type)
{
switch (type.Value)
{
case PoseLandmarkType.LeftHip:
return HumanBodyBones.LeftUpperLeg;
case PoseLandmarkType.RightHip:
return HumanBodyBones.RightUpperLeg;
case PoseLandmarkType.LeftShoulder:
return HumanBodyBones.LeftUpperArm;
case PoseLandmarkType.RightShoulder:
return HumanBodyBones.RightUpperArm;
case PoseLandmarkType.Nose:
return HumanBodyBones.Head;
case PoseLandmarkType.LeftElbow:
return HumanBodyBones.LeftLowerArm;
case PoseLandmarkType.RightElbow:
return HumanBodyBones.RightLowerArm;
case PoseLandmarkType.LeftWrist:
return HumanBodyBones.LeftHand;
case PoseLandmarkType.RightWrist:
return HumanBodyBones.RightHand;
case PoseLandmarkType.LeftKnee:
return HumanBodyBones.LeftLowerLeg;
case PoseLandmarkType.RightKnee:
return HumanBodyBones.RightLowerLeg;
case PoseLandmarkType.LeftAnkle:
return HumanBodyBones.LeftFoot;
case PoseLandmarkType.RightAnkle:
return HumanBodyBones.RightFoot;
case PoseLandmarkType.LeftFootIndex:
return HumanBodyBones.LeftToes;
case PoseLandmarkType.RightFootIndex:
return HumanBodyBones.RightToes;
default:
return HumanBodyBones.LastBone;
}
}
}
}