Цветной треугольник

30.01.2000 — 11.03.2000


Определения

Декартова система координат
— система координат на плоскости или в пространстве, с перпендикулярными осями и одинаковыми масштабами по осям. В "Elfish Engine" применятся только декартова система.
Камера
— место, из которого смотрит пользователь. Камера не имеет размера — в трехмерном мире она определяется только положением и ориентацией.
Экран
— то, на что смотрит пользователь. Экран удален от камеры на некоторое расстояние, и удаленность экрана от камеры изменяет ширину обзора. Например, если вы будете смотреть в окно, а потом отойдете от него, то ширина обзора у вас уменьшится.
Пространство просмотра
— система координат, в которой камера находится в точке (0, 0, 0). Положение всех предметов в таком пространстве задано относительно камеры.
Область просмотра
— часть пространства просмотра, объекты которого попадают в камеру. Обычно область просмотра задается ограничивающими плоскостями.
Правосторонняя система координат
— система координат, в которой ось X направлена вправо, ось Y — вверх, а Z — назад.
Левосторонняя система координат
— то же, что и правосторонняя, только ось Z направлена вперед. Если система координат в пространстве просмора, то Z направлена от камеры к экрану.
Вектор
— он же "точка" он же "направленный отрезок". Направленным отрезком называется потому, что принято считать, что существует отрезок между точкой и центром координат. Направлен такой отрезок из центра координат в точку. В отличии от просто точки, вектора можно складывать и перемножать друг с другом, получая другие вектора.

Система координат

Различие OpenGL и Direct3D

Система координат в OpenGL — правосторонняя. Я привычней к левосторонней, как в Direct3D, ;-) поэтому придется написать немного строк для преобразования... но не сейчас. Сейчас лучше заняться вещами попроще.

OpenGL: правосторонняя
система координат

Область просмотра

Как уже говорилось, в OpenGL используется правосторонняя система координат.

По умолчанию, в OpenGL все координаты интерпретируются как находящиеся в пространстве просмотра. Так же, по умолчанию, область просмотра ограничена по координате Z: от -1 до 1. Такое ограничение по Z кажется мне немного неестественным... далее я изменю это ограничение, а пока использую это.

Также, по умолчанию, ширина и высота экрана для области просмотра ограничены от -1 до 1. То есть, если задать точку (1, 1, 0), то она будет как раз на правом-верхнем углу экрана. Если задать точку (-1, -1, 0), то она будет лежать в левом-нижнем углу.

Рисование

Чтобы нарисовать треугольник, нужно задать его вершины. Эти вершины должны находиться в области просмотра — так, чтобы их было видно. Пусть это будут... ну, пусть (0.5f, 0.5f, 0), (-0.7f, 0, 0) и (0, -0.7f, 0).

Чтобы начать рисование треугольников в OpenGL, нужно вызвать функцию glBegin(GL_TRIANGLES). Параметр, который туда передается, говорит о том, что программа хочет вывести список треугольников. Заканчиваться такой вывод должен вызовом функции glEnd().

Координаты вершин передаются вызовами функции glVertex3f(x, y, z).

void Graphics::DrawTestTriangle()
{
    glBegin(GL_TRIANGLES);
    glVertex3f(0.5f, 0.5f, 0); 
    glVertex3f(-0.7f, 0, 0);
    glVertex3f(0, -0.7f, 0);
    glEnd();
}

Вот такая функция нарисует на окне белый треугольник... Почему белый? Потому что по умолчанию в OpenGL используется белый цвет.

В OpenGL есть возможность задать для каждой вершины свой цвет. Когда OpenGL будет рисовать треугольник, цвета вершин "растекутся" по его поверхности. Цвет задается в блоке glBegin/glEnd функцией glColor3f(Red, Green, Blue). Параметры — это интенсивности цветов от 0 до 1. 0 соответствует отсутствию цвета (полной темноте), 1 соответствует максимальной интенсивности.

void Graphics::DrawTestTriangle()
{
    glBegin(GL_TRIANGLES);

    // Красный
    glColor3f(1, 0, 0);
    glVertex3f(0.5f, 0.5f, 0); 

    // Зеленый
    glColor3f(0, 1, 0); 
    glVertex3f(-0.7f, 0, 0);

    // Синий цвет слабо воспринимается глазом, поэтому сделаю 
    // его более ярким - подсвечу другими цветами.
    glColor3f(0.2f, 0.2f, 1);
    glVertex3f(0, -0.7f, 0);

    glEnd();
}

Пример

А вот и первый пример, на котором можно посмотреть результат работы трехмерной части OpenGL. В нем также содержится подправленный главный цикл программы.

Следующая страница: Трансформации


(c) 2000 Константин Михеев — проект "Elfish Engine"