微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将法向量旋转到轴平面上

我在3D空间中有一组数据点,显然都落在特定的平面上.我使用PCA来计算平面参数. PCA的第3个分量给出了平面的法向量(最弱的分量).

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

我的想法是做以下事情:

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

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

Matlab代码如下:

b = atan(n(1) / n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(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轴完全相同,则会遇到问题.

原文地址:https://www.jb51.cc/java/129521.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐