相机倒置OpenGL
Posted
技术标签:
【中文标题】相机倒置OpenGL【英文标题】:Camera is upside down OpenGL 【发布时间】:2016-02-06 12:31:58 【问题描述】:我的相机在 OpenGL 中倒置时遇到问题。 如果我在没有将相机 Z 旋转设置为 180 度的情况下渲染我的对象,则对象会被颠倒渲染。 可能和glm有关?
这是我设置矩阵的方式:
//Model Matrix:
mat4 modelMatrix;
modelMatrix = translate(modelMatrix, vec3(entity.getPosition().x, entity.getPosition().y, entity.getPosition().z));
modelMatrix = rotate(modelMatrix, (float) (entity.getRotation().x / 180 * PI), vec3(1, 0, 0));
modelMatrix = rotate(modelMatrix, (float) (entity.getRotation().y / 180 * PI), vec3(0, 1, 0));
modelMatrix = rotate(modelMatrix, (float) (entity.getRotation().z / 180 * PI), vec3(0, 0, 1));
modelMatrix = scale(modelMatrix, entity.getScale());
return modelMatrix;
//View Matrix:
mat4 viewMatrix;
viewMatrix = rotate(viewMatrix, (float)(camera.getRotation().x / 180 * PI), vec3(1, 0, 0));
viewMatrix = rotate(viewMatrix, (float)(camera.getRotation().y / 180 * PI), vec3(0, 1, 0));
viewMatrix = rotate(viewMatrix, (float)(camera.getRotation().z / 180 * PI), vec3(0, 0, 1));
viewMatrix = translate(viewMatrix, camera.getPosition() * vec3(-1, -1, -1));
return viewMatrix;
//Projection Matrix:
return glm::perspective(camera.getFieldOfView(), Display::getWindowAspectRatio(), camera.getNearPlane(), camera.getFarPlane());
这是我的绘制方法:
for (int i = 0; i < entityMap.size(); i++)
map<GLuint, vector<Entity>>::iterator iterator(entityMap.begin());
advance(iterator, i);
vector<Entity> entityBatch = iterator->second;
Model entityModel = entityBatch[0].getModel();
mat4 *modelMatrices = new mat4[entityBatch.size()];
for (int j = 0; j < entityBatch.size(); j++)
modelMatrices[j] = Maths::createModelMatrix(entityBatch[j]);
glBindVertexArray(iterator->first);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
glEnableVertexAttribArray(4);
glEnableVertexAttribArray(5);
GLuint vertexBufferObjectId;
glGenBuffers(1, &vertexBufferObjectId);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObjectId);
glBufferData(GL_ARRAY_BUFFER, sizeof(mat4) * entityBatch.size(), modelMatrices, GL_STATIC_DRAW);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(vec4), (GLvoid*)(0 * sizeof(vec4)));
glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(vec4), (GLvoid*)(1 * sizeof(vec4)));
glVertexAttribPointer(4, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(vec4), (GLvoid*)(2 * sizeof(vec4)));
glVertexAttribPointer(5, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(vec4), (GLvoid*)(3 * sizeof(vec4)));
glVertexAttribDivisor(2, 1);
glVertexAttribDivisor(3, 1);
glVertexAttribDivisor(4, 1);
glVertexAttribDivisor(5, 1);
#if ENABLE_INDEXING
glDrawElementsInstanced(GL_TRIANGLES, entityModel.getIndexCount(), GL_UNSIGNED_INT, 0, entityBatch.size());
#else
glDrawArraysInstanced(GL_TRIANGLES, 0, entityModel.getVertexCount(), entityBatch.size());
#endif
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(3);
glDisableVertexAttribArray(4);
glDisableVertexAttribArray(5);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &vertexBufferObjectId);
glBindVertexArray(0);
感谢您的帮助!
【问题讨论】:
如果不展示您的绘图方式和设置矩阵的方式,这个问题是无法回答的。 旋转的值是多少?如果您根本不应用任何旋转,也会发生同样的事情吗?我可能知道发生了什么,但它无法解释为什么事情会颠倒,除非涉及到轮换。 我尝试不应用旋转,但它不起作用。顺便说一句,只是相机被颠倒了。世界坐标被颠倒,物体看起来是颠倒的。 【参考方案1】:问题出在我的投影矩阵上。
我忘记了 glm 以弧度工作并且没有将视野从度数转换为弧度。现在一切正常。
我还有一个问题。 你需要给glm::perspect
感谢大家的帮助!
【讨论】:
我在尝试模拟在 Blender 中获得的相机视图时遇到了这个问题。将 FOV 从 45 设置为 49.134(对于 35mm 胶片)后,Y 被倒置。这么久以来,我一直使用 45 度作为我的 FOV,实际上我一直使用 45 弧度,大约 58 度。哈!以上是关于相机倒置OpenGL的主要内容,如果未能解决你的问题,请参考以下文章