Пишем портальный рендерер (часть III)

Кроме обычного отражения, к камере можно применять практически любое аффинное преобразование. За счет этого легко получить портал, ведущий прямо из середины одной комнаты в совершенно другое место (рис. 9.3). Это достигается простым применением преобразования переноса к камере в процессе рендеринга данного портала.

На рис. 9.3 с порталом Р связывается преобразование переноса, переводящее его в портал Р\ т. е. фактически осуществляется разрыв пространства - при движении точки в направлении портала Р происходит мгновенный скачок при попадании в этот портал и точка сразу выходит из портала Р'. То же самое происходит и с лучами света.

Рис. 9.3

На рис. 9.3 с порталом Р связывается преобразование переноса, переводящее его в портал Р\ т. е. фактически осуществляется разрыв пространства - при движении точки в направлении портала Р происходит мгновенный скачок при попадании в этот портал и точка сразу выходит из портала Р'. То же самое происходит и с лучами света.

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

При рендеринге такого портала строится преобразованная камера и осуществляется рендеринг сквозь портал (зеркало) при помощи преобразованной камеры.

Для поддержки подобных эффектов в класс Portal следует добавить ссылку на преобразование (объект класса Transform3D) и методы доступа к нему и его изменения.

Также определенные изменения необходимо ввести в метод renderPoly класса SubScene. Основная поддержка заключается в том, что для зеркал и порталов преобразованиями строится преобразованная камера и именно она используется для ренедеринга через портал (зеркало).

void SubScene "opengl6_159.html">⇐ Предыдущая| |Следующая ⇒