Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
3d 如何求定向包围盒的旋转矩阵_3d_Bounding Box_Rotational Matrices_Bounding Volume - Fatal编程技术网

3d 如何求定向包围盒的旋转矩阵

3d 如何求定向包围盒的旋转矩阵,3d,bounding-box,rotational-matrices,bounding-volume,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.7071

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

假设
normalizeAxes
属性具有以下含义:

[X1, X2, X3, Y1, Y2, Y3, Z1, Z2, Z3]
然后,局部到世界旋转矩阵的列等于向量
XYZ

    | X1 Y1 Z1 |
R = | X2 Y2 Z2 |
    | X3 Y3 Z3 |
“世界到局部”旋转矩阵当然只是此矩阵的逆(=转置):

将平移
质心=[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]。这就给我们留下了两列;让我们称之为轴0,轴1

所以

可以使用反切线函数计算该轴与全局坐标系中x轴的夹角。也就是说,轴0和轴1形成的角度分别是角度0和角度1

以下任一关系必须为真,因为我们知道轴0和轴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轴分别位于第一象限和第四象限的特殊情况。

旋转矩阵不是在
normalizedAxes
中编码的吗?它们看起来是三个相互正交的单位向量。是的,所以旋转矩阵基本上以新坐标系的轴作为列向量。但在这种情况下,正如我所提到的,考虑到对象仅绕z轴旋转,旋转矩阵的最后一列将始终是[0,0,1],但我如何确定第一列/第二列是什么?normalisedAxes前三个值是第一列还是第二列?编辑该问题以反映您现在希望从旋转矩阵中获得三个Euler角度。更好的是,我理解旋转矩阵是在向量中编码的,但我们不知道归一化的顶点是[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],我可以从规格化的坐标轴中获得,但如何确定x轴,y轴列是什么。@Bushan您必须从文档中找到,这似乎是专有的(无法直接从他们的网站上找到);我假设,由于您正在使用此产品,您也可以访问它。幸运的是,基本的数学原理将保持不变。是的,这就是问题所在,文档中没有提到它,所以我想知道它是否可以从可用的数据中推导出来。无论如何,谢谢你的意见。@bhushan是的,这应该是可行的;尝试交换矢量XYZ或其组件,看看这有什么效果。e、 g.从您的约束中可以清楚地看出,Z轴实际上是前3个数字。
angle_0 = 135 degrees
angle_1 = 225 degrees (-135 degrees)
[ [ -0.707107, -0.707107,  0],
  [ 0.707107,  -0.707107,  0],
  [ 0,          0,         1],
]