在matlab中根据法线旋转3d体

时间:2011-06-27 11:53:28

标签: matlab geometry computational-geometry

我有一个3d body(三角形网格)和一个面向其中一个面的法线。我想旋转身体,使Z轴平行于法线。如何找到旋转矩阵?

2 个答案:

答案 0 :(得分:3)

如果将主体作为hgtransform对象的父对象,则可以使用makehgtform命令为该对象创建变换矩阵。最简单的方法是使用这种形式的makehgtform:

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

使用“轴旋转”选项可以围绕任意轴旋转。在这种情况下,[ax ay az]是一个垂直于你想要旋转的平面的矢量。这是通过你试图在它们之间旋转的两个矢量的平面。因此,您使用Z轴和法线的叉积。这为你提供了一个向量,它与你的两个向量垂直,并且定义了穿过它们的平面的方向。

现在你需要弄清楚旋转角度。值r是您想要以弧度为单位围绕该轴旋转的角度。有几种方法可以做到这一点。如果你的两个向量被归一化,这是最简单的。然后,叉积的大小等于角度的sin,并且点积的大小等于角度的cos。这有意义吗?

答案 1 :(得分:1)

您可以自己轻松实现它。可以找到一般旋转矩阵at wikipedia。你只需要知道角度的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)  |