我正在制作3D游戏,我需要玩家网格始终面向相机背面。我已经想出如何获得2D速度矢量(沿x-z平面的方向),但现在我需要在速度矢量的方向上旋转网格......
基本上,每个网格都有.rotation
属性,该属性是3D矢量。我只对y轴上的旋转感兴趣,这是垂直于表面(x-z)平面的旋转。
旋转不使用度数,而是使用弧度,所以我认为它会是这样的:
mesh.rotation.y = (mesh.direction.x - mesh.direction.z)*Math.PI*2;
但这似乎没有削减它......
方向/速度是a,如所说的2D矢量,它由-1到1之间的实数组成。始终sqrt(x*x + y*y) == 1
,所以它形成一个“圆”,这是因为速度显然,需要在所有方向上保持平等。
速度矢量仅在我将鼠标拖到屏幕上时才会改变,旋转也是如此,它的计算如下:
var c = Math.sqrt(cameraPos.x*cameraPos.x + cameraPos.z*cameraPos.z); //This is the distance from the camera to the mesh, which is at (0, 0) for simplicity of this presentation.
var rat = 1/c;
mesh.direction.x = cameraPos.x*rat; //Direction vector = the speed vector
mesh.direction.z = cameraPos.z*rat;
答案 0 :(得分:1)
如果我理解正确,atan2
就可以解决问题:
mesh.rotation.y = Math.atan2(mesh.direction.z, mesh.direction.x)
结果是弧度。它基本上计算矢量和X轴之间的角度。您可能需要在此处或那里切换参数或使用减运算符。