JavaScript: 轨道相机的半工作公式

JavaScript: Half-working formula for orbit camera

我一直在与 phoria.js 合作,并且真的从中受益匪浅。我有一个玩家头像模型,并且一直在使用第一人称相机。 phoria.js 相机定位有两个 3D 坐标 space:第一个:相机在场景图中的实际位置,第二个:相机注视的点。我一直在使用两个角度:angleXangleY 以度数定义(我知道弧度更好)以便于思考以及 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 < 0y < 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;
}