gpt4 book ai didi

unity-game-engine - 检查 ARM 是否举起 Zigfu 和 Unity3D

转载 作者:行者123 更新时间:2023-12-02 10:14:49 27 4
gpt4 key购买 nike

使用Zigfu在Unity3D中,如何检查 ARM 是否举起?

最佳答案

我不熟悉Zigfu ,但如果还没有后端机制来测试这一事实(如 George Profenza 在评论中指出的),那么您可以轻松地推出自己的测试来测试此条件。

每个 Kinect API(官方或第 3 方)都有骨骼关节的详细信息。 official API将骨骼分解为以下关节,我相信 NITE将骨骼分解为相同的关节。

Kinect Skeleton Joints

您可以测试一个关节的位置与另一个关节的位置,看看是否满足“举起 ARM ”条件。

例如,您可以简单地检查玩家的肘部是否高于肩膀:

private void OnSkeletonFrameReady()
{
if ((JointId[ElbowRight].Y > JointId[ShoulderRight].Y) &&
(JointId[ElbowLeft].Y > JointId[ShoulderLeft].Y)
{
// arms have been raised
}
}

这显然是伪代码,需要更新为 Zigfu API 引用。

自行推出(与使用可能已经定义的内容相比)的优点是您可以决定“举起 ARM ”的含义。

  • 仅仅双手需要高于肩膀吗?
  • 双手肘部需要高于肩膀吗?
  • 双手只需位于 HipCenterSpine 关节上方吗?
  • ARM 必须拉伸(stretch),肘部可以弯曲吗?

所有其他(以及更多)都可以定义为“举起 ARM ”。可以测试关节的配置以确定它们是否正确。

如果您想确保玩家在识别状态之前保持“举起 ARM ”一段时间,您可以简单地在手势检查中添加一个计时器。伪代码示例为:

DispatherTimer _gestureTimer = new DispatcherTimer();
_gestureTimer.Interval = TimeSpan.FromSeconds(5);
_gestureTimer.Tick += OnGestureTimerTick();

bool _armsRaisedFlag = false;

private void OnSkeletonFrameReady()
{
if ((JointId[ElbowRight].Y > JointId[ShoulderRight].Y) &&
(JointId[ElbowLeft].Y > JointId[ShoulderLeft].Y)
{
_argsRaisedFlag = true;
_gestureTimer.Start();
}
else
{
_armsRaisedFlag = false;
_gestureTimer.Stop();
}
}

private void OnGestureTimerTick()
{
_gestureTimer.Stop();
if (_armsRaisedFlag == true)
{
// player's arms have been raised long enough for gesture to pass
}
}

在这种情况下,每次满足“举起 ARM ”条件时都会设置一个标志并启动一个计时器。如果玩家保持 ARM 举起5秒,则满足条件,你可以做你想做的 Action 。

关于unity-game-engine - 检查 ARM 是否举起 Zigfu 和 Unity3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14805812/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com