1
我是用于地铁应用程序的winrt的实验kinect。 我正试图在肘部取得角度。使用3个给定的3d点计算角度
通常我会做以下
Vector3D handLeftVector = new Vector3D(HandLeftX, HandLeftY, HandLeftZ);
handLeftVector.Normalize();
Vector3D ElbowLeftEVector = new Vector3D(ElbowLeftX, ElbowLeftY, ElbowLeftZ);
ElbowLeftEVector.Normalize();
Vector3D ShoulderLeftVector = new Vector3D(ShoulderLeftX, ShoulderLeftY, ShoulderLeftZ);
ShoulderLeftVector.Normalize();
Vector3D leftElbowV1 = ShoulderLeftVector - ElbowLeftEVector;
Vector3D leftElbowV2 = handLeftVector - ElbowLeftEVector;
double leftElbowAngle = Vector3D.AngleBetween(leftElbowV1, leftElbowV2);
然而Vector3D对象是不是在WinRT中使用。
我决定复制Vector3D方法如下。但结果似乎并不如预期。我在任何地方犯了错误吗?
double leftElbowV1X = ShoulderLeftX - ElbowLeftX;
double leftElbowV1Y = ShoulderLeftY - ElbowLeftY;
double leftElbowV1Z = ShoulderLeftZ - ElbowLeftZ;
double leftElbowV2X = handLeftX - ElbowLeftX;
double leftElbowV2Y = handLeftY - ElbowLeftY;
double leftElbowV2Z = handLeftZ - ElbowLeftZ;
double product = leftElbowV1X * leftElbowV2X + leftElbowV1Y * leftElbowV2Y + leftElbowV1Z * leftElbowV2Z;
double magnitudeA = Math.Sqrt(Math.Pow(leftElbowV1X, 2) + Math.Pow(leftElbowV1Y, 2) + Math.Pow(leftElbowV1Z, 2));
double magnitudeB = Math.Sqrt(Math.Pow(leftElbowV2X, 2) + Math.Pow(leftElbowV2Y, 2) + Math.Pow(leftElbowV2Z, 2));
magnitudeA = Math.Abs(magnitudeA);
magnitudeB = Math.Abs(magnitudeB);
double cosDelta = product/(magnitudeA * magnitudeB);
double angle = Math.Acos(cosDelta) *180.0/Math.P;
是否需要规范化它?
我已经设法解决它,但我想如果有一个更有效的方法。
如果您使用ILSpy(http://wiki.sharpdevelop.net/ILSpy.ashx)来反编译'Vector3D'代码,您应该能够获得正确的代码。 – 2012-07-19 15:11:44
感谢ILSpy,它帮助我确认我的dotproduct是正确的,但是我仍然不确定我的代码的哪一部分是错误的。 – LZH 2012-07-19 16:26:35
请注意,我忘记将rad转换为deg – LZH 2012-07-20 03:02:33