информационно-развлекательный портал о графике и дизайне
Скачать фотошоп (актуальная и старые версии)
Рыбный косяк «управление толпой»

Последние несколько лет мы видели симуляторы толпы в нескольких инструментах, документации и ТВ-сериях. Здесь мы собираемся создать наш собственный симулятор толпы и реализовать симулятор подводного косяка рыб.

Мы собираемся использовать частицы, однако попытка получить гладкое движение, когда есть так много частиц для расчета, может привести к странным движениям, проблемам пересечений и острой зависимости членов толпы, если не предпринять серьезных мер против этого. Т.о. мы собираемся использовать систему толпы  3ds max-а включенную в Character Studio. Используя готовые модели, мы установим начальные характеристики – как они вращаются, ускоряются, максимальную скорость, свойства крена (и т.д.) перед размножением ее на множество особей. Далее мы добавим дополнительные характеристики нашей модели – что случится в некоторых событиях, когда они соприкасаются с другим объектом, какое их главное место назначения, перед попыткой  начального теста симуляции и будем добавлять характеристики по мере необходимости. Далее мы введем готовую модель рыбы, которая имеет основное состояние анимации. Эту анимацию толпа будет использовать как шаблон в зависимости от индивидуальных движений особи – это устанавливается в Синтезаторе (Synthesis) движений, который использует блоки управления для указания желательного диапазона кадров анимации анимируемого объекта для специфичной манеры поведения. Окончательно мы установим освещение сцены и эффекты окружения перед тем как добавить камеру.

В зависимости от числа особей, которые мы решим ввести в этом уроке, просчет может занять разное время, так что если Вы решите симулировать косяк с сотнями и сотнями рыб, Вам, возможно, придется запускать симулятор на всю ночь,  или поделать что-нибудь еще – помыть машину, повязать в конце концов. Будьте осторожны – каждая добавляемая симуляция отнимает некоторый кусок времени при расчетах, удлиняет расчеты, так что если Вы собираетесь запустить тяжелую сцену, рекомендуется сохранить ее, сбросить или повторно запустить 3ds max и затем запустить симуляцию.

Откройте стартовую сцену, включенную в прилагаемый zip файл. Согласитесь с любыми изменениями единиц измерения (если спросит). Здесь мы имеем базовую сцену с рыбой, которую мы собираемся использовать с некоторой начальной анимацией уже настроенной – выберите объект "mackerel anim source” (Исходник анимированной макрели), перейдите на панель времени (Timebar) и настройте ее на 300 кадров.

Если вы посмотрите на панель модификаторов, Вы увидите, что анимация создана с использованием нескольких модификаторов. Начиная снизу (с основной модели рыбы), далее модификатор Выбор объема (Volume Select), который дает мягкий выбор, так что сила любого модификатора, который мы применим впоследствии, уменьшается по длине модели.

Первое установленное состояние анимации – движении плавания, после начального «спурта» (без назначенной анимации). Это важно как мы назначим этот стационарный период к системе анимации позднее. После начального цикла плавания генерируется фазой модификатора Волна (Wave), есть два добавочных цикла поворота, применение которых Вы можете впоследствии ввести в систему, если захотите.

Чтобы получить косяк движущийся в сцене, мы собираемся создать объект, за которым рыбы будут пытаться следовать. Движение этого объекта будет гладким, но случайным, так мы генерируем его используя контроллер позиции Шум (Noise) и установим его параметры соответственно. В окне Сверху создайте Геосферу (Geosphere) с радиусом 100 и назовите ее "School Follow” (Косяк следует).

С выделенным объектом геосферы нажмите правой кнопкой в окне просмотра и выберите Редактор кривых (Curve Editor) в Quad меню. Далее мы заменим существующий контроллер положения этого объекта контроллером, генерирующим случайный шум, так чтобы объект плавно двигался по сцене. В редакторе кривых выделите контроллер положения (Position) нажмите правой кнопкой и выберите Назначить контроллер (Assign Controller). Выберите Шумовую позицию (Noise Position) из списка и нажмите OK.

Позиция геосферы теперь управляется шумовым контроллером, так что он немедленно переместится. Подвигайте ползунок анимации. Заметьте, что движения объекта слишком случайны, так что нам нужно сделать их более плавными. Установите силу (Strength) по осям X, Y и Z в 2000 для увеличения диапазона движения, исправьте Частоту (Frequency) на 0.01 для увеличения длины волны и выключите фрактальность шума (Fractal Noise) для плавности.

Система толпы рассчитывает анимацию, используя невизуализируемый вспомогательный объект, называемый Делегат (Delegates). Наш визуализируемый объект – рыба привязывается к этому объекту позднее. Тут мы устанавливаем наш простой начальный делегат, и назначаем ему свойства, которые говорят как он будет двигаться, вращаться и т.д. В окне сверху создайте вспомогательный объект Delegate с шириной (Width) 17, Глубиной (Depth) 25 и Высотой (Height) 17. Назовите его Delegate_Fish01

Выключите привязку (Constrain ) к плоскости XY, так чтобы он мог двигаться по всем трем осям. В свитке параметров движения (Motion Parameters) установите среднюю скорость (Average Speed) на 20 для ускорения движения. Установите торможение (Decel Weight) в 0.1 (угол поворота) так чтобы он сильно не замедлялся при поворотах. Установите углы наклона и спада (Incline и Decline) в 10  так мы получим пренебрежимо малое замедление при поворотах делегата вниз и вверх.

В группе времени установите максимальную скорость поворота (Max Turn Velocity) в 60, что определяет, на сколько максимально градусов делегат может повернуться за один кадр. Как мы делали для рыбы, которая может повернуться очень быстро, здесь тоже установлено высокое значение. Установите максимальное ускорение поворота (Max Turn Accel)в 10 так мы сможем иметь резкое ускорение поворота. Установите максимальный наклон и максимальный спад (Max Incline и Max Decline) в 30 так как рыбы не могут поворачиваться вверх/вниз так же быстро, как в стороны.

В группе крена (Banking) установите максимальный крен (Max Bank) в 10 так чтобы рыбы не кувыркались при поворотах. Поискав в инете шаблонные материалы, мы заметим, что большинство рыб имеют тенденцию оставаться в  вертикальном положении, исключая очень высокие скорости. Т.о. мы хотим, чтобы наши рыбы оставались насколько возможно вертикальны, т.о. уменьшайте это значение осторожно.

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

Теперь, когда мы имеем установленные начальные свойства нашего делегата, мы распределим маленькое число их по сцене для тестирования нашей симуляции. В окне сверху создайте геосферу в точке 0,0,0 с радиусом 500 и назовите ее "Delegate Distribution”. Добавьте модификатор шум и установите его силу по осям X, Y и Z в 500.

Перед тем как мы начнем устанавливать свойства поведения, мы сначала разбросаем небольшое число делегатов над объектом распределения. В окне сверху создадим вспомогательный объект толпы (Crowd). Нажмем кнопку Разбросать (Scatter) и в всплывающей панели добавим объект Delegate_Fish01 в поле объекта клонирования. Установим число объектов на 49 и выключим контроллер клона так, чтобы люая анимация тоже клонировалась. Нажмем Генерировать клоны (Generate Clones).

 

На закладке Позиция (Position) выделим по поверхности (On Surface) и добавим объект Delegate Distribution в поле Grid/Box/Sphere/Surface/Shape. Для подстраховки что разбросанные объекты не пересекаются введем значение пространства (Spacing) 1.5 и нажмем на Генерировать положение (Generate Locations). На закладке Поворота (Rotation) установим в сторону (Sideways) и значение девиации вверх/вниз (Up/Down Deviation) в 180 для того чтобы разбросанные делегаты ориентировались случайно по целевому объекту. Нажмем Генерировать ориентацию (Generate Orientations) и ОК.

Поведение
Далее мы добавим установки главного поведения для нашей системы толпы. Нам нужно три главных поведенческих события – Поиск цели: для нахождения движущейся геосферы, Поиск косяка: для нахождения основной массы косяка и Отклонения косяка: для предотвращения соударения делегатов друг о друга. В добавление к этому мы введем добавочное поведение которое руководится пространственной деформацией Ветра (Wind) для того чтобы на рыб воздействовала зыбь океана. Мы пока работаем с уменьшенным числом делегатов, чтобы уменьшить время расчетов, т.к. увеличение числа делегатов на этой стадии не влияет на тесты, которые мы будем проводить.

Нажмите кнопку Новый (New) и выберите Искать поведение (Seek Behavior). Отредактируйте имя - "Seek Target” (Поиск цели). В свитке нового поведения нажмите кнопку Нет (None) и выберите объект Следования косяка (School Follow). Установите метод Насильно (Force) для постоянного притяжения к цели. Добавьте еще одно поведение поиска. Переименуйте в Поиск косяка (Seek School), выберите кнопку множественного выбора (Multiple Selection) и выберите все вспомогательные Delegate_Fish. Выберите Усреднение цели (Average Targets) для нахождения центра всего списка делегатов.

Добавьте поведения уклонения и назовите его Уклонение от косяка (Avoid School). Нажмите кнопку множественного выбора и выберите все вспомогательные объекты Delegate_Fish. Установите значение Смотреть вперед (Look Ahead) в 150 так что делегаты будут заранее избегать столкновений, вместо того чтобы в последний момент останавливаться и ждать. Установите угол обхода в 90 так что делегаты не будут поворачиваться назад в попытках найти путь уклонения от столкновений и силу торможения (Brake Pressure) в 0.5 так что делегаты будут больше пытаться найти другой маршрут, а не затормозить.

В группе отталкивания (Repel) установите Силу в 0.5 для увеличения сил отталкивания которые действуют на делегаты в непосредственной близости друг от друга. Установите радиус и спад (Radius и Falloff) в 10, так что даже хотя мы имеет большой размер радиуса, силы отталкивания сильнее к делегатам, чем к внешним границам.

Добавьте пространственную деформацию ветра к сцене в окне сверху. Установите Силу в 0, так что не будет выделенного напрвления, уменьшите турбулентность (Turbulence) до 0.5 и установите масштаб (Scale) в 0.001 для больших волн турбулентности. Окончательно добавьте Поведение пространственной деформации к толпе и сам Ветер к этому поведению.

Теперь мы имеем все установки нашего поведения, и нам нужно назначить их к нашим делегатам и смешать их как необходимо. Нажмите кнопку Назначение поведения (Behaviour Assignments) и в появившейся панели создайте Новую команду (New Team) и добавьте все делегаты к ней. Назовите ее "Fish School” (косяк рыб). Это делает управление множественными делегатами с одинаковыми свойствами легче для назначения поведений.

Когда команда создана она будет добавлена в список команд. Выделите команду косяка рыб и в списке поведений выделите все четыре поведения и нажмите кнопку Новое назначение (New Assignment) для добавления их к списку назначенных поведений для взвешивания. Мы хотим чтобы пространственный деформатор действовал на все делегаты, так что оставим у него вес в 1.

Следующий в порядке предпочтения – нахождение цели, так что установим у него вес 0,75, а у поиска косяка 0,5. Понятно, что если косяк уклонился от хищника, тогда веса меняются, при этом поиск косяка имеет наивысшее значение. Нажмите ОК для установки этих значений. Далее можно запустить симуляцию, но сначала нам нужно наладить одну-две установки.

В свитке Решений (Solve) исправьте установку Конец решения (End Solve) на длину нашей анимации – т.е. 300 кадров. Если мы произведем тест множественной симуляции, он всегда верно удаляет ключи перед решением, так что разрешим это. Т.к. нам не нужен каждый одиночный ключевой кадр, исправим установку Сохранения позиции и поворота каждый N-й кадр на 2, сохраним сцену и затем нажмем Решить (Solve), и подождем несколько минут расчета.

Теперь мы можем вернуться назад и добавить больше делегатов, но для этого рекомендуется отделить все имеющиеся делегаты от Delegate_Fish01 и получить клоны других 199 так же как прежде, снова их разбросать, позиционировать, ориентировать, назначить поведения и объединить в команду прежде назначения поведения. Это может занять некоторое время, но, подобно частицам, мы ВСЕГДА тестируем симуляцию с уменьшенным их числом. С новыми установленными делегатами снова запускаем симуляцию. Это может отнять некоторое время.

С новыми делегатами созданными и запущенной симуляцией со всеми 200 делегатами мы можем теперь назначить модель делегатам. Для этого мы возвращаемся назад на этап разбрасывания для создания клонов перед ориентированием и привязыванием их к делегатам, используя Object/Delegate Associations которые привязывают модель к делегату, так что свойства анимации могут быть произведены от них позднее.

Скройте объекты Delegate Distribution и School Follow, т.к. мы больше не нуждаемся в них. В свитке свойств толпы выберите Разброс (Scatter) и выберите объект для клонирования (Object to Clone) - "Mackerel Anim Source”. Установите число копий 200 т.к. оригинальный объект нам еще понадобится. Нажмите кнопку Генерировать клоны.

Т.к. рыба слишком большая на нужно масштабировать ее до 2% от оригинального размера. Переходим на закладку Масштаб (Scale) и вводим значение 0.02 (1.0 это 100%) по осям X, Y и Z в поля масштаба и нажимаем Генерировать масштаб (Generate Scales). Вы заметите что оригинальная модель рыбы тоже масштабировалась – это нормально. Нажимаем ОК для выхода из панели. Не беспокойтесь, что рыба не привязана к делегатам – мы будем делать это далее.

Теперь нам нужно назначить объект макрели соответствующему делегату. Нажимаем кнопку Ассоциации Объект/Делегат (Object/Delegate Associations). На панели нажимаем кнопку Добавить список объектов (Objects list Add) и добавляем в объекты "Mackerel Anim Source01” #200, НО НЕ главный объект макрели, т.к. он нам будет нужен для шаблона анимации позднее.

Добавим все делегаты к списку делегатов. Выключим Выравнивание масштаба (Align Scale) т.к. мы не хотим чтобы объекты унаследовали масштаб делегатов (который 100% - т.е. мы могли бы получить множество огромных рыб!), нажмем на выровнять объекты по делегатам (Align Objects with Delegates) для позиционирования и Привязка объектов к делегатам (Link Objects to Delegates) для связывания соответствующей модели делегатам (что отображается в списках Объекты и Делегаты). Нажимаем ОК.

Подвигаем указатель кадра анимации, чтобы убедиться, что все 200 не анимированных рыб привязаны к делегатам и что одна исходная рыба анимирована, но не привязана в середине сцены. Теперь нам нужно сделать ссылку на часть анимации исходного объекта для каждой анимируемой рыбы, так чтобы они соответственно вели себя при ускорении, плавании и т.д.

В свойствах толпы нажмите на кнопку Новый в свитке Контроллеры глобальных привязок (Global Clip Controllers). Выделите объект Mackerel Anim Source и нажмите OK для добавления его к списку контроллеров. Подсветите его и нажмите Редактировать (Edit) для установки параметров. Нажмите кнопку Новый в группе Глобальных объектов (Global Object) и переименуйте его в Ускорение (Accelerate). Установите Старт в 5 и к Конец в 15 (это секция плавания исходного объекта).

Для симуляции постоянной скорости нам нужно добавить другое состояние анимации. Снова нажмите кнопку Новый и переименуйте в Постоянный (Constant). Установите Старт в 0 и Конец в 4 (это не анимированная секция в исходной модели). Здесь рыба просто скользит в воде используя существующий момент движения.

В добавление к этому нам нужно добавить случайные удары хвоста для поддержания движения. Нажимаем Новый, именуем Прогулка (Cruise). Устанавливаем Старт в 5 и Конец в 15 как в Привязке ускорения движения. Далее нам нужно установить параметры, которые будут вызываться в этом состоянии анимации когда будет какое-либо событие движения.

Перейдите на закладку Состояния (State) и нажмите кнопку Новый. Переименуйте Состояние синтеза (Synthesis State) на Ускорение (Accelerate) и нажмите кнопку Добавить привязку для выбора Accelerate Motion Clip как шаблона. Мы хотим чтобы анимация плавно переходила к середине цикла плавания, мы установим Процент начала анимации (Animation Start Percent) в 50 – т.е. полпути цикла.

Нажимаем на кнопку редактирования состояния для вывода доппанели. Переходим на закладку Accelerate и разрешаем ускорение (Use Acceleration). Включаем уникальное (unique) и в обоих половинах выбираем Увеличение (Increasing) для увеличения значения. Разрешаем Масштаб скорости проигрывания (Scale Playback Speed) и устанавливаем Процент (Percentage) в 300, что будет проигрывать цикл плавания исходной рыбы в 300 раз быстрее для быстрого ускорения. Нажимаем Выход (Exit) чтобы закрыть панель.

Далее нам нужно установить привязку Constant и Cruise, которые будет вызываться случайно (благодаря равным весам) через одно Состояние синтеза. Нажимаем Новый и переименовываем в (Constant & Cruise). Устанавливаем процент начала анимации (Animation Start Percent) в 50 как и прежде. Нажимаем Добавить привязку и выбираем обе привязки Constant и Cruise . Нажимаем ОК для подтверждения.

Нажимаем кнопку Редактирования свойств (Edit Properties) и в открывшейся панели разрешаем Использование скорости (Use Speed) на панели скорости. Разрешаем масштаб скорости проигрывания и устанавливаем Базовую скорость (Base Speed) в 3, что говорит системе, что скорость оригинального цикла анимации будет проигрываться при скорости движения делегатов 3, масштаб скорости цикла анимации ускоряется и замедляется соответственно если скорость движения не равна Базовой скорости. Нажимаем Exit.

Последняя стадия установок толпы – сказать системе какие объекты будут воздействовать на синтез и как мы будем смешивать состояния анимации вместе (продолжительность). Нажмите на закладке Синтез (Synthesis), нажмите на кнопку Новый мастер привязки движения (New Master Motion Clip)  и добавьте все объекты Mackerel Anim Source от 1 до 200 (это может занять время).

Т.к. нам нужны быстрые изменения в состоянии анимации, нам нужно установить короткие переходы от одной привязки к другой. Т.о. проходим по спискам Привязок От и Привязок К (From Clip и To Clip) для каждой комбинации и устанавливаем каждый Старт смеси (Blend Start) в 2. Окончательно нажимаем на кнопку Синтезировать все (Synthesize All) для применения синтеза ко всем объектам.  Выводим превью анимации в окне Перспективы для просмотра результата.

Освещение и окружение
Освещение в сцене кажется совершенно преждевременным, однако есть несколько факторов, которые нужно принимать во внимание.
Первое: главное освещение (солнце) испускает объемные лучи через воду, которая взаимодействует с нашим косяком рыб.
Второе: изломанные поверхности генерируют множество зеркальных бликов, так что мы имеем большое число зеркального света над косяком. Окончательно мы имеем добавочные светильники для иллюстрации разбросанного обтекающего освещения от отдельных частей воды. В финальной сцене в zip файле эти светильники не дают теней для сохранения времени визуализации, но они могут быть включены для улучшения эффекта.

В окне сверху создайте светильник Free Direct в точке 0,0,0 и назовите его Volumetric Rays (Объемные лучи). Передвиньте его вверх на 10000 единиц в окне спереди. Разрешите карты теней (Shadow Maps) так чтобы рыбы отбрасывали тени на объем. Для управления спада объемных лучей разрешите Использование дальнего ослабления(Use Far Attenuation) и установите значение Конца в 12000 чтобы получить большой спад.

В свитке параметров направления (Directional Parameters) установите Горячая точка/Излучатель (Hotspot/Beam) в 865 а Спад/Поле (Falloff/Field) в 5000 – свет будет затухать между этими двумя значениями (с добавочным управление в карте проектора (Projector map). Разверните свиток Добавочных эффектов (Advanced Effects) и установите ссылку на карту "Rays Projector” смеси из редактора материалов на слот проектора. Т.к. мы имеем большую область для покрытия, нам нужна относительно большая карта теней…

…Разверните свиток Параметров карты теней (Shadow Map Params) и установите наклон (Bias) в 0.01 для того чтобы тени были более близко к объекту, отбрасывающему ее. Установите размер в 1024 и диапазон выборок (Sample Range) в 16 для мягкого размытия теней. Разверните свиток Атмосфера и эффекты (и нажимте кнопку Добавить для добавления эффекта объемного света. Выберите его из списка и нажмите на Установить (Setup). Разрешите Exponential.

Далее мы создадим большую оснастку зеркального освещения для симуляции отражения света от поверхности воды. Создадим светильник Target Direct в точке 0,10000,0 в окне сверху а цель его в центр. Клонируем светильник (instance) поворотом на 90 градусов (в 10000,0,0) и еще два раза для создания четырех светильников светящих внутрь. Выберем все четыре светильника (не их цели) и клонируем поворотом на 45 градусов для получения массива из 8 светильников (см. рисунок).

Выберем все 8 светильников (не цели) и передвинем их по вертикали в окне слева. Клонируем их еще раз и позиционируем как на рисунке. Разрешаем Карту теней (Shadow Maps), устанавливаем множитель (Multplier) в 0.25 и цвет светильника в RGB 184,198,208. Разрешим Превышение (Overshoot) и установим Спад/Поле (Falloff/Field) в 2000. Установим наклон карты теней (Bias) в 0.01, Размер (Size) в 256 для уменьшения времени визуализации, и Диапазон выборок (Sample Range) в 8 для размытия теней.

Далее нам нужно симулировать тонкий окружающий свет испускаемый из глубины воды. Создадим кольцо светильников, отбрасывающих тени как прежде, на этот раз под косяком, как показано на рисунке, пометив начальный светильник Deep Water Illumination 01 (Освещение глубокой воды). Установим множитель в 0.25 и цвет в RGB 58,77,89. Спад/Поле в 2000, и включим Превышение. Скопируем цвет светильника в цвет Фона окружения (Environment Background) как показано.

Сейчас выключим зеркальное отражение (Specular) в свитке Расширенных эффектов (Advanced Effects) светильника т.к. мы не хотим добавочного зеркального освещения на нижней стороне рыбы, мы просто хотим некоторое добавочное окрашивание диффузным светом. Разверните свиток Параметров карты теней (Shadow Map Params) и установим параметры как для предыдущего массива светильников (если они уже не введены).

 

Объемное освещение
Для симуляции лучей которые проходят через воду в финальной сцене мы используем Объемный свет (Volumetric Lighting). Для симуляции движения поверхности мы сделаем вложенное дерево карт, управляемое картой Градиента (Gradient Ramp) так мы будем иметь больше возможностей управления спадом света с расстоянием от камеры. В этой карте есть добавочные карты, которые управляют анимацией лучей для симуляции анимированной поверхности – две карты Дыма (Smoke) разных размеров и разных углов, которые имеют их Фазы (Phase) анимированные, что симулирует различные перекрещивания волн. Заметьте, что объемный свет имеет неблагоприятное воздействие на время визуализации, особенно если качество завышено а разбрасываемые тени используются скупо.

Используя окно Перспективы, позиционируйте угол обзора так, чтобы мы лучше видели плавающий косяк вокруг нас. Далее нажимаем CTRL+C для создания камеры из вида. Для симуляции глубины добавим эффект окружения Туман (Fog) над эффектом объемного света, установим его цвет такой, как у цвета окружения, разрешим Exponential. Окончательно разрешим Ограничение показа окружения (Show Environment Ranges) в камере и установим дальний предел (Far Range ) в 5000 для управления глубиной тумана.

Финальная анимация сцены
В финальной сцене в zip файле камера была анимирована несколькими путями для получения прекрасного реалистичного подводного движения. Сначала нам нужно создать эффект симуляции движения камеры под океанской зыбью. Это производится привязкой обоих компонентов камеры (камеры и цели камеры) к Dummy объекту, который анимирован используя тонкий (уникальный) контроллер Шума позиции (Position Noise). Далее цель камеры вручную анимируется для следования рыбы вокруг окружения, в то время как камера управляется только Dummy объектом. Добавочные элементы нужно ввести в сцену для того чтобы сцена приобрела выразительность движения, а именно систему частиц (ParticleFlow) так, чтобы эти частицы двигались мимо FOV (поле зрения) камеры и были анимированы Dummy объектом.

Наша сцена очень убедительна, однако есть несколько вещей, которые могут быть добавлены для достижения следующего уровня. Т.к. некоторые из рыб вертятся быстро, нам нужно ввести анимацию поворота в исходный анимированный объект синтеза. Также попытаться вернуться назад к симуляции делегатов и добавить несколько хищников, которые «пасут» рыб в тесном клубке или заставить преследовать массу маленьких рыб в безумной кормежке! Окончательно добавить к сцене мусор так, чтобы мы чувствовали движение через воду при перемещении камеры. Если Вы чувствуете, что это отнимает слишком много времени при визуализации, попытайтесь уменьшить качество объемного света или запретить тени.

Используются технологии uCoz