假设我有一个three.js网格和一个速度矢量。
速度在其他地方被改变,然后每帧添加到mesh.position。
我想要的是mesh.rotation对应于速度,即网格是一个总是指向它进入的方向的箭头。
以下是我尝试过的两种方法 - 让网状物旋转,但只是在错误的角度和向后以及一切。
//this doesn't work
mesh.rot.x = Math.atan2( vel.y, vel.z );
mesh.rot.y = -Math.atan2( vel.x, vel.z );
mesh.rot.z = Math.atan2( vel.x, vel.y );
//got this from a semi-related stackoverflow question; also doesn't work
mesh.rot.y = Math.asin( vel.z );
mesh.rot.z = Math.atan2( vel.y, vel.x );
var bankVec = new Vector3( -vel.y, vel.x, 0 );
var upVec = new Vector3( dot( bankVec, vel ) );
mesh.rot.x = Math.atan2(dot(bankVec, vel) / dot(upVec, vel),abs(bankVec)*abs(upVec));
我没有真正得到矢量数学。
我现在正处于这样一个阶段:我只是随意改变标志并交换争论,希望能做到最好。因此,我将非常感激任何关于如何做到这一点的解释。
不是在寻找代码,只是寻找点积,交叉积,atan2等的相关方程式。
答案 0 :(得分:0)
您可以从归一化的速度矢量构造旋转矩阵。归一化的向量是1轴。然后你以某种方式选择第二轴。然后你做一个十字产品来找到第三个轴。最后在第一个和第三个之间做一个交叉积,得到最后的第二个轴。
然后你从3个向量构造一个3x3矩阵(我现在不能记住它们的顺序,但是像[x1,y1,z1,x2,y2,z2,x3,y3,z3]这样的东西)
另一种方法是Quaternion类:
.setFromUnitVectors(vFrom,vTo)
将此四元数设置为旋转方向所需的旋转 矢量vFrom到方向矢量vTo。改编自 http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors。 假设vFrom和vTo被标准化。
http://threejs.org/docs/#Reference/Math/Quaternion
由于内部three.js喜欢使用四元数,这可能是一个很好的方法。如果你的箭头是向上箭头,你可能想要vFrom = [0,1,0],vTo = velocityVector.normalize();