gpt4 book ai didi

OpenGL 3D 相机 gluLookAt

转载 作者:行者123 更新时间:2023-12-04 05:03:14 33 4
gpt4 key购买 nike

我正在尝试使用 gluLookAt 方法设置 3D 相机。所以我有一个 10x10x10 的立方体,现在我想在那个立方体内移动相机。我有这样的事情:

gluLookAt( camera->x,camera->y,camera->z, camera->eyeX, camera->eyeY, camera->eyeZ, 0, 1, 0 );

现在我向前/向后移动:
if(GetKeyState(VK_UP) <0)
{
camera->x += sin(camera->angleX)*0.1f;
camera->eyeX += sin(camera->angleX)*0.1f;
camera->z -= cos(camera->angleX)*0.1f;
camera->eyeZ -= cos(camera->angleX)*0.1f;
}

现在我向左/向右旋转:
if(GetKeyState(VK_LEFT) <0)
{
camera->angleX -=0.1f;
camera->eyeX = sin(camera->angleX) +camera->x;
camera->eyeZ = -cos(camera->angleX) + camera->z;
}

这样一切都完美无缺,但现在我想在按下 SHIFT 按钮时向上/向下旋转。所以我有这样的事情:
if(GetKeyState(VK_SHIFT) <0)
{
if(GetKeyState(VK_UP)<0)
{
camera->angleY +=0.1f;
camera->eyeY = sin(camera->angleY) +camera->y;
}

事实上,奇怪的事情发生了。相机一直在上下弹跳,慢慢向前移动。另外我想补充一点,当我抬头并向前移动时,相机实际上会到达它看起来的地方。所以基本上情况是这样的:我是一个被困在 10x10x10 立方体中的幽灵,可以走到任何我想去的地方。我想移动到右上角?我只是去那里。所以......有什么想法我应该改变/添加什么?

最佳答案

编辑:我从头开始回复,因为我可能对这个主题过于熟悉。

您面临的问题是您的公式基本上不正确:假设“向上”向量(从相机指向上方的向量)始终为 [0 1 0].. . 如果您还想向上/向下旋转,则情况并非如此。并且您向下旋转的公式不正确,因为它只修改 Y 分量,而旋转不以这种方式工作。

正确的处理方法是:

  • 存储表示相机位置的 3 个变量(如您所做的那样)。让我们调用他们 Px , Py , Pz
  • 存储表示相机 View 方向的 3 个变量(而不是编码相机正在查看的点的 eyeX/Y/Z)。让我们调用他们 Vx , Vy , Vz
  • 存储代表相机右向量(或上向量,如您所愿)的 3 个变量。让我们取正确的向量,并将其命名为 Rx , Ry , Rz .

  • 或者,您可以使用一个很好的“Vector”类来表示向量,而不是每次存储 3 个变量。这是目前的一个细节。

    现在,您向前移动相机的方法变为:
    Px += Vx;
    Py += Vy;
    Pz += Vz;

    例如,您可以使用 Rodrigues旋转公式(希望没有人会向你发射“四元数”魔法词来表达他们的聪明;))。围绕任意轴旋转的通用自包含代码将是:
    // rotate the vector (vx, vy, vz) around (ax, ay, az) by an angle "angle"

    void rotate(double &vx, double &vy, double &vz, double ax, double ay, double az, double angle) {
    double ca = cos(angle);
    double sa = sin(angle);
    double crossx = -vy*az + vz*ay;
    double crossy = -vz*ax + vx*az;
    double crossz = -vx*ay + vy*ax;
    double dot = ax*vx + ay*vy + az*vz;
    double rx = vx*ca + crossx*sa + dot*ax*(1-ca);
    double ry = vy*ca + crossy*sa + dot*ay*(1-ca);
    double rz = vz*ca + crossz*sa + dot*az*(1-ca);
    vx = rx;
    vy = ry;
    vz = rz;
    }

    并确保为您的相机矢量保留标准化坐标。

    现在,当您按下按钮时,要专门向上/向下旋转您的相机:
    // rotate up:
    rotate(Vx, Vy, Vz, Rx, Ry, Rz, some_CONSTANT_angle);
    // rotate down:
    rotate(Vx, Vy, Vz, Rx, Ry, Rz, - some_CONSTANT_angle);

    要向左/向右旋转,您首先需要计算不需要存储的“向上”向量(除非您想要,但它是多余的),并旋转您的 View 方向和右向量:
    // find up vector using a cross product:
    double Ux = Ry*Vz - Rz*Vy;
    double Uy = Rz*Vx - Rx*Vz;
    double Uz = Rx*Vy - Ry*Vx;

    //rotate left
    rotate(Rx, Ry, Rz, Ux, Uy, Uz, some_CONSTANT_angle);
    rotate(Vx, Vy, Vz, Ux, Uy, Uz, some_CONSTANT_angle);
    // rotate right
    rotate(Rx, Ry, Rz, Ux, Uy, Uz, - some_CONSTANT_angle);
    rotate(Vx, Vy, Vz, Ux, Uy, Uz, - some_CONSTANT_angle);

    设置你的相机矩阵现在变成:
      gluLookAt( Px, Py, Pz, Px+Vx, Py+Vy, Pz+Vz, Rx, Ry, Rz); // or is it Ux, Uy, Uz at the end? don't remember.

    当然,我没有测试任何这些代码,现在就写了。希望它有效!

    关于OpenGL 3D 相机 gluLookAt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15857283/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com