给定 3D 旋转矩阵和 3D 方向向量求角度差
Posted
技术标签:
【中文标题】给定 3D 旋转矩阵和 3D 方向向量求角度差【英文标题】:Given 3D rotation matrix and 3D direction vector finding angular difference 【发布时间】:2016-12-16 13:21:29 【问题描述】:在我当前的项目中,我需要从 3D 旋转矩阵中找到方向矢量的角距离。
假设这样做的遗留代码存在错误并且无法正常工作。即使它是错误的,我也想分享它,因为它可能有助于理解我的问题。
double angularDiff( bool isSideAngle, const Matrix& in3DRotationMatrix, const Vector& in3DDirection )
// Unit vector convertion
in3DDirection.Normalize();
// Simple matrix vector multiplication
Vector newDir = in3DRotationMatrix*in3DDirection;
// Code suppose to find side angle difference
// or forward angle difference according to boolean parameter
if ( isSideAngle )
result = atan2(newDir[1], newDir[0]);
else
result = atan2(newDir[2], newDir[0]);
return result;
上面的方法中缺少的东西是简单的还是我应该完全改变我的方法?给定一个方向向量,从旋转矩阵中找到 X 和 Y 方向的角距离的最佳方法是什么?
【问题讨论】:
有两个角度描述了旋转矩阵(坐标系)局部向量的方向。你要哪个角度?或者,旋转矩阵定义了三个正交方向向量,您可以通过计算the angle between two vectors 找到向量与每个方向的角度。 @ja72 我想要他们两个。就像上面的代码一样,create 函数会有一个参数 bool isSideAngle。根据这个布尔值,我将计算侧角或前角。in3DDirection
是世界坐标还是本地坐标?
【参考方案1】:
在局部坐标系中创建向量(就像我认为 in3DDirection
已经存在一样)并应用逆 spherical coordinate 变换。请参阅链接中的公式 (1) 到 (3)。
double x = in3DDirection[0], y = in3DDirection[1], z=in3DDirection[2];
double r = sqrt(x*x+y*y+z*z);
theta = atan2(y,x); // range is -pi..pi
phi = acos(z/r); // range is -pi/2..pi/2
【讨论】:
我很好奇旋转矩阵如何从未参与您发送的代码。 in3DDirection 在全局坐标系中,如果我将多个方向向量与旋转矩阵一起移动到局部坐标系。 旋转矩阵通常是局部到全局的转换。要将in3DDirection
转换为本地坐标,您需要使用in3DRotationMatrix
的转置。以上是关于给定 3D 旋转矩阵和 3D 方向向量求角度差的主要内容,如果未能解决你的问题,请参考以下文章