假设我有一个 Three.js 网格和一个速度向量 3。
速度在其他地方发生改变,然后每帧添加到网格位置。
我想要的是 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 等的相关方程。
您可以根据归一化速度向量构造旋转矩阵。归一化后的矢量为 1 个轴。然后你以某种方式选择第二个轴。然后进行叉积来找到第三个轴。最后在第一个和第三个轴之间进行叉积以获得最终的第二个轴。
然后你从 3 个向量构造一个 3x3 矩阵(我现在不记得它们的顺序,但类似于 [x1,y1,z1,x2,y2,z2,x3,y3,z3])。
另一种方法是四元数类:
.setFromUnitVectors ( vFrom, vTo )
将此四元数设置为将方向向量 From 旋转到方向向量 vTo 所需的旋转。改编自http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors。假定 From 和 To 已标准化。
http://twojs.org/docs/#Reference/Math/Quaternion
由于 Three.js 内部喜欢使用四元数,因此这可能是一个很好的方法。如果您的箭头是向上的箭头,您可能需要 vFrom=[0,1,0], vTo=velocityVector.normalize();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)