我一直在和phoria.js一起工作,真的很开心我有一个玩家头像模型,一直在使用第一人称相机js相机用两个三维空间坐标定位:第一个:相机在场景图中的实际位置,第二个:相机观察的点。我使用了两个角度:angleX
和angleY
定义为度(我知道弧度更好),便于思考,以及10个单位的恒定距离。
fp摄像机的代码如下
{within an object definition}
setLookAtByAngle: function(camera, angleX, angleY) {
lookAt = {x: camera.position.x, y: camera.position.y, z: camera.position.z};
extent = 10;
lookAt.x += Math.tan(angleX * (Math.PI / 180)) * extent;
lookAt.y += Math.tan(angleY * (Math.PI / 180)) * extent;
lookAt.z += extent;
camera.lookat = lookAt;
},
getAngleByLookAt: function(camera) {
xPlanarLookAt = {x: camera.lookat.x, y: camera.position.y, z: camera.lookat.z};
yPlanarLookAt = {x: camera.position.x, y: camera.lookat.y, z: camera.lookat.z};
hypotX = getDistanceBetweenTwoPoints(camera.position, xPlanarLookAt);
oppX = Math.abs(camera.lookat.x - camera.position.x);
angleX = Math.asin(oppX / hypotX) * (180/Math.PI);
hypotY = getDistanceBetweenTwoPoints(camera.position, yPlanarLookAt);
oppY = Math.abs(camera.lookat.y - camera.position.y);
angleY = Math.asin(oppY / hypotY) * (180/Math.PI);
return {x: angleX, y: angleY};
},
{continue object definition}
是的。到目前为止,我所拥有的第三人称相机使用的是我自己的
SpaceUtils
。它采用观察者的位置1和倒转的x[2],y[3]角度,并调用SpaceUtils.translateByAngle([1], [2], [3], 10)
和10作为距离常数,当我添加缩放功能时,将随fov一起修改。SpaceUtils
看起来SpaceUtils = {
degSin: function(theta) {
return Math.sin(theta * (Math.PI / 180));
},
degCos: function(theta) {
return Math.cos(theta * (Math.PI / 180));
},
degTan: function(theta) {
return Math.tan(theta * (Math.PI / 180));
},
translateByAngle: function(pos, angleX, angleY, distance) {
dest = {x: pos.x, y: pos.y, z: pos.z};
dest.z += distance * SpaceUtils.degSin(angleY);
hyp = distance * SpaceUtils.degCos(angleY);
dest.x += hyp * SpaceUtils.degCos(angleX);
dest.y += hyp * SpaceUtils.degSin(angleX);
return dest;
}
};
我的计算器有Pol()和Rec()函数,它们在2D中完成任务。
我想我只是需要一个正确的三维,所以我开始实施。这一切都在四
x > 0
象限中,但是当我在x == 0
> y > 0
(y是上下轴)过渡时按下相机,这样当我从x > 0
和y > 0
开始时,我就结束了x < 0
和y < 0
当y > 0
应该是这样的情况。简而言之,我需要一个3D Rec(r,theta)函数,理想情况下是以度数表示的,但如果不是专门编写的,弧度就可以了。
我知道这是一个相当大的要求,所以我会悬赏50或100代表,如果它来了。
最佳答案
佛利亚使用x作为向前向后,y作为向上向下,z作为横向,而传统的数学交换y和z的目的。你应该这样做。SpaceUtils
中的最后一个函数应该更符合下面的思路。
translateByAngle: function(pos, angleX, angleY, distance) {
dest = {x: pos.x, y: pos.y, z: pos.z};
dest.y += distance * SpaceUtils.degSin(angleY);
hyp = distance * SpaceUtils.degCos(angleY);
dest.x += hyp * SpaceUtils.degSin(angleX);
dest.z += hyp * SpaceUtils.degCos(angleX);
return dest;
}