ZXNet эхоконференция «code.zx»


тема: 3D calculatig.



от: Aleksey Malov
кому: All
дата: 06 Apr 2000
Приветствую тебя, All!

При выводе 3d полигонов возникает ситуация, когда необходимо решать, в каком
порядке выводить полигоны на экран.
В случае выпуклых объектов все просто: достаточно выводить только те грани,
нормали которых направлены в сторону камеры, причем порядок вывода граней не
имеет значения.
У невыпуклых объектов надо выводить сначала наиболее удаленные от камеры
полигоны.
В Demo or die советуется сортировать полигоны по удаленности координаты Z
центральных точек полигонов. Однако, данный метод даст сбой при просчете очень
простой сцены:

─────────────────────────────────────────
/ ───────┐ \n
/ . │ \n
/ │ \n
/ │ \n
/ \n
/ \n
/ \n
/ \n
───────────────────────────────────────────────────────────

Хотя центральная точка маленького треугольника расположена дальше, чем у
прямоугоьника, его надо вывести позже прямоугольника, однако, вышеописанный
метод сортировки этого не заметит, и, в результате, не будет видно маленького
треугольника.

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

Рассмотрим объект типа "гантель", состояшую из трех объектов: 2 сферы и
цилиндр. Вместо того, чтобы сортировать все полигоны данного объекта,
достаточно ввести два псевдо-полигона, заданные направлениями векторов их
нормалей (сами координаты вершин псевдо-полигонов нам не нужны, т.к. выводить
их мы не будем), которые разделяют объект на 3 ВЫПУКЛЫХ объекта (2 сферы и
цилиндр):

WWWWW WWWWW
WW WW WW WW
W W W W
W W W W
W WWWWWWWWWWWWW W
W W
W S1 C S2 W
W W
W WWWWWWWWWWWWW W
W W W W
W W W W
WW WW WW WW
WWWWW WWWWW

│ N1 │N2
├──> ├───>
│ │


Теперь достаточно определить направление нормалей псевдо-полигонов. Если
нормаль N1 направлена навстречу камере, то сначала отрисовываем полигоны сферы
S1. В противном случае отрисовываем сферу S1 в последнюю очередь, после
полигонов сферы S2 и цилиндра C (какой из этих двух объектов выводить раньше,
решаем аналогичным образом при помощи нормали N2).
В данном примере можно было бы обойтись только нормалью N1, т.к. N1 и N2
параллельны друг другу.
Аналогичным образом можно отсортировать и более сложные сцены, путем введения
бОльшего числа псевдо-полигонов (достаточно добавить нужное количество векторов
нормалей псевдо-полигонов).
Кстати, для задания некоторых нормалей, можно обойтись и уже существующими в
сцене вершинами.
С динамически изменяющимися 3d-сценами (в которых меняется взаимное положение
и/или форма объектов) будет немного сложнее. Может, кто знает как разрешить эту
проблему? Впрочем, в демках для Спектрума можно обойтись и неизменяющимися
объектами.

Желаю вам здоровья, счастья и творческих узбеков.
Aleksey Malov aka VIVID/Brainwave.




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Дебют - Любителям лабиринтов и магических заданий-"SPOOKED".
Железяка - "SPRINTER-97": Видеосистема.
От идиоторов - авторы газеты.
For Coderz - Программирование смены диска/дисковода на Скорпионе.
Посмеемся - ярамарка-выставка-презентация PIII от intel.

В этот день...   29 марта