【问题标题】:How to find out the rotation matrix for the oriented bounding box如何找出定向边界框的旋转矩阵
【发布时间】:2018-11-09 14:23:25
【问题描述】:

所以我在我的任务中使用了 Matterport 3D 数据集,它使用标准结构描述了定向边界框,其中一项更改如下:

"obb": {
        "centroid":[3.39208,-1.72134,1.13262],
        "axesLengths":[1.11588,0.619098,0.439177],
        "dominantNormal":[-0.707107,-0.707107,0],
        "normalizedAxes":[0,0,1,-0.707107,0.707107,0,-0.707107,-0.707107,0]
      }

我了解定向边界框通常由质心、局部坐标系轴和沿这些轴的长度定义。

在我的例子中,考虑到对象仅在世界坐标系中围绕垂直轴(z 轴)旋转,我想找出它围绕 z 轴旋转的角度。但为此,我需要将世界坐标系转换为局部坐标系的旋转矩阵。在标准表示的情况下,旋转矩阵只是 3x3 矩阵,轴作为列向量。但是,在这种情况下,如果您查看归一化轴数组,则会给出 9 个值,但没有约定哪个轴应该是旋转矩阵中的第一列向量或第二列向量。

假设对象位置是垂直的并且仅围绕 z 轴旋转,我可以确定旋转矩阵的最后一列。例如,上述示例中的 [0, 0, 1]。但是如何确定另外两个轴呢?有没有办法在确定时考虑“dominantNormal”信息?

【问题讨论】:

  • 旋转矩阵不是编码在normalizedAxes吗?它们似乎是三个相互正交的单位向量。
  • 是的,所以旋转矩阵本质上是将新坐标系的轴作为列向量。但是在这种情况下,正如我所提到的,考虑到对象仅围绕 z 轴旋转,旋转矩阵的最后一列将始终为 [0, 0, 1] 但我如何确定第一列/第二列? normalisedAxes 的前三个值是第一列还是第二列?
  • 编辑问题以反映您现在需要旋转矩阵中的三个欧拉角。更好的是,look online

标签: 3d bounding-box rotational-matrices bounding-volume


【解决方案1】:

假设normalizeAxes属性的含义如下:

[X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3]

那么局部到世界旋转矩阵的列等于向量XYZ

    | X1 Y1 Z1 |
R = | X2 Y2 Z2 |
    | X3 Y3 Z3 |

世界到局部的旋转矩阵当然只是这个的逆(=转置):

         | X1 X2 X3 |
inv(R) = | Y1 Y2 Y3 |
         | Z1 Z2 Z3 |

考虑到翻译centroid = [C1, C2, C3]

    | X1 Y1 Z1 C1 |
T = | X2 Y2 Z2 C2 |
    | X3 Y3 Z3 C3 |
    | 0  0  0  1  |

         | X1 X2 X3 -dot(C, X) |
inv(T) = | Y1 Y2 Y3 -dot(C, Y) |
         | Z1 Z2 Z3 -dot(C, Z) |
         | 0  0  0       1     |

不确定dominantNormal 代表什么(似乎没有任何公开可用的文档);可能是用于着色的元数据,或此 OBB 内几何分布的度量。

【讨论】:

  • 我知道旋转矩阵是在向量中编码的,但我们不知道归一化轴是 [X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3] 还是 [X1, X2、X3、Z1、Z2、Z3、Y1、Y2、Y3]。正如我在问题中提到的,考虑到对象仅围绕 Z 轴 [0, 0 ,1] 旋转,旋转矩阵中的 z 轴列向量将为 [0, 0, 1] 我可以从normalizedAxes 但如何确定 x 轴、y 轴列。
  • @bhushan 你必须从文档中找到,这似乎是专有的(无法直接从他们的网站上找到);我假设由于您正在使用此产品,因此您也可以访问它。幸运的是,基本的数学原理将保持不变。
  • 是的,这就是问题所在,文档没有提到它,所以我想知道它是否可以从可用数据中得出。无论如何,谢谢您的意见。
  • @bhushan 是的,应该可行;尝试交换向量 XYZ 或其组件,看看这有什么影响。例如从您的约束中可以清楚地看出,Z 轴实际上是 first 3 个数字。
【解决方案2】:

让我们以问题中给出的例子为例。给出了归一化轴,但未按任何特定顺序如下。

"normalizedAxes":[0,0,1,-0.707107,0.707107,0,-0.707107,-0.707107,0]

由于我们知道,对象仅围绕 z 轴旋转,因此旋转矩阵中的第三列将是 [0, 0, 1]。所以这给我们留下了两列;让我们称它们为axis_0、axis_1。

所以,

axis_0 = [-0.707107, 0.707107, 0] 
axis_1 = [-0.707107, -0.707107, 0]

您可以使用反正切函数计算此轴与全局坐标系中 x 轴的夹角。假设axis_0和axis_1形成的角度分别是angle_0和angle_1。

因为我们知道axis_0 和axis_1 是正交的,所以以下任何一个关系都必须为真。

angle_0 = angle_1 + 90 or angle_1 = angle_0 + 90

因此,通过上述示例,您可以注意到,

angle_0 = 135 degrees
angle_1 = 225 degrees (-135 degrees)

当我们认为逆时针旋转为正时,形成较小角度的轴将是旋转矩阵中的第一列,而另一个轴将是旋转矩阵中的第二列。

在这种情况下,旋转矩阵如下所示:

[ [ -0.707107, -0.707107,  0],
  [ 0.707107,  -0.707107,  0],
  [ 0,          0,         1],
]

如果您使用arctan2函数,请小心处理轴顺时针旋转且旋转后的y轴和x轴分别位于第一和第四象限的特殊情况。

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 2020-01-26
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 2010-09-13
    • 2019-06-01
    相关资源
    最近更新 更多