three.js所:获取方向与摄像机观察(Three.js: Get the Direction i

2019-07-19 17:15发布

我敢肯定,这个问题已经重复了很多次,但我找不到我的特定问题的任何答案!

我在使用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个载体,这是我能在做计算!

谢谢先进!

Answer 1:

该相机是看不起它的内部负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



Answer 2:

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

这是怎么回事终于为我工作:

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

theta为弧度。 这是我如何使我的游戏人物面对镜头也面临同样的方式。 该getWorldDirection()是在相机一个相当新的选择。



Answer 3:

我不能发表评论,但fluffybunny的回答完美的作品。 getWorldDirection()然后改变这种载体弧度是要走的路。



Answer 4:

fluffybunny钉它。 一个小的改变对他的真棒的想法,你可以在度的旋转:

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


文章来源: Three.js: Get the Direction in which the Camera is Looking