Показать glutSolidCone на его стороне
Я пытаюсь посмотреть на конус, лежащий на боку сверху. Для этого я написал следующий код:
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;
}
Я перевожу на середину экрана, а затем поворачиваю на 90 градусов вокруг оси x, что, по моей идее, должно создать конус на его стороне. В результате получается не конус, а линия, наклоненная не на 90, а на 45 градусов. Что я должен изменить, чтобы конус появился так, как я хочу?
1 ответ
Где матрица проекции?
Если вы не установите матрицу проекции, то координаты должны быть установлены в нормализованном пространстве устройства. В НДЦ все координаты находятся в диапазоне [-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();
}
Матрица проекции описывает отображение от трехмерных точек вида на сцене к двухмерным точкам в области просмотра. В ортогональной проекции координаты пространства просмотра линейно отображаются на координаты пространства клипа. Координаты пространства клипа равны нормализованным координатам устройства.
Нормализованные координаты устройства линейно отображаются в прямоугольник области просмотра. Прямоугольник области просмотра может быть определен glViewport
, Первоначально это определяется размером окна.
Обратите внимание, что рисунок по glBegin
/ glEnd
Последовательности и стек матрицы с фиксированными функциями устарели с десятилетий. См. Фиксированный конвейер функций и устаревший OpenGL. Читайте о Vertex Specification и Shader, чтобы узнать о современном способе рендеринга.