在其一侧显示 glutSolidCone
Show glutSolidCone on its side
我正试图从上方观察一个侧卧的锥体。为此,我编写了以下代码:
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 度倾斜的线。我应该更改什么才能使圆锥体显示为我想要的样子?
投影矩阵在哪里?
如果不设置投影矩阵,则必须在归一化设备中设置坐标 space。在 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 投影到 window 坐标。投影矩阵可以设置为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 点的映射。在正交投影中,视图 space 坐标线性映射到剪辑 space 坐标。剪辑 space 坐标等于标准化设备坐标。
规范化的设备坐标线性映射到视口矩形。
视口矩形可以由 glViewport
定义。最初它由 window.
的大小定义
请注意,glBegin
/glEnd
sequences and the fixed function matrix stack is deprecated since decades. See Fixed Function Pipeline and Legacy OpenGL 绘制的那幅画。
阅读 Vertex Specification and Shader 了解最先进的渲染方式。
我正试图从上方观察一个侧卧的锥体。为此,我编写了以下代码:
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 度倾斜的线。我应该更改什么才能使圆锥体显示为我想要的样子?
投影矩阵在哪里?
如果不设置投影矩阵,则必须在归一化设备中设置坐标 space。在 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 投影到 window 坐标。投影矩阵可以设置为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 点的映射。在正交投影中,视图 space 坐标线性映射到剪辑 space 坐标。剪辑 space 坐标等于标准化设备坐标。
规范化的设备坐标线性映射到视口矩形。
视口矩形可以由 glViewport
定义。最初它由 window.
请注意,glBegin
/glEnd
sequences and the fixed function matrix stack is deprecated since decades. See Fixed Function Pipeline and Legacy OpenGL 绘制的那幅画。
阅读 Vertex Specification and Shader 了解最先进的渲染方式。