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

Posted

技术标签:

【中文标题】Three.js:获取相机正在看的方向【英文标题】:Three.js: Get the Direction in which the Camera is Looking 【发布时间】:2013-01-26 15:48:28 【问题描述】:

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

这样相机就可以像头部一样上下左右旋转。与第一人称视角一样。

使用此欧拉顺序,不使用 camera.rotation 中的 z 属性(始终为 0)。 x 用于以弧度表示间距或纬度,y 用于描述经度。

我有许多目标以球形方式围绕用户移动,相机始终位于该球体的中心。假设球体的半径为 1000。

我的目标是计算相机正在看的位置和目标位置之间的角度。

我写了这段代码来计算两个向量之间的角度:

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;

我有目标的向量(targets[0].position)。

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

我查看了 Vector3.applyProjection 和 applyEuler 方法,并尝试了但仍然没有得到任何好的结果。

我认为在进行任何预测之前,必须首先将欧拉顺序改回“XYZ”?我试过了,我不知道怎么做,文档很难理解。

假设如果相机直接向右看,那么我需要得到一个向量,该向量在当前旋转方向上距中心的 RADIUS 距离。

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

【问题讨论】:

【参考方案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.107

【讨论】:

我如何找出相机朝向的方向或北/南等?或更简单地说:相机旋转了多少度?我不明白 target.position 是什么 相机现在有 getWorldDirection() 来查找它在世界空间中的朝向【参考方案2】:

fluffybunny 做到了。 对他的绝妙想法稍作改动,就可以得到以度数为单位的旋转:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我花了很长时间试图弄清楚船长明显的问题。

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

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

theta 以弧度为单位。 这就是我如何让我的游戏角色以与摄像机相同的方式面对。 getWorldDirection() 是相机上一个相当新的选项。

【讨论】:

以上是关于Three.js:获取相机正在看的方向的主要内容,如果未能解决你的问题,请参考以下文章

Three.js - 广告牌效果,相机平移后保持方向

如何在 Three.js 中获取透视相机的角度值?

使用正交相机从鼠标位置获取 Three.js 世界坐标

three.js Mesh 不根据方向显示矩形

在 THREE.js 中获取鼠标相对于 3D 空间的坐标

Three.js如何让对象相对于另一个旋转?