gpt4 book ai didi

OpenGL - 用鼠标移动相机

转载 作者:行者123 更新时间:2023-12-04 17:05:45 27 4
gpt4 key购买 nike

我不确定如何解释这一点,但希望你能理解我的意思。

基本上我画了一个立方体,想拖动鼠标来查看所有的边。
仅水平或垂直旋转很好,但如果我尝试将这些组合起来,事情就会变得有点奇怪。

例如如果我垂直旋转 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;
}
}

最佳答案

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

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

关于OpenGL - 用鼠标移动相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1426415/

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