我正在尝试从上方看一个锥形的侧面。为此,我编写了以下代码:
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(250, 250, 0);
glRotatef(90, 1, 0, 0);
glutSolidCone(20, 20, 20, 20);
glTranslatef(-250, -250, 0);
glRotatef(-90, 1, 0, 0);
glFlush();
glutSwapBuffers();
}
int main(int argc, char **argv)
{
float x, y;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutCreateWindow("Cone");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMotionFunc(drag);
glutMouseFunc(click);
glutSpecialFunc(catchKey);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}
我平移到屏幕中间,然后绕x轴旋转90度,按照我的想法,这应该在侧面产生圆锥。但是,结果不是圆锥而是一条线,该线不是倾斜90度而是倾斜45度。为了使视锥细胞显示在我想要的位置,我应该改变什么?
答案 0 :(得分:2)
投影矩阵在哪里?
如果不设置投影矩阵,则必须在规范化设备空间中设置坐标。在NDC中,所有坐标都在[-1.0,1.0]范围内:
例如
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.5, 0.5, 0);
glRotatef(90, 1, 0, 0);
glutSolidCone(1.0, 1.0, 20, 20);
glTranslatef(-0.5, -0.5, 0);
glRotatef(-90, 1, 0, 0);
或者,您可以设置正投影,将世界坐标1:1投影到窗口坐标。投影矩阵可以通过glOrtho
设置:
例如
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 500.0, 500.0, 0.0, -100.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(250, 250, 0);
glRotatef(90, 1, 0, 0);
glutSolidCone(20, 20, 20, 20);
glTranslatef(-250, -250, 0);
glRotatef(-90, 1, 0, 0);
glFlush();
glutSwapBuffers();
}
投影矩阵描述从场景中的视图的3D点到视口上的2D点的映射。在正交投影中,视图空间坐标被线性映射到剪辑空间坐标。剪辑空间坐标等于规范化的设备坐标。
归一化的设备坐标线性映射到视口矩形。
视口矩形可以由glViewport
定义。最初,它是由窗口的大小定义的。
请注意,数十年来不赞成使用glBegin
/glEnd
序列和固定函数矩阵堆栈进行绘制。请参见Fixed Function Pipeline和Legacy OpenGL。
了解有关Vertex Specification和Shader的最新渲染方式。