如何找出定向边界框的旋转矩阵

时间:2018-11-09 14:23:25

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

因此,我将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]。但是如何确定其他两个轴?在确定这一点时,有没有办法考虑“主导正常”信息?

2 个答案:

答案 0 :(得分: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中几何分布的度量。

答案 1 :(得分:0)

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

"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轴分别位于第一象限和第四象限。