Краткое рассмотрение проецирования трехмерных объектов на двухмерный дисплей

ОГЛАВЛЕНИЕ

Данная статья простыми словами описывает, как преобразовать трехмерные координаты в двухмерные координаты для отображения на экране.

•    Скачать исходники - 67 Кб
•    Скачать демонстрационный проект - 34 Кб

Это введение в основы отрисовки трехмерных изображений, не охватывающее такие темы, как вращение или движение.

Несколько основных определений и допущений

Работа пойдет в стандартной прямоугольной системе координат, изображенной на Рисунке 1.

где: o – начало координат
+x - вправо (-x - влево)
+y - вверх (-y - вниз)
+z - вперед (-z - противоположное направление)

Положение точки в этом трехмерном пространстве можно представить как P(x, y, z), представляющий положение точки относительно определенного выше начала координат. Многоугольник является набором таких точек, соединенных линиями.

Затем надо определить точку, откуда смотрят (точку обзора). Это будет положение камеры E. Для упрощения объяснения камера будет помещена в начало координат (0, 0, 0). Позже в этой статье камера будет отодвинута от начала координат. Другое упрощение делается за счет допущения, что камера всегда смотрит вдоль оси Z в сторону +Z. Если это не так, то математика усложняется, и это не рассматривается здесь.

Наконец, надо проецировать изображение на экран S. Он всегда будет на плоскости, перпендикулярной направлению взгляда, и на расстоянии Sz от начала координат. Предполагается, что этот экран может расширяться так далеко, как требуется. Рисунок 2 показывает текущую ситуацию:


Просмотр точки

Если смотреть на сцену вдоль оси X, получается двухмерное поперечное сечение плоскости YZ (смотрящей в сторону начала координат с положительной стороны). Теперь проводится воображаемая линия между камерой и точкой, которую надо показать на экране. Видно, что линия пересечет экран в точке S. Рисунок 3 иллюстрирует это.

Уже известна координата z для точки экрана (Sz, совпадает с экраном), для которой надо выяснить значение y.

Базовая тригонометрия дает решение тут. Из правил для подобных треугольников следует, что отношение Sz к Pz совпадает с отношением Sy к Py; Получается следующее уравнение:

    Sz = Sy<br>
    Pz   Py

Перестановка формулы дает следующее уравнение для Sy;

    Sy = Py Sz<br>
          Pz

Аналогичный процесс дает аналогичное уравнение для координаты X.

    Sx = Px Sz<br>
          Pz

Видно, что если есть другая точка P2, как показано на Рисунке 4, имеющая такие же значения X и Y, но другое значение Z, то она пересекает экран в другой точке. Это имитирует эффект перспективы, замечаемый в реальной жизни: дальние объекты кажутся меньше, чем ближние.

Отодвигание камеры от начала координат

Данная выше формула действительна, только если координаты представлены относительно начала координат (т.е. (0, 0, 0). Если камера не в начале координат, приходится корректировать формулы с учетом этого. Рисунок 5 показывает камеру, сдвинутую вдоль оси Y и оси Z.

Если вернуться к первым уравнениям и изменить их с учетом сдвига, то получится:

    (Sz-Ez) = (Sy-Ey)<br>
    (Pz-Ez)   (Py-Ey)

и перестановка формулы дает:

    (Sy-Ey) = (Py-Ey)*(Sz-Ez)<br>
                
(Pz-Ez)

Итак, получается:

    Sy = (Py-Ey)*( Sz-Ez) + Ey<br>
             ( Pz-Ez)

Точно так же делается аналогичное преобразование для Sx,

    Sx = (Px-Ex)*( Sz-Ez) + Ex<br>
             ( Pz-Ez)

О программе

Полезно приложить код. Демонстрационная программа была написана для  иллюстрации эффекта изменения некоторых из параметров, влияющих на отрисовку изображения. Использовались трехмерные классы Криса Маундера, но большинство функциональности этих классов не используется.

Использование программы

При запуске программы выводятся на экран три каркасных дома, имеющих одинаковый размер, но помещенных в разные координаты Z. С помощью кнопок панели инструментов или клавиатуры можно перемещать камеру.

Следующие клавиши делают разные вещи в программе:

K/L: Сдвинуть положение экрана вдоль оси 'Z'
A/D: Сдвинуть положение камеры вдоль оси 'X'
W/X: Сдвинуть положение камеры вдоль оси 'Y'
R/T: Сдвинуть положение камеры вдоль оси 'Z'

Нажатие кнопок панели инструментов сдвинет камеру в направлении, обозначенном иконкой кнопки (если вы поймете значение иконки).