정확하게 설명하는 방법은 잘 모르겠지만 잘하면 내 뜻을 이해할 수있을 것입니다.OpenGL - 마우스로 카메라 움직이기
기본적으로 큐브를 그렸고 마우스를 드래그하여 모든면을 봅니다. 수평 또는 수직으로 만 회전해도 문제가 없지만이 두 가지를 결합하면 문제가 좀 이상해집니다.
수직으로 180도 회전하면 ('거꾸로 됨') 마우스를 수평으로 끌면 큐브가 마우스 동작의 반대 방향으로 회전합니다. 응용 프로그램이 gimbal lock을 앓고있는 것처럼
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;
}
}