给定 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 方向向量求角度差的主要内容,如果未能解决你的问题,请参考以下文章

旋转矩阵到带角度的向量

使用方向和轴旋转 3D 对象

从两个变换的 3D 向量推导出 3D 旋转矩阵

应用于 3D 点的 2D 旋转矩阵

使用角度向量的高效 3D 旋转

在 3D 空间中沿 Y 轴的一个角度在随机点处旋转单位向量