JavaScript: 轨道相机的半工作公式
JavaScript: Half-working formula for orbit camera
我一直在与 phoria.js 合作,并且真的从中受益匪浅。我有一个玩家头像模型,并且一直在使用第一人称相机。 phoria.js 相机定位有两个 3D 坐标 space:第一个:相机在场景图中的实际位置,第二个:相机注视的点。我一直在使用两个角度: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() 函数,它们在二维中完成这项工作。
我想我只需要其中一个用于 3D,所以我开始实施。这一切都适用于四个 x > 0
象限,但是当我在 x == 0
过渡时将相机向下推,其中 y > 0
(y 是上下轴)所以当我从 [=18 开始时=] 和 y > 0
,我最终得到 x < 0
和 y < 0
,而 y > 0
应该是这种情况。
简而言之,我需要一个以度为单位的 3D Rec(r, theta) 函数,但如果不是特意写的,弧度也可以。
我知道这是一个相当大的要求,所以如果涉及到这个问题,我会悬赏 50 或 100 个代表。
Phoria 使用 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;
}
我一直在与 phoria.js 合作,并且真的从中受益匪浅。我有一个玩家头像模型,并且一直在使用第一人称相机。 phoria.js 相机定位有两个 3D 坐标 space:第一个:相机在场景图中的实际位置,第二个:相机注视的点。我一直在使用两个角度: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() 函数,它们在二维中完成这项工作。
我想我只需要其中一个用于 3D,所以我开始实施。这一切都适用于四个 x > 0
象限,但是当我在 x == 0
过渡时将相机向下推,其中 y > 0
(y 是上下轴)所以当我从 [=18 开始时=] 和 y > 0
,我最终得到 x < 0
和 y < 0
,而 y > 0
应该是这种情况。
简而言之,我需要一个以度为单位的 3D Rec(r, theta) 函数,但如果不是特意写的,弧度也可以。
我知道这是一个相当大的要求,所以如果涉及到这个问题,我会悬赏 50 或 100 个代表。
Phoria 使用 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;
}