我一直在和phoria.js一起工作,真的很开心我有一个玩家头像模型,一直在使用第一人称相机js相机用两个三维空间坐标定位:第一个:相机在场景图中的实际位置,第二个:相机观察的点。我使用了两个角度: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()函数,它们在2D中完成任务。
我想我只是需要一个正确的三维,所以我开始实施。这一切都在四x > 0象限中,但是当我在x == 0 > y > 0(y是上下轴)过渡时按下相机,这样当我从x > 0y > 0开始时,我就结束了x < 0y < 0y > 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;
}

09-26 02:29