Opengl写一个立方体可以交互
时间: 2024-02-19 10:03:13 浏览: 58
好的,以下是一个简单的 OpenGL 程序,可以创建一个立方体,并且通过鼠标交互进行旋转和缩放:
```c++
#include <GL/glut.h>
// 立方体的顶点坐标
GLfloat vertices[8][3] = {
{-1,-1,-1}, {-1,-1,1}, {-1,1,1}, {-1,1,-1},
{1,-1,-1}, {1,-1,1}, {1,1,1}, {1,1,-1}
};
// 立方体的面的顶点编号
GLint faces[6][4] = {
{0, 1, 2, 3}, {4, 5, 6, 7}, {0, 4, 7, 3},
{1, 5, 6, 2}, {0, 1, 5, 4}, {3, 2, 6, 7}
};
// 鼠标交互参数
int last_x, last_y;
bool rotate_x = false, rotate_y = false, zoom = false;
// 初始化OpenGL
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
}
// 绘制立方体
void draw_cube() {
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_QUADS);
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 4; j++) {
glVertex3fv(vertices[faces[i][j]]);
}
}
glEnd();
}
// 鼠标交互函数
void mouse(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
last_x = x;
last_y = y;
rotate_x = true;
} else if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) {
last_x = x;
last_y = y;
rotate_y = true;
} else if (button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) {
last_y = y;
zoom = true;
} else if (state == GLUT_UP) {
rotate_x = false;
rotate_y = false;
zoom = false;
}
}
// 鼠标移动函数
void motion(int x, int y) {
if (rotate_x) {
glRotatef((x - last_x) * 0.5, 0.0, 1.0, 0.0);
last_x = x;
} else if (rotate_y) {
glRotatef((y - last_y) * 0.5, 1.0, 0.0, 0.0);
last_y = y;
} else if (zoom) {
glTranslatef(0.0, 0.0, (y - last_y) * 0.01);
last_y = y;
}
glutPostRedisplay();
}
// 绘制函数
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0, 0.0, -5.0);
draw_cube();
glFlush();
}
// 主函数
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Interactive Cube");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
init();
glutMainLoop();
return 0;
}
```
这个程序创建了一个立方体,通过鼠标左键和右键进行绕 y 轴和 x 轴的旋转,通过鼠标中键进行缩放。注意,这个程序只是一个简单的示例,实现方式并不完美,可以根据需要进行修改和优化。
阅读全文