Шаг 9 - Все как в тумане (узел Fog)

Туман... Хороший эффект для повышения реальности, не правда ли ? Оказывается он есть в VRML и определяется следующим образом:

Fog { 
  exposedField SFColor  color            1 1 1      # [0,1]
  exposedField SFString fogType          "LINEAR"
  exposedField SFFloat  visibilityRange  0          # [0,)
  eventIn      SFBool   set_bind
  eventOut     SFBool   isBound
}

Здесь поле visibilityRange задает предел видимости в метрах, после которого изображение полностью пропадает в тумане. Для примера создадим мир из пяти кубов и попробуем добавить к нему туман:

#VRML V2.0 utf8

# берем куб из бибилиотеки прототипов
EXTERNPROTO BOX_NEW[
	field SFColor color
	field SFVec3f position
	field SFVec3f size
] "protolib.wrl#BOX_NEW"

Background {
	skyColor 1 1 1
}

# создаем виртуальную сцену
Group {
	children[
		BOX_NEW { color 1 0 0 }
		BOX_NEW { position 0 0 -10  color 1 0 0}
		BOX_NEW { position 0 0 -20 color 1 0 0}
		BOX_NEW { position 0 0 -30 color 1 0 0}
		BOX_NEW { position 0 0 -40 color 1 0 0}
	]
}

# добавляем туман
Fog {
  color            1 1 1
  visibilityRange  60
}

В результате изменения поля visibilityRange от 60 метров до 20 получаем такие вот картинки:

visibilityRange = 60 метров50 метров40 метров
 9_1.gif (821 b)9_2.gif (930 b)9_3.gif (849 b)
30 метров20 метров10 метров
9_4.gif (791 b)9_5.gif (613 b)9_6.gif (177 b)

Следующее поле color более интересное. Это поле задает цвет тумана. Что это значит ? Это значит, что все объекты, которые находятся "в тумане" рисуются этим цветом. Если объекты находятся чуть-чуть в тумане, то браузер использует меньше цвет тумана. Вообще проще продемонстрировать на примере:

color = 1 1 1 (белый)1 0 0 (красный)1 1 0 (желтый)
 9_3.gif (849 b)9_7.gif (795 b)9_8.gif (897 b)
0 1 0 (зеленый)0 1 1 (сиреневый)0 0 1 (синий)
9_9.gif (855 b)9_10.gif (855 b)9_11.gif (855 b)

Здесь четко видно, как браузер закрашивает объекты. Единственный и очень большой минус этого узла такой, что эффект тумана не влияет на фон, т.е. на то, что было задано с помощью узла Background (см. предыдущий шаг). Так как в примере мы использовали цвет фона белым, то и получили соответствующий эффект только когда туман белого цвета. Из-за этого правило - использовать цвет фона и тумана надо одинаковыми. При этом придется забыть в панораме, да впрочем какая может быть панорама, когда "собственных рук в тумане не видно" :)

Еще один параметр тумана fogType задает тип тумана. Типов тумана это функция, по которой высчитывается туман. Таких функций пока две: линейная - LINEAR и экспоненциальная - EXPONENTIAL. По умолчанию туман вырисовывается по линейному закону. Чтобы использовать экспоненциальный надо сделать так:

Fog {
  color            1 1 1
  fogType          "EXPONENTIAL"
  visibilityRange  50
}

К моему огромному сожалению, в VRML навеске, которая идет вместе с WIN98 в комплекте, тип тумана ни на что не влиял. Вообще говоря браузеров VRML достаточно много и точно также как и в HTML между ними существуют какие-то мелкие различия, проявляющиеся как раз во время отображения сцены. Связано это с тем, что для "рендеринга" применяются разные технологии, например, OpenGL или Direct3D.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.