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