javascript Three.js:获取摄像机正在观看的方向

woobm2wo  于 2022-12-21  发布在  Java
关注(0)|答案(4)|浏览(444)

我正在用html5和THREE.js创建游戏,我有一个相机,它以“YXZ”的欧拉顺序旋转。
这就是相机像头一样上下左右旋转。就像第一人称视角一样。
使用此欧拉顺序时,不使用camera.rotation中的z属性(始终为0)。x用于以弧度为单位指定螺距或纬度,y用于描述经度。
我有一些目标以球形的方式围绕着用户移动,摄像机一直在这个球体的中心。假设这个球体的半径为1000。
我的目标是计算摄像机正在看的地方和目标所在的地方之间的Angular 。
我写了这段代码来计算两个向量之间的夹角:

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'之前,任何预测作出?我已经尝试过,我不知道如何做到这一点,文件是相当难以理解。
假设摄像机正对着右边,那么我需要得到一个向量,它是在当前旋转方向上,到中心的半径距离。
最后得到两个向量,可以用来计算!

jei2mxaa

jei2mxaa1#

摄像机向下看它内部的负z轴,所以创建一个指向负z轴的向量:

var vector = new THREE.Vector3( 0, 0, - 1 );

现在,对应用于摄影机的向量应用相同的旋转:

vector.applyQuaternion( camera.quaternion );

可以按如下方式获得与目标的Angular (以弧度表示):

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

wgxvkvu9

wgxvkvu92#

我花了很长时间想弄明白“显而易见”船长的问题。
这就是它最终对我起作用的方式:

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

theta的单位是弧度。这是我如何调整游戏角色的方向,使其与摄像机面对的方向相同。getWorldDirection()是摄像机上的一个相当新的选项。

z4iuyo4d

z4iuyo4d3#

fluffybunny做到了。对他的绝妙想法做一个小小的改动,你就可以得到旋转的度数:

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

xdyibdwo4#

试试这个:

const { camera: { fov, position, quaternion } } = three;
const up = new Vector3(0, 1, 0).applyQuaternion(quaternion);
const lookAt = new Vector3(0, 0, -1).applyQuaternion(quaternion).add(position);

How to calculate the direction and up vector of a camera?

相关问题