从球体上的3d点计算RPY(滚动俯仰偏航)

时间:2016-04-22 16:07:16

标签: c++ math matrix vector geometry

我需要一种方法来找到一组描述球体中位置和方向的同质变换矩阵。

我的想法是,我在这个球体的中心有一个半径为dz的物体。因为我知道对象的三维坐标,所以我知道球体的所有三维坐标。是否可以确定球体上任何点的RPY,使得该点总是指向中心的物体?

说明:

enter image description here

在这个球体的原点,我们有一个物体。球体的半径是dz。 红点是球体上的一个点,从该点到物体/原点的矢量。

位置应该相对容易提取,因为球体可以通过函数来​​描述,但是如何确定向量或旋转矩阵,使其指向原点。

2 个答案:

答案 0 :(得分:1)

您可以使用球体的中心作为原点,计算由原点形成的线的单位矢量到球体边缘上的点,然后将该单位矢量乘以-1以获得矢量从球体边缘的点指向球体的中心。

示例:

vec pointToCenter(Point edge, Point origin) {
    vec norm = edge - origin;

    vec unitVec = norm / vecLength(norm);

    return unitVec * -1;
}

获得矢量后,您可以将其转换为RPY的euler角度,例如here

答案 1 :(得分:0)

在我的头顶,我建议使用quaterneons来定义原点上任何点的旋转,相对于球体表面上想要的点:

  1. 在球体表面上选择所需的点,例如北极,例如
  2. 将该点转换为原点(假设球体的半径已知),使用3D Pythagorus:x_comp ^ 2 + y_comp ^ 2 + z_comp ^ 2 = hypotenuse ^ 2
  3. 创建一个将轴指向原始曲面点的旋转。这只是构成斜边的x,y和z分量的缩放倍数。我会把它变成单元组件。在四分之一(q,x,y,z)中捕获生成的轴和旋转,其中x,y,z是轴的分量,q是围绕该轴的旋转。硬编码q到一个。你想使用quaterneons,因为它会使你的结果旋转基质更容易使用
  4. 将点转换回球体表面并取消轴组件的值,得到(q,-x,-y,-z)。
  5. 这将为您提供球体表面上的点,轴指向原点。以北极为例,在球体表面上的点(0,radius_length,0)处将得到(1,0,-1,0)的四元数。请参阅我的github存储库中的quatrotation.c以获取生成的旋转矩阵。
  6. 我没有时间为此编写代码,但我在github存储库中编写了一个带有可编译代码示例的小教程,这应该可以帮助您入门:

    https://github.com/brownwa/opengl

    首先执行mat_rotation教程,然后执行quatereons。如果你专注,那么这个周末是可行的。