我确定这个问题已多次重复,但我找不到任何有关我具体问题的答案!
我正在使用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个向量,我可以对它进行计算!
先谢谢你了!
答案 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) );