若有一个边长为1的正方体(正六面体),其各顶点为:O(0,0,0)、A(0,0,1)、B(1,0,1)、C(1,1,1)、D(0,1,1)、E(1,0,0)、F(1,1,0)、G(0,1,0),编写其正投影程序。(基于c++和openGL)
时间: 2024-11-15 18:32:24 浏览: 23
在一个OpenGL程序中,绘制正方体的正投影主要是通过设置视图矩阵来实现的。首先,你需要包含必要的头文件,并初始化OpenGL环境。这里我会给出一个简单的示例,展示了如何使用OpenGL库在C++中创建一个正方体贴图并进行正投影:
```cpp
#include <GL/glut.h>
#include <glm/glm.hpp>
// 正方体顶点坐标
const float vertices[] = {
// 正面
-1.f, 1.f, 1.f,
1.f, 1.f, 1.f,
1.f, -1.f, 1.f,
-1.f, -1.f, 1.f,
// 右侧
1.f, 1.f, -1.f,
1.f, -1.f, -1.f,
1.f, 1.f, 1.f,
1.f, -1.f, 1.f,
// 左侧
-1.f, 1.f, -1.f,
-1.f, -1.f, -1.f,
-1.f, 1.f, 1.f,
-1.f, -1.f, 1.f,
// 后面
-1.f, 1.f, -1.f,
1.f, 1.f, -1.f,
1.f, -1.f, -1.f,
-1.f, -1.f, -1.f,
// 底部
-1.f, -1.f, 1.f,
-1.f, -1.f, -1.f,
1.f, -1.f, -1.f,
1.f, -1.f, 1.f,
// 上面
-1.f, 1.f, 1.f,
1.f, 1.f, 1.f,
1.f, 1.f, -1.f,
-1.f, 1.f, -1.f
};
// 正方体顶点索引
const unsigned int indices[] = {
// 正面
0, 1, 3, // 1st face
1, 2, 3,
// 右侧
4, 5, 7, // 2nd face
5, 6, 7,
// 左侧
0, 3, 2, // 3rd face
2, 7, 6,
// 后面
0, 4, 7, // 4th face
4, 5, 7,
// 底部
3, 2, 6, // 5th face
2, 7, 6,
// 上面
1, 0, 4, // 6th face
0, 5, 4
};
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); // 重置变换
// 设置模型视图和投影矩阵
glm::mat4 projection = glm::ortho(-1, 1, -1, 1, 0, 1); // 正投影
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projection.val);
// 绑定顶点数组对象 (VAO) 和启用顶点属性布局
glBindVertexArray(vao);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (GLvoid*)0);
// 绘制正方体
glDrawElements(GL_TRIANGLES, sizeof(indices) / sizeof(unsigned int), GL_UNSIGNED_INT, (GLvoid*)0);
// 清理
glBindVertexArray(0);
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("正方体正投影");
// 创建VAO和VBO
GLuint vao, vbo;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (GLvoid*)0);
glEnableVertexAttribArray(0);
// 绑定索引缓冲区
GLuint ibo;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glutDisplayFunc(display);
// 渲染主循环
glutMainLoop();
return 0;
}
```
在这个代码中,我们创建了一个顶点数组对象(VAO)和顶点缓冲对象(VBO)来存储顶点数据,以及一个索引缓冲对象(IBO)来存储面片索引。`display()`函数用于设置投影矩阵并将正方形渲染到屏幕上。
阅读全文