120 lines
4.1 KiB
C#
120 lines
4.1 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Utils;
|
|
|
|
namespace Models
|
|
{
|
|
/// <summary>
|
|
/// 捕捉骨骼的动作转换
|
|
/// </summary>
|
|
public struct PoseTransform
|
|
{
|
|
/// <summary>
|
|
/// MediaPipe中动捕节点标识
|
|
/// </summary>
|
|
public readonly PoseLandmarkType MediaPipeName;
|
|
|
|
/// <summary>
|
|
/// Unity中绑定骨骼名称
|
|
/// </summary>
|
|
public readonly HumanBodyBones UnityName;
|
|
|
|
/// <summary>
|
|
/// 取平均的长度
|
|
/// </summary>
|
|
public static int AverageLength = 3;
|
|
|
|
/// <summary>
|
|
/// 取平均之后的结果
|
|
/// </summary>
|
|
public Vector3 ResultPosition => _transformHandler.GetResultPosition();
|
|
/// <summary>
|
|
/// 节点的父节点列表
|
|
/// </summary>
|
|
public readonly List<PoseLandmarkType> Parent;
|
|
|
|
private readonly IPoseTransformHandler _transformHandler;
|
|
|
|
public PoseTransform(
|
|
int type,
|
|
IPoseTransformHandler handler
|
|
)
|
|
{
|
|
MediaPipeName = new PoseLandmarkType(type);
|
|
UnityName = GetRelatedBone(MediaPipeName);
|
|
Parent = new List<PoseLandmarkType>();
|
|
|
|
_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;
|
|
|
|
/// <summary>
|
|
/// 获得同相关捕捉点关联的骨骼
|
|
/// </summary>
|
|
/// <param name="type">捕捉点的种类</param>
|
|
/// <returns>关联骨骼的种类</returns>
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
} |