math - 将 3D 点转换为 2D

标签 math matrix 3d

我有一组点 (x1, x2,..xn) 位于由 Ax+ By+Cz+d=0 定义的平面上。
我想找到转换矩阵来平移和旋转到 XY 平面。因此,新点坐标将为 x1'=(xnew, ynew,0)。

很多答案都给出了四元数、点或叉积矩阵。我不确定哪一种是正确的方法。

谢谢

最佳答案

首先,除非在你的平面方程中,d=0,否则没有linear transformation你可以申请。您需要改为执行 affine transformation .

一种方法是确定旋转的角度和向量,以使您的点集位于平行于 XY 平面的平面中(即,变换后的点集的 Z 分量都具有相同的值)。然后您只需删除 Z 组件。

为此,让 V 成为包含您的点的平面的归一化平面法线。为方便起见,从上面 Ax+By+Cz+d=0 的平面方程中定义:

V = (A, B, C)
V' = V/||V|| = (A', B', C')
Z = (0, 0, 1)

在哪里

A' = A/||V||
B' = B/||V||
C' = C/||V||
||V|| = (A2+B2+C2)1/2

角度将是:

θ = cos-1(Z∙V/||V||)
= cos-1(Z∙V')
= cos-1(C')

绕其旋转的轴 R 只是归一化平面法线 V' 和 Z 的叉积。即

R = V'×Z
= (B', -A', 0)

您现在可以使用这个角度/轴对来构建 quaternion rotation需要将数据集中的所有点旋转到平行于 XY 平面的平面。然后,我之前说过,只需放下 Z 分量即可在 XY 平面上进行正交投影。

更新: antonakos 在使用 API 获取轴/角度对之前就规范化 R 提出了一个很好的观点。

关于math - 将 3D 点转换为 2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6264664/

相关文章:

java - JMonkeyEngine 旋转和四元数有什么区别?

c++ - 在 C++ 中计算非常大的数字

c - 在C中使用多线程做矩阵乘法

c++ - 如何渲染一个顶点尽可能少的圆?

r - 计算矩阵中非零列的数量

MATLAB: "Normalize"矩阵元素为 1 或 0

c# - 如何在 WPF 3D 中使用顶点处的值对网格着色?

ios - 如何从 scenekit 中的方向应用 SCNVector3 力/脉冲?

math - 是否有函数 f(n) 返回 n :th combination in an ordered list of combinations without repetition?

python - 确定多组整数的交集是否非空的最快方法是什么?