我正在用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'之前,任何预测作出?我已经尝试过,我不知道如何做到这一点,文件是相当难以理解。
假设摄像机正对着右边,那么我需要得到一个向量,它是在当前旋转方向上,到中心的半径距离。
最后得到两个向量,可以用来计算!
4条答案
按热度按时间jei2mxaa1#
摄像机向下看它内部的负z轴,所以创建一个指向负z轴的向量:
现在,对应用于摄影机的向量应用相同的旋转:
可以按如下方式获得与目标的Angular (以弧度表示):
编辑:现在你可以得到相机看起来像这样的方向:
注意:通过传入存储结果的
vector
,该方法不必在每次调用时示例化一个新的THREE.Vector3
。更新为three.js r.107
wgxvkvu92#
我花了很长时间想弄明白“显而易见”船长的问题。
这就是它最终对我起作用的方式:
theta的单位是弧度。这是我如何调整游戏角色的方向,使其与摄像机面对的方向相同。getWorldDirection()是摄像机上的一个相当新的选项。
z4iuyo4d3#
fluffybunny做到了。对他的绝妙想法做一个小小的改动,你就可以得到旋转的度数:
xdyibdwo4#
试试这个:
How to calculate the direction and up vector of a camera?