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
小智 11
我花了很长时间试图找出船长明显的问题.
这就是它最终对我有用的方式:
vector = camera.getWorldDirection();
theta = Math.atan2(vector.x,vector.z);
Run Code Online (Sandbox Code Playgroud)
theta是弧度的.这就是我将游戏角色定向为面向相机的方式.getWorldDirection()在相机上是一个相当新的选项.