如何找出定向边界框的旋转矩阵
How to find out the rotation matrix for the oriented bounding box
所以我在我的任务中使用了 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" 信息?
假设 normalizeAxes
属性 具有以下含义:
[X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3]
然后局部到世界旋转矩阵的列等于向量 XYZ
:
| X1 Y1 Z1 |
R = | X2 Y2 Z2 |
| X3 Y3 Z3 |
world-to-local 旋转矩阵当然只是这个的逆(=转置):
| 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 内几何分布的度量。
让我们以问题中给出的例子为例。给出了归一化轴,但没有按以下任何特定顺序排列。
"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轴分别位于第一和第四象限的特殊情况。
所以我在我的任务中使用了 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" 信息?
假设 normalizeAxes
属性 具有以下含义:
[X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3]
然后局部到世界旋转矩阵的列等于向量 XYZ
:
| X1 Y1 Z1 |
R = | X2 Y2 Z2 |
| X3 Y3 Z3 |
world-to-local 旋转矩阵当然只是这个的逆(=转置):
| 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 内几何分布的度量。
让我们以问题中给出的例子为例。给出了归一化轴,但没有按以下任何特定顺序排列。
"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轴分别位于第一和第四象限的特殊情况。