2014-12-26 4 views
1

오른쪽 어깨에 대한 각도를 계산합니다. & 오른쪽 팔꿈치와 왼쪽 팔꿈치에 대한 각도는 왼쪽 팔꿈치 &입니다. 이 값을 WPF 응용 프로그램의 텍스트 상자에 인쇄합니다. 이제 문제가 있습니다 : 모든 각도에서 약 90 °가납니다. Windows 용 Kinect를 사용하고 C#으로 프로그래밍하고 있습니다. 자세한 내용은 의견을 남기고 답변 드리겠습니다.계산 각 -이 프로그램에서 동일한 값을 얻으려고

public class Angles 
    { 
     public double AngleBetweenTwoVectors(Vector3D vectorA, Vector3D vectorB) 
     { 
      double dotProduct = 0.0; 
      dotProduct = Vector3D.DotProduct(vectorA, vectorB); 

      return (double)Math.Acos(dotProduct)/Math.PI*180; 
     } 

     public double[] GetVector(Skeleton skeleton) 
     { 
      Vector3D ShoulderCenter = new Vector3D(skeleton.Joints[JointType.ShoulderCenter].Position.X, skeleton.Joints[JointType.ShoulderCenter].Position.Y, skeleton.Joints[JointType.ShoulderCenter].Position.Z); 
      Vector3D RightShoulder = new Vector3D(skeleton.Joints[JointType.ShoulderRight].Position.X, skeleton.Joints[JointType.ShoulderRight].Position.Y, skeleton.Joints[JointType.ShoulderRight].Position.Z); 
      Vector3D LeftShoulder = new Vector3D(skeleton.Joints[JointType.ShoulderLeft].Position.X, skeleton.Joints[JointType.ShoulderLeft].Position.Y, skeleton.Joints[JointType.ShoulderLeft].Position.Z); 
      Vector3D RightElbow = new Vector3D(skeleton.Joints[JointType.ElbowRight].Position.X, skeleton.Joints[JointType.ElbowRight].Position.Y, skeleton.Joints[JointType.ElbowRight].Position.Z); 
      Vector3D LeftElbow = new Vector3D(skeleton.Joints[JointType.ElbowLeft].Position.X, skeleton.Joints[JointType.ElbowLeft].Position.Y, skeleton.Joints[JointType.ElbowLeft].Position.Z); 
      Vector3D RightWrist = new Vector3D(skeleton.Joints[JointType.WristRight].Position.X, skeleton.Joints[JointType.WristRight].Position.Y, skeleton.Joints[JointType.WristRight].Position.Z); 
      Vector3D LeftWrist = new Vector3D(skeleton.Joints[JointType.WristLeft].Position.X, skeleton.Joints[JointType.WristLeft].Position.Y, skeleton.Joints[JointType.WristLeft].Position.Z); 

      /* ShoulderCenter.Normalize(); 
      RightShoulder.Normalize(); 
      LeftShoulder.Normalize(); 
      RightElbow.Normalize(); 
      LeftElbow.Normalize(); 
      RightWrist.Normalize(); 
      LeftWrist.Normalize(); 

      if (skeleton.Joints[JointType.ShoulderCenter].TrackingState == JointTrackingState.Tracked) { 

      } 
      */ 

      double AngleRightElbow = AngleBetweenTwoVectors(RightElbow - RightShoulder, RightElbow - RightWrist); 
      double AngleRightShoulder = AngleBetweenTwoVectors(RightShoulder - ShoulderCenter, RightShoulder - RightElbow); 
      double AngleLeftElbow = AngleBetweenTwoVectors(LeftElbow - LeftShoulder, LeftElbow - LeftWrist); 
      double AngleLeftShoulder = AngleBetweenTwoVectors(LeftShoulder - ShoulderCenter, LeftShoulder - LeftElbow); 

      double[] Angles = {AngleRightElbow, AngleRightShoulder, AngleLeftElbow, AngleLeftShoulder}; 
      return Angles; 
     } 
} 

여기서 알 수 있듯이, "도트 - 제품"과 acos로 각도를 계산하고 있습니다. (/ PI * 180)은 숫자를 각도 (0-360)로 바꾸는 것입니다. 나는 무엇이 잘못되었는지 궁금합니다.

+0

깜빡 : 벡터를 정상화하려고 시도했지만 도움이되지 않았습니다. – jbuchel

+0

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야한다"는 것을 참조하십시오. –

+0

감사합니다. 나는 다음에 그것을 고려할 것이다. @ 존 선덜랜드 – jbuchel

답변

1

대답을 찾았습니다 : AngleBetweenTwoVectors 메서드에서 벡터를 정규화해야합니다. 그렇다면 나는 진짜 각도를 얻는다.