public LeanPoseDetector(float minLeanAngle, float leanRangeAngle) { m_minLeanAngle = minLeanAngle; m_leanRangeAngle = leanRangeAngle; m_leanDir = LeanPoseDetector.LeanDir.Center; }
public override void UpdateFrame() { m_leanDir = LeanPoseDetector.LeanDir.Center; if(CheckPoints() == false) return; bool foundPos = TestLeanPose(); if(foundPos == false) return; }
protected bool TestLeanPose() { Vector3 midShoulder = (m_rightShoulder - m_leftShoulder)/2 + m_leftShoulder; Vector3 midHip = (m_rightHip - m_leftHip)/2 + m_leftHip; Vector3 trunk = midShoulder - midHip; float leanAngle = Vector3.Angle(Vector3.up, trunk.normalized); if(Mathf.Abs(leanAngle) < m_minLeanAngle) return false; // learn direction angle, Vector3.right is the base. float leanHorizontalAngle = Vector3.Angle(trunk.normalized - Vector3.up, Vector3.right); float leanVerticalAngle = Vector3.Angle(trunk.normalized - Vector3.up, Vector3.forward); if(Mathf.Abs(leanHorizontalAngle) < m_leanRangeAngle / 2) { m_leanDir = LeanPoseDetector.LeanDir.Right; // mirror; } if(Mathf.Abs(leanHorizontalAngle - 180.0f) < m_leanRangeAngle / 2) { m_leanDir = LeanPoseDetector.LeanDir.Left; // mirror; } if(Mathf.Abs(leanVerticalAngle) < m_leanRangeAngle / 2) { m_leanDir = LeanPoseDetector.LeanDir.Forward; // mirror; } if(Mathf.Abs(leanVerticalAngle - 180.0f) < m_leanRangeAngle / 2) { m_leanDir = LeanPoseDetector.LeanDir.Backward; // mirror; } //Debug.Log("HAngle="+leanHorizontalAngle+" VAngle="+leanVerticalAngle+" dir="+m_leanDir); return true; }