2012-09-08 64 views
3

我想设置一个平面的旋转。这需要三个数字表示以x,y和z轴为单位的弧度旋转。three.js:从平面正交向量到平面旋转矩阵

我没有这些数字,但是,我有一个向量'myVec',它应该与飞机旋转后正交。

这个向量让我更近一步,但并不完全:THREE.Vector3提供了一个函数“setEulerFromRotationMatrix”。也许我可以使用这个,如果我能想出如何从myVec生成旋转矩阵:旋转矩阵描述了一个向量如何转换为另一个向量。因此出现了这样的问题:哪个矢量应该是起始矢量?这一个(1,1,1),还是这个(1,0,0)?.

二,我该如何制作矩阵?我看了一下http://en.wikipedia.org/wiki/Rotation_matrix,但只发现了如何从旋转矩阵转换为其他东西。 它必须以某种方式反转矩阵乘法过程。

任何指针?

回答

4

在three.js r50中,默认平面位于原点,它是正z方向上的正常点。所以它是您想要转换为myVec的矢量(0, 0, 1)。但是你不必直接这样做。

在three.js中执行所需操作的最简单方法就是这样。

var v = myPlane.position.clone(); 
v.add(myVec); 
myPlane.lookAt(v); 

让three.js为你做数学。 :-)

编辑:更新为three.js r.66

+1

真棒!从来没有我的飞机更垂直于他们应该垂直的东西。 – loldrup

2

三维任何旋转都可以用三个角度表示。你的方法听起来像欧拉角,看看这里:http://en.wikipedia.org/wiki/Euler_angles

当你想建立一个旋转矩阵的旋转3个角度一次,你必须首先构造3个矩阵,其中每一个绕一个轴旋转以给定的角度。然后你必须乘以3矩阵(以正确的顺序)来得到你的最终旋转矩阵。

如果您知道如何旋转矢量(1 0 0)以匹配您的最终矢量,则只需要计算出各个轴的角度即可。注意旋转的顺序。你也可以从其他矢量开始。你只需要知道角度。

,其通过一个给定的角度围绕给定轴旋转的矩阵可以在这里找到:http://en.wikipedia.org/wiki/Rotation_matrix(参见“在三维”“基本旋转”)。

在“常规旋转”下,您会找到我刚刚描述的方法(将3个矩阵相乘以获得整个旋转的矩阵)。