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

Ale*_*nch 19 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;
Run Code Online (Sandbox Code Playgroud)

我有目标的矢量(目标[0] .position).

问题是我无法找到一种方法来获取相机所在的矢量.

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

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

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

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

先谢谢你!

Wes*_*ley 36

相机向下看它的内部负z轴.因此,创建一个指向负z轴的向量:

var vector = new THREE.Vector3( 0, 0, - 1 );
Run Code Online (Sandbox Code Playgroud)

现在,将相同的旋转应用于应用于相机的矢量:

vector.applyQuaternion( camera.quaternion );
Run Code Online (Sandbox Code Playgroud)

你可以得到弧度到目标的角度,如下所示:

angle = vector.angleTo( target.position );
Run Code Online (Sandbox Code Playgroud)

编辑:您现在可以获得相机的方向:

var vector = new THREE.Vector3(); // create once and reuse it!
...
camera.getWorldDirection( vector );
Run Code Online (Sandbox Code Playgroud)

注意:通过传入vector存储结果的内容,该方法不必在THREE.Vector3每次调用方法时都实例化一个新的.

更新为three.js r.79

  • 相机现在有getWorldDirection()来查找它在世界空间中面临的方式 (4认同)

小智 11

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

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

    vector = camera.getWorldDirection();
    theta = Math.atan2(vector.x,vector.z);
Run Code Online (Sandbox Code Playgroud)

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