我敢肯定,这个问题已经重复了很多次,但我找不到我的特定问题的任何答案!
我在使用HTML5和three.js所创造的游戏,我有一个摄像头,以“YXZ”的欧拉顺序旋转。
这是为了让摄像机旋转上,下,左,右像头。 正如在第一人称视角。
与此欧拉次序,在camera.rotation z属性不使用(始终为0)。 x被用于指定音调或纬度以弧度,并且y是用来描绘经度。
我有围绕使用者移动以球形的方式多个目标,与相机不断在该球体的中心。 比方说球有1000半径。
我的目标是计算在摄像机正在寻找,并且其中所述目标是之间的角度。
我写了这个代码,计算2个矢量之间的角度:
var A = new THREE.Vector3(1,0,0);
var B = new THREE.Vector3(0,1,0);
var theta = Math.acos( A.dot(B) / A.length() / B.length() );
// theta = PI/2;
我有目标(目标[0] .POSITION)的向量。
事情是我不能想出一个办法来得到在摄像机正在寻找的载体。
我已经看了Vector3.applyProjection和applyEuler方法,并围绕发挥,但仍然不能得到什么好结果。
我相信由任何预测之前欧拉顺序首先必须改回“XYZ”? 我已经试过了,我不知道如何做到这一点,该文档是相当难以理解。
说,如果相机直视正确的,那么我需要一个载体,其是RADIUS距离当前旋转方向的中心。
因此,我将结束2个载体,这是我能在做计算!
谢谢先进!
该相机是看不起它的内部负z轴。 因此,创建朝下负z轴的矢量:
var vector = new THREE.Vector3( 0, 0, -1 );
现在,应用相同的旋转被应用到相机的向量:
vector.applyQuaternion( camera.quaternion );
你可以在弧度的角度来像这样的目标:
angle = vector.angleTo( target.position );
编辑:现在,您可以在相机正在寻找像这样的方向:
var vector = new THREE.Vector3(); // create once and reuse it!
...
camera.getWorldDirection( vector );
注:通过传递vector
用于存储结果,该方法不会有实例化一个新的THREE.Vector3
每次方法被调用的时间。
已更新至three.js所r.79
我花了很长时间试图找出队长明显的问题。
这是怎么回事终于为我工作:
vector = camera.getWorldDirection();
theta = Math.atan2(vector.x,vector.z);
theta为弧度。 这是我如何使我的游戏人物面对镜头也面临同样的方式。 该getWorldDirection()是在相机一个相当新的选择。
我不能发表评论,但fluffybunny的回答完美的作品。 getWorldDirection()
然后改变这种载体弧度是要走的路。
fluffybunny钉它。 一个小的改变对他的真棒的想法,你可以在度的旋转:
var vector = camera.getWorldDirection();
angle = THREE.Math.radToDeg( Math.atan2(vector.x,vector.z) );