OpenGL - 用鼠标移动相机

5 opengl 3d

我不确定如何解释这个,但希望你能明白我的意思.

基本上我画了一个立方体,想要拖动鼠标来查看所有的边.只能水平或垂直旋转很好,但如果我尝试将它们组合起来,那么事情会变得有些奇怪.

例如,如果我垂直旋转180度(以"倒置")然后水平拖动鼠标,则立方体旋转方向与鼠标移动方向相反.

这是相关代码:

double camera_angle_h = 0;
double camera_angle_v = 0;

int drag_x_origin;
int drag_y_origin;
int dragging = 0;

void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 25.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glRotated(camera_angle_v, 1.0, 0.0, 0.0);
    glRotated(camera_angle_h, 0.0, 1.0, 0.0);

    draw_cube();

    glFlush();
    glutSwapBuffers();
}

void mouse_click(int button, int state, int x, int y) {
    if(button == GLUT_LEFT_BUTTON) {
        if(state == GLUT_DOWN) {
            dragging = 1;
            drag_x_origin = x;
            drag_y_origin = y;
        }
        else
            dragging = 0;
    }
}

void mouse_move(int x, int y) {
    if(dragging) {
        camera_angle_v += (y - drag_y_origin)*0.3;
        camera_angle_h += (x - drag_x_origin)*0.3;
        drag_x_origin = x;
        drag_y_origin = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

Kyl*_*mek 5

正如其他人所说,使用四元数是解决方案。Ken Shoemake 提供了极好的代码,用于在图形宝石 IV 中在四元数和欧拉角之间进行转换(请参阅此处的代码示例,请参阅“欧拉角转换”)。它还具有与旋转矩阵之间的转换。

如果您想使用鼠标进行旋转,可以说“黄金标准”是由 Shoemake 在 Graphics Gems IV 中描述的“Arcball”界面(目前可在此处使用)。Arcball 的改进版本作为“轨迹球”随 Glut 库一起分发,当在旋转球体外发生点击时,它提供更直观的界面。它由 Gavin Bell 编写,可在此处此处获得。Bell 的轨迹球是Blender 项目使用的方法,我假设商业包使用类似的方法。


unw*_*ind 2

听起来好像您的应用程序遇到了万向节锁定问题。有几种方法可以解决这个问题,最简单的就是限制允许的旋转。