2013-02-11 38 views
3

在Unity3D中使用Zigfu,如何檢查武器是否擡起?檢查武器是否擡起Zigfu和Unity3D

+1

有不在Unity3D中使用Zigfu,但我認爲它在幕後使用了OpenNI/NITE,並且在NIT中定義了「手臂擡起」手勢Ë – 2013-02-11 10:42:25

回答

3

我不熟悉Zigfu,但是如果還沒有一個後端機制來測試這個事實(因爲George Profenza在評論中指出),那麼你可以輕鬆地推出自己的測試來測試這種情況。

每個Kinect API(官方或第三方)都有關於骨架關節的細分。 official API將骨骼分解爲以下關節,並且我相信NITE會將骨骼分解爲相同的關節。

Kinect Skeleton Joints

您可以測試與另一關節的位置的一個關節的位置,看看你的「武器提出了」條件得到滿足。

例如,你可以簡單地檢查,如果玩家的肘部他們的肩膀上面:

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

這顯然是僞代碼,這將需要更新的API Zigfu引用。

滾動自己的優勢(與使用可能已定義的內容相比)是可以決定「舉起手臂」的含義。

  • 只是雙手需要在肩膀上方嗎?
  • 雙手肘部需要在肩膀上方嗎?
  • 做手只需要在HipCenterSpine以上聯合?
  • 必須延長手臂,還是可以彎曲肘部?

所有其他那些(和更多)可以被定義爲「舉起手臂」。可以對接頭的配置進行測試以確定它們是否屬實。

如果您想確認玩家在識別狀態之前保持「舉起手臂」一段時間,您可以簡單地爲手勢檢查添加一個計時器。僞碼的例子是:

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 
    } 
} 

在這種情況下,「臂提出了」每次條件滿足一個標誌被設置和啓動定時器。如果玩家將手臂擡起5秒鐘,則條件得到滿足,您可以執行所需的操作。

1

它的sipmle,只是贊成ZigSkeleton文件。

在ZigSkeleton文件,創建一個varialbe存儲肩的ID

public int TrackedLeftArm = (int)ZigJointId.LeftArm; 

而在UpdateRotation功能,

Quaternion newRotation = transform.rotation * orientation * initialRotations[(int)joint]; 

現在檢查

if((int)joint==TrackedLeftArm) 
{ 


    if(newRotation.x> DesiredANgle) 
    Debug.Log("Hands raised"); 

}