在Matlab中根据法线旋转3D物体

3

我有一个三维身体(三角网格)和一个面的表面法线。我想旋转这个物体,使得Z轴与法线平行。如何找到旋转矩阵?

2个回答

3

如果您将body作为一个hgtransform对象的父级对象,那么您可以使用makehgtform命令为该对象创建一个变换矩阵。最简单的方法是使用以下形式的makehgtform:

h = hgtransform;
m = makehgtform('axisrotate', [ax ay az], r);
set(h, 'Matrix', m);

axisrotate选项允许您绕任意轴旋转。在这种情况下,[ax ay az]是一个垂直于您要旋转的平面的向量。那就是通过您试图旋转的两个向量的平面。所以您使用Z轴和法线的叉积。这给您一个向量,它既是您两个向量的法线,也定义了通过它们的平面的方向。
现在您需要确定旋转角度。值r是您想绕该轴旋转的弧度。有几种方法可以得到它。如果您的两个向量已经归一化,则叉积的大小等于正弦值,点积的大小等于余弦值。这有意义吗?

我的错,我使用了度而不是弧度!现在它可以工作了。非常感谢你! - matnoob

1

您可以轻松地自行实现它。一般旋转的矩阵可以在维基百科上找到。您只需要知道角度的cos()和sin()函数。如果您的表面法向量n是单位长度的向量(即|n|=1),那么您已经知道相应的cos()。

    |  cos(angle between normal and x-axis)  |
n = |  cos(angle between normal and y-axis)  |
    |  cos(angle between normal and z-axis)  |

是的,它是一个单位长度,比如n=(nx,ny,nz)。所以,我只需使用维基百科上的R(z)公式,其中theta= -acos(nz)?谢谢。 - matnoob
这并不是那么简单。公式包括欧拉角,所以你仍然需要进行一些数学计算。可能这个链接会有帮助。 - ioreshnikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接