计算定向边界框绕每个轴的旋转

问题描述 投票:0回答:1

我目前正在尝试使用 Open3D 计算定向边界框围绕每个轴的旋转角度。我最初的方法是使用 ICP(迭代最近点)来查找用于旋转提供的边界框的变换矩阵,使其与参考边界框对齐。然而,我相信这种方法对于我的目标来说可能有点矫枉过正。

我的主要问题是Open3D的边界框给出的默认变换矩阵总是导致结果不一致。我假设通过利用平面的法线,使用标准几何计算来实现所需的结果是可行的。

我还编写了一些 pytest 来验证新方法。我正在寻找任何替代方法或指导,以帮助我使这变得更加简单和一致。

Github:https://github.com/simondegheselle/stackoverflow_q_calculated_rotation_obb

python 3d geometry rotation open3d
1个回答
0
投票

要将“axis-system-1”与其他“axis-system-2”对齐,首先要移动system-1,使其原点与system-2相同。
我们将使用这里的一些矩阵,但请注意,要旋转对象,首先将其放入“axis-system-2”中。这就是为什么我要讲“移动系统-1”。

表示旋转的矩阵在 维基百科中。

第一步是进行旋转,使 X-1 轴与 X-2 轴重叠。
这可以通过使用垂直于 X-1 和 X-2 的旋转轴来完成。通过 X-1 和 X-2 的 叉积 计算该轴的向量。

假设系统 1 中的 X 轴(由向量 1, 0, 0 表示)在系统 2 中由单一(“归一化”长度=1)向量(a, b, c)表示。 system-2 坐标中 X-2 的向量为 (1, 0 , 0) 叉积 {X-1}x{X-2} 给出向量

P(0, c, -b)
。对其进行缩放,使其长度变为 1。
所需角度为(X-1·X-2 的点积)
cos(t) = (a, b, c)·(1, 0, 0) = a

你还需要
sin(t) = 1 - sqrt(a)

使用维基百科中给出的“来自轴和角度的旋转矩阵”,其中轴 u=P 和角度=t。

现在我们让 X-1 和 X-2 成为同一轴,您只需要绕 X-2 轴旋转,使 Y-1 和 Y-2 轴匹配(Z 轴也会自动匹配)。
此旋转的角度可以通过应用 X 旋转后 system-2 中的 Y-2(乘以上面计算的矩阵并将其归一化)与 Y2 (0 , 1, 0) 向量的点积来计算。

您可以看到我们计算并使用了两个矩阵。如果您希望将 system-1 中表示的任何点旋转为 system-2,那么只需将两个矩阵相乘(顺序很重要)并获得完整变换矩阵,您可以将其应用于任何点

© www.soinside.com 2019 - 2024. All rights reserved.