glGetFloatv (GL_MODELVIEW_MATRIX, mat)

这个函数的作用是取出GL_MODELVIEW_MATRIX,然后存储在mat这个矩阵中,用于逆变换等。

转载于:https://www.cnblogs.com/qingsunny/p/3334431.html

要在OpenGL中显示OBJ文件,您需要遵循以下步骤: 1. 读取OBJ文件并将其解析为顶点和面。 2. 创建一个OpenGL程序对象,并将其编译和链接为一个可执行程序。 3. 创建一个OpenGL窗口,并将其设置为显示3D场景。 4. 在OpenGL中设置透视投影,以便您可以正确地呈现3D场景。 5. 将OBJ文件中的顶点数据加载到OpenGL缓冲区中。 6. 使用OpenGL顶点缓冲区对象(VBO)和索引缓冲区对象(IBO)来呈现OBJ文件的面。 7. 在OpenGL窗口中呈现OBJ文件。 下面是一个简单的示例代码,可以读取OBJ文件并在OpenGL窗口中呈现它: ```c++ #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <GL/glew.h> #include <GL/glut.h> using namespace std; // ObjLoader类用于读取和解析OBJ文件 class ObjLoader { public: ObjLoader(const string& filename); ~ObjLoader(); vector<float> vertices; vector<unsigned int> indices; }; ObjLoader::ObjLoader(const string& filename) { ifstream in(filename); string line; while (getline(in, line)) { istringstream iss(line); string token; iss >> token; if (token == "v") { float x, y, z; iss >> x >> y >> z; vertices.push_back(x); vertices.push_back(y); vertices.push_back(z); } else if (token == "f") { unsigned int i1, i2, i3; iss >> i1 >> i2 >> i3; indices.push_back(i1 - 1); indices.push_back(i2 - 1); indices.push_back(i3 - 1); } } } ObjLoader::~ObjLoader() {} // OpenGL程序对象 GLuint program; // 窗口大小 int width = 800, height = 600; // ObjLoader对象 ObjLoader* objLoader; // 初始化OpenGL void init() { // 创建和编译着色器 GLuint vs = glCreateShader(GL_VERTEX_SHADER); const char* vsCode = "#version 330\n" "layout(location = 0) in vec3 position;\n" "uniform mat4 modelViewProjectionMatrix;\n" "void main() {\n" " gl_Position = modelViewProjectionMatrix * vec4(position, 1.0);\n" "}"; glShaderSource(vs, 1, &vsCode, NULL); glCompileShader(vs); GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); const char* fsCode = "#version 330\n" "out vec4 color;\n" "void main() {\n" " color = vec4(1.0, 1.0, 1.0, 1.0);\n" "}"; glShaderSource(fs, 1, &fsCode, NULL); glCompileShader(fs); // 创建OpenGL程序对象 program = glCreateProgram(); glAttachShader(program, vs); glAttachShader(program, fs); glBindAttribLocation(program, 0, "position"); glLinkProgram(program); // 加载OBJ文件 objLoader = new ObjLoader("model.obj"); // 创建并绑定顶点缓冲区对象 GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, objLoader->vertices.size() * sizeof(float), &objLoader->vertices[0], GL_STATIC_DRAW); // 创建并绑定索引缓冲区对象 GLuint ibo; glGenBuffers(1, &ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, objLoader->indices.size() * sizeof(unsigned int), &objLoader->indices[0], GL_STATIC_DRAW); // 启用顶点属性数组 glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); // 设置透视投影 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)width / (double)height, 0.1, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } // 渲染OpenGL场景 void render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(program); // 计算模型视图投影矩阵 GLfloat mvpMatrix[16]; glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -5.0f); glGetFloatv(GL_MODELVIEW_MATRIX, mvpMatrix); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPerspective(45.0, (double)width / (double)height, 0.1, 100.0); glGetFloatv(GL_PROJECTION_MATRIX, &mvpMatrix[16]); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadMatrixf(mvpMatrix); // 绘制OBJ文件 glDrawElements(GL_TRIANGLES, objLoader->indices.size(), GL_UNSIGNED_INT, NULL); glPopMatrix(); glutSwapBuffers(); } // 调整窗口大小 void reshape(int w, int h) { width = w; height = h; glViewport(0, 0, width, height); } // 主函数 int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(width, height); glutCreateWindow("OBJ Viewer"); glewInit(); init(); glutDisplayFunc(render); glutReshapeFunc(reshape); glutMainLoop(); return 0; } ``` 这个示例代码使用了GLUT和GLEW库,您需要在编译和链接时包含这些库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值