Three.js:获取相机正在观察的方向

时间:2013-02-11 14:19:39

标签: javascript html5 vector three.js

我确定这个问题已多次重复,但我找不到任何有关我具体问题的答案!

我正在使用html5和THREE.js创建游戏,并且我有一个以'YXZ'的欧拉顺序旋转的相机。

这是照相机像头一样向上,向下,向左和向右旋转。正如在第一人称视角中那样。

使用此euler顺序,不使用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]。位置。)

事情是我无法找到一种方法来获取相机所在的矢量。

我看过Vector3.applyProjection和applyEuler方法,并且玩了但仍然无法获得任何好结果。

我相信在进行任何预测之前,首先必须将欧拉订单改回'XYZ'吗?我试过了,我不知道该怎么做,文档很难理解。

如果相机正好向右看,那么我需要在当前旋转方向上获得距离中心一点距离的向量。

所以我最终会得到2个向量,我可以对它进行计算!

先谢谢你了!

4 个答案:

答案 0 :(得分:34)

相机正向下看它的内部负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

答案 1 :(得分:10)

我花了很长时间试图找出船长明显的问题。

这就是它最终对我有用的方式:

    vector = camera.getWorldDirection();
    theta = Math.atan2(vector.x,vector.z);

theta是弧度。 这就是我将游戏角色定向为面向相机的方式。 getWorldDirection()在相机上是一个相当新的选项。

答案 2 :(得分:0)

我无法发表评论,但是fluffybunny的回答完美无缺。 getWorldDirection()然后将该向量更改为弧度是可行的方法。

答案 3 :(得分:-2)

fluffybunny钉了它。 通过对他那令人敬畏的想法的微小改动,你可以获得度数的旋转:

var vector = camera.getWorldDirection();
angle = THREE.Math.radToDeg( Math.atan2(vector.x,vector.z) );