GL_MODELVIEW矩阵详解

OpenGL中视图与模型变换详解
本文深入探讨OpenGL中的视图和模型变换原理,解释了GL_MODELVIEW_MATRIX矩阵的构造及用途,包括旋转、缩放和位移的实现方式,并详细说明了变换矩阵在内存中的存放方式。
在opengl中,视图和模型变换是在一个矩阵中进行控制的,这个矩阵就是GL_MODELVIEW_MATRIX,可以使用glGetFloatv函数来获取这个矩阵,而我们所要使用glTranslate*, glRotate*,glScale* 等操作均最后反映到这个矩阵的变化中,所以了解这个矩阵的构造对于灵活运用OpenGL比较重要。
变换矩阵在内存中的存放方式如下:
 
 m[0] m[4] m[ 8] m[12]
 
m[1] m[5] m[ 9] m[13]
 
m[2] m[6] m[10] m[14]
 
m[3] m[7] m[11] m[15]
 
可以看出,OpenGL是以列序来存放这个矩阵的,位于矩阵上方的3*3矩阵是旋转矩阵,可以用来控制刚体的旋转和尺度变化,如下:rotate,scale.
 
 m[0] m[4] m[ 8]
 
m[1] m[5] m[ 9]
 
m[2] m[6] m[10]
 
而左上角的3*1矩阵是用来控制刚体的平移的--translate。就是m[12],m[13],m[14]这三个值,分别控制X,Y ,Z方向的平移。所有16个值组成一标准的齐次矩阵。
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2664 “void Shader::setMat4(const std::string &,const float *)”: 无法将参数 2 从“glm::mat4”转换为“const float *” SolarSystem E:\C++\SolarSystem\Object.cpp 83 错误 C2664 “void Shader::setMat4(const std::string &,const float *)”: 无法将参数 2 从“glm::mat4”转换为“const float *” SolarSystem E:\C++\SolarSystem\Object.cpp 84 错误 C2664 “void Shader::setMat4(const std::string &,const float *)”: 无法将参数 2 从“glm::mat4”转换为“const float *” SolarSystem E:\C++\SolarSystem\Object.cpp 85 错误(活动) E0413 不存在从 "glm::mat4" 到 "const float *" 的适当转换函数 SolarSystem E:\C++\SolarSystem\Object.cpp 83 错误(活动) E0413 不存在从 "glm::mat4" 到 "const float *" 的适当转换函数 SolarSystem E:\C++\SolarSystem\Object.cpp 84 错误(活动) E0413 不存在从 "glm::mat4" 到 "const float *" 的适当转换函数 SolarSystem E:\C++\SolarSystem\Object.cpp 85 #include "Object.h" #include <glad/glad.h> // 必须第一行 #include <GLFW/glfw3.h> // 第二行 #include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> #include "TexturePool.h" Object::Object(std::string vs, std::string fs, std::string texName) { createShader(vs.c_str(), fs.c_str()); if (!texName.empty()) { texture = TexturePool::getInstance()->getTexture(texName); if (shader) { shader->use(); shader->setInt("tex", 0); } } } Object::~Object() { glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); delete shader; } void Object::createShader(const char* vs, const char* fs) { if (shader) delete shader; shader = new Shader(vs, fs); } void Object::setTexture(std::string texName) { texture = TexturePool::getInstance()->getTexture(texName); } void Object::createBuffer(bool createEBO, GLenum usage) { glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); if (createEBO) glGenBuffers(1, &EBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, verticesSize, vertices, usage); if (createEBO && indices) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexSize, indices, usage); } glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, stride, (void*)offsetof(TextureColorVertex, color)); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, stride, (void*)offsetof(TextureColorVertex, texture)); glEnableVertexAttribArray(2); glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, stride, (void*)offsetof(TextureColorVertex, normal)); glEnableVertexAttribArray(3); glBindVertexArray(0); } void Object::render(glm::mat4& view, glm::mat4& projection) { if (!shader || !texture) return; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glBindVertexArray(VAO); shader->use(); shader->setMat4("model", model); shader->setMat4("view", view); shader->setMat4("projection", projection); renderObject(); } void Object::updateDataBuffer() { glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferSubData(GL_ARRAY_BUFFER, 0, verticesSize, vertices); glBindBuffer(GL_ARRAY_BUFFER, 0); }
最新发布
11-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值