Добавляем в Hippo прозрачность и отрисовку треугольников, стоящих к зрителю задом
В OpenGL цвета можно задать и с альфа-каналом прозрачности. Подправим две команды заливки треугольника цветом целиком и по отдельным точкам. Теперь они такие:
TC - задать цвета точек треугольника
Синтаксис: TC #треугольник,r,g,b,a,r,g,b,a,r,g,b,a
TF - закрасить треугольник цветом
Синтаксис: TF #треугольник,r,g,b,a
И для рендера прозрачности добавим еще две новые команды:
RA - включить/выключить рендер альфа-канала
Синтаксис: RA состояние (0/1)
RB - включить/выключить рендер задних граней
Синтаксис: RB состояние (0/1)
Работает все это вот так:
Наш старый кубик, у которого из 12 треугольников третий и четвертый раскрашены. Справа в начало скрипта добавлены команды RA и RB, обе с нулем, т.е. прозрачность выключена и рендер треугольников "сзади" тоже выключен:
Кубик если собирать, пропуская раскрашенные 3 и 4 треугольники - то у него должна отвалиться верхняя крышка.
Выкидываем их из команды создания объекта O 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 (я создал новую, закомментировав старую рядом, чтоб вернуться потом к кубику с крышкой). Получаем команду: O 1, 1, 2, 5, 6, 7, 8, 9, 10, 11, 12
Крышка, действительно, убирается из сцены - но под ней пусто:
Это потому что "сзади" треугольники сейчас не рендерируются OpenGL-ем. У каждого треугольника есть "перед" и "зад". По-хорошему, каждый видимый, не закрытый другими треугольниками, треугольник нашей модельки должен смотреть на нас передом (хоть вбок повернутый, но смотреть на нас). Как вот на этой картинке - на треугольнике нормаль смотрит вверх, а на сфере - наружу из сферы:
По нормалям рассчитывается, например, освещенность каждого треугольника, когда известно с какой стороны падает свет - то треугольники светлеют или темнеют (и окрашиваются в цвет источника света) в зависимости от направления своей нормали.
Нормали сохраняются в файл 3D-модели и при загрузке в другом 3D-редакторе или 3D-игре сразу могут использоваться после загрузки файла при отрисовке модели на экране. Точнее - будут сохраняться. Пока что экспорта в файл 3D-модели в Hippo нет.
Кстати, нормалей у треугольника аж три - от каждой из его трех точек. По-хорошему надо рассчитывать нормаль по нескольким разнонаправленным треугольникам, стыкующимся в точке своими углами. Но пока что сделаем для каждого треугольника свою персональную нормаль, такая моделька будет на вид немного угловая, зато считать легче, т.к. не нужно узнавать какие еще треугольники в этой точке есть) А расчет усредненных нормалей оставим на будущее.
Нормали в Hippo рассчитываются автоматически, если точки треугольника d1, d2, d3 задать в команду T #номер_треугольника, d1, d2, d3 таком порядке, чтобы точки втроем располагались друг относительно друга против часовой стрелки, то нормаль будет смотреть на нас (и треугольник будет смотреть на нас).
И у кубика все треугольники смотрят наружу. А внутрь кубика не смотрит ни один - и OpenGL их всех поэтому успешно рисует пока кубик был целый, и совсем не рисует когда мы смотрим на кубик изнутри, сняв с него крышку.
Включаем новую команду для рендера треугольников "сзади" RB 1 - и теперь треугольники рендерятся и спереди, и сзади, и получается коробка без крышки, но со стенками и дном:
Цвета всех треугольников кубика сделаем теперь полупрозрачными - альфа-канал зададим равный 128 (а это середина из возможного диапазона 0 - 255). Если все команды стащить в одно место - получаем:
Треугольник с номером 0 - это все треугольники, которые будут созданы - будут белые полупрозрачные. А потом перед созданием кубика - отдельно 3 и 4 треугольник (верх кубика) раскрашиваем как раньше, но полупрозрачными цветами с альфа-каналом 128 (TC команда длинная, в скриншот вся не влезла).
Попробуем разные варианты рендера:
1) RA 0, RB 0 - не рендерируем альфу, не рисуем треугольники, стоящие к нам задом. Обычный кубик с раскрашенными треугольниками на крышке:
2) RA 1, RB 0 - рендерируем альфу, но не рисуем треугольники, стоящие к нам задом. Смотрящие на нас треугольники стали полупрозрачными, но за ними ничего нет (все треугольники за ними стоят к нам задом и не рисуются):
3) RA 1, RB 1 - рендерируем альфу и рисуем треугольники, стоящие к нам задом. Смотрящие на нас треугольники стали полупрозрачными, за ними видны остальные треугольники, стоящие к нам спиной, но рисующиеся т.к. мы просим их рисоваться командой RB 1:
Кстати, отрисовка полупрозрачных моделей в OpenGL - это отдельное мучение. Сначала надо отрисовать все непрозрачные треугольники. А потом отдельно отрисовать все полупрозрачные, при этом сначала рисовать самые дальние от камеры, потом поближе, и т.д. до самых близких. В движок Hippo был прописан этот алгоритм и вроде бы все полупрозрачное рисуется корректно) А если порядок отрисовки не соблюсти, то будет фигня с наложением одних полупрозрачных треугольников на другие, и нереалистично прорисованный результат.
Проверка правильности нормалей всех треугольников
Если испортить, например, 12-й треугольник кубика и записать его точки в обратном порядке - вместо 8, 4, 1 написать 8, 1, 4 - то его нормаль отвернется от нас, т.е. треугольник тоже повернется к нам спиной.
Если при этом рендерить сцену с выключенной отрисовкой треугольников сзади (командой
RB 0) - то этот треугольник пропадет из модельки. И будет ясно что нормаль у него не в ту сторону:
Так с помощью команды
RB 0 можно проверять правильность нормалей (т.е. правильность порядка запихивания точек в треугольники) при ручном поточечно-потреугольном создании лоуполи-моделек в Hippo.