将法向量旋转到轴平面上

前端之家收集整理的这篇文章主要介绍了将法向量旋转到轴平面上前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在3D空间中有一组数据点,显然都落在特定的平面上.我使用PCA来计算平面参数. PCA的第3个分量给出了平面的法向量(最弱的分量).

我接下来要做的是将所有点转换到所述平面上并在2D中查看它.

我的想法是做以下事情:

>找到飞机上的中心点(平均点)
>从所有数据点中提取它以将它们排列在原点周围
>旋转法线使其变为(0,-1)
>将此旋转应用于所有数据点
>使用正交投影(基本上,跳过z轴)

现在我坚持找到正确的旋转操作.我尝试使用acos或@R_403_284@并设置两个旋转矩阵.似乎两种方法(使用acos,使用@R_403_284@)给我错误的结果.也许你可以帮帮我吧!

Matlab代码如下:

b = @R_403_284@(n(1) / n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = @R_403_284@(n(1) / n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:

我希望n2的y分量为零.然而,对于向量(-0.6367,0.77697,0.0467)已经失败了.

解决方法

如果你有一架飞机,你有一个法线向量和一个原点.我根本不会做任何“轮换”.你的答案只是一些矢量操作.

>让我们将你的飞机的法线向量称为新的z轴.
>您可以通过将旧的x轴与新的z轴(平面的法线)相交来生成新的y轴.
>通过将新z与新y交叉来生成新的x轴.
>将所有新轴向量转换为单位向量(长度为1).
>对于您拥有的每个点,创建一个从新原点到点的矢量(点的矢量减法 – plane_origin).只需点击新的x和新y单位向量,你就得到一对(x,y)你可以绘制!

如果您已经有交叉和点积函数,那么这只是几行代码.我知道它有效,因为我写的大多数3D电子游戏都是这样的.

技巧:

>注意向量指向的方向.如果他们指出错误的方式,则否定结果向量或更改叉积的顺序.>如果飞机的法线与原始x轴完全相同,则会遇到问题.

猜你在找的Java相关文章