不使用glm库,使用OpenGL编写一段代码,要求:生成一个3D风扇,能用鼠标互动,给出完整代码,图像生动,代码能正常运行
时间: 2024-10-19 11:02:56 浏览: 23
在不使用GLM库的情况下直接编写OpenGL代码来创建一个可交互的3D风扇可能会比较复杂,因为GLM是一个高度封装的数学库,它简化了许多3D图形操作。不过,我们可以使用基本的OpenGL函数来完成这个任务。以下是一个简单的示例,展示了如何创建一个基本的3D风扇模型,并使用基本的用户输入处理来控制旋转。请注意,这个例子仅适用于理解基本原理,实际项目中可能需要更复杂的着色器、纹理等。
```c++
#include <GL/glut.h>
#include <GL/freeglut.h>
const float spinSpeed = 0.05f;
float rotationY = 0.0f;
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
// 设置模型视矩阵
glRotatef(rotationY, 0.0f, 1.0f, 0.0f);
// 创建风扇模型
glBegin(GL_TRIANGLES);
glVertex3f(0.0f, -0.5f, -0.5f); // 左上顶点
glVertex3f(0.0f, 0.5f, -0.5f); // 右上顶点
glVertex3f(-0.5f, 0.0f, -0.5f); // 左下顶点
glVertex3f(0.0f, -0.5f, -0.5f); // 左上顶点
glVertex3f(0.0f, -0.5f, 0.5f); // 左下顶点
glVertex3f(0.5f, 0.0f, -0.5f); // 右下顶点
glVertex3f(0.0f, 0.5f, -0.5f); // 右上顶点
glVertex3f(0.0f, 0.5f, 0.5f); // 右下顶点
glVertex3f(-0.5f, 0.0f, 0.5f); // 左下顶点
glEnd();
// 更新并提交变换
glutSwapBuffers();
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
}
void mouseMove(int x, int y) {
if (x >= 0 && x < glutGet(GLUT_WINDOW_WIDTH) && y >= 0 && y < glutGet(GLUT_WINDOW_HEIGHT)) {
rotationY += (y - glutGetLastMouseY()) * spinSpeed;
glutSetCursor(GLUT_CURSOR_LEFT_ARROW);
} else {
glutSetCursor(GLUT_CURSOR_NONE);
}
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("3D Fan");
glEnable(GL_DEPTH_TEST);
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMotionFunc(mouseMove);
glutMainLoop();
return 0;
}
```
阅读全文