只是在使用opengl
和glut
时鬼混。我试图制作立方体完整的visibe所以我决定用gluPerspective();
制作它
所以这是代码
#include <iostream>
#include <GL/glut.h>
#include <GL/gl.h>
using namespace std;
float _angle = 0.1f;
void render(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluPerspective(90.0, 1, 0.1, 100.0);
gluLookAt(1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(_angle, 0.0f,0.0f,1.0f);
glColor3f(1.0f,0.0f,0.0f);
glutSolidCube (1.0);
glPopMatrix();
_angle +=0.03f;
// check OpenGL error
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
cerr << "OpenGL error: " << err << endl;
}
glutSwapBuffers();
glutPostRedisplay();
}
void init(){
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(640, 480);
glutCreateWindow("test");
glClearColor(0.2,0.2,0.2,0.0);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glutDisplayFunc(render);
glutMainLoop();
}
int main(int argc, char * argv[]) {
glutInit(&argc, argv);
init();
return 0;
}
,结果是:
如果没有gluPerspective()
,多维数据集的部分内容如何:
我怎样才能让它看起来正常?
答案 0 :(得分:3)
当你弄乱投影矩阵时,我不一定会说法线会被反转,就像缠绕方向相反一样。
OpenGL确定多边形缠绕,用于在投影后剔除前/后面向多边形。当您的投影矩阵和模型视图矩阵不同意Z应该面向哪个方向(换句话说是手性)时,您将会遇到这些奇怪的问题。
传统上,投影矩阵设置为在与OpenGL中的模型视图矩阵相乘时反转Z.固定功能管道一直以这种方式工作,这就是生成OpenGL右手坐标系的原因。如果您翻转Z坐标,则更改顶点在投影后缠绕的方向。
说完这一切之后,我认为这实际上不是你的问题。您在这里使用每顶点光照,并且您已将模型视图矩阵与投影矩阵相结合。当进行逐顶点光照计算时,它们是在错误的坐标空间中完成的。我建议你将模型视图与投影分开......
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (90.0, 1, 0.1, 100.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (1, 1, 1, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
现在你已经正确地分离了转换矩阵和固定功能照明,其他事情应该按预期工作。
除了我上面所描述的,还有一件事你忘了做。默认情况下,在OpenGL中禁用深度测试(因为不能保证您甚至有深度缓冲区);你需要启用它。
glEnable (GL_DEPTH_TEST);
当您致电gluPerspective (...)
时,您的宽高比设置不正确,应该是640.0f/480.0f
而不是1
。