Архив за Июль, 2007

Z-слои в честной сортировке

28.07.2007 Антон Волков

Честная Z-сортировка распределяет полигоны по слоям, по сути выполняя работу дизайнера в Photoshop/Flash.

Слои в Z-сортировке

3D-интерактивность и скульпт-демо

27.07.2007 Антон Волков

Месяца полтора назад ещё в 3D-движке 2-й версии мы делали механизм интерактивного взаимодействия с 3D-объектами. Самым простым решением было бы переводить MouseEvent в 3D-пространство. Однако, оказалось, что при сравнительно большом количестве полигонов (уже при 1000) система событий Flash начинает ощутимо тормозить при любом сдвиге мыши. Дело в том, что MouseEvent’ы достаточно универсальны и потому медленны, ведь надо событие пробублить (отправить от источника к сцене через всех родителей), да ещё не забыть посчитать координаты мыши относительно каждого объекта.

В итоге решили отказаться от mouseEnabled полигонов, ловить мышиные события с хит-области камеры, а дальше через getObjectsUnderPoint ловить попавшие в точку полигоны и далее делать обработку. Тогда мы это успешно реализовали и даже сделали свой 3D-бублинг, когда каждый клик проходил через грани, 3D-объекты и т.п. вполть до камеры.
К сожалению, отработка MOUSE_MOVE и, соответственно OVER и OUT оказалась медлительной.

В новой третьей версии благодаря наличию математической модели содержимого камеры мы смогли сделать систему интерактивности полностью на математических расчётах. Благодаря нюансам и всяческим оптимизациям удалось даже легко отрабатывать и MOVE, и OUT и OVER, в том числе пообъектно. От 3D-бублинга мы отказались, т.к. он для наших нужд не пригодился. Если что - легко добавить.

В качестве эксперимента небольшие кривоватенькие демки скульпт-редактора:

  • Space+мышь — повороты камеры
  • Нажатие на объект — выгнуть грани
  • Ctrl+нажатие — вогнуть

2007-07-27_195316.jpg 2007-07-27_195503.jpg 2007-07-27_195231.jpg

Загруженные с сервера домики

26.07.2007 Антон Волков

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

2007-07-25_170409.jpg 2007-07-25_164851.jpg

Alternativa3D All-in-one

26.07.2007 Антон Волков

Уже видно, что концепция третьей версии 3D-движка позволяет сравнительно легко расширять и модифицировать систему. Как вариант, есть возможность сделать разные виды камеры — ортогональный/перспективный, с честной сортировкой/по средней глубине. Это внушает надежду на разнообразное применение нашего движка в других проектах.

Правильный шейдинг

26.07.2007 Антон Волков

Поняли, что вчерашняя формула квадратичного отражения света от объекта некорректна.
Поковырявшись, решили остановиться на функции нормального распределения (по Гауссу).
В результате остался один параметр — “бликовость”.

Предлагаю на оценку пару демок:

2007-07-26_132437.jpg 2007-07-26_132709.jpg

Управление:

  • Пробел — добавить источник света
  • Колесом мыши меняется степень “бликовости”

Блики у материалов

25.07.2007 Антон Волков

Сделали несколько оптимизаций расчёта освещения.
В результате появилась возможность менять параметры блика материала.

Две демки:
2007-07-25_223924.jpg 2007-07-25_221934.jpg

  • Пробел — добавить источник света
  • Колёсико — менять размер блика
  • Ctrl+Колёсико — менять силу блика

Восстанавливаем освещение

25.07.2007 Антон Волков

Пока без оптимизаций, но главное — всё очень гладко легло на новую концепцию движка.

2007-07-25_203858.jpg

Первый 3D-контакт клиента с сервером

24.07.2007 Антон Волков

Вчера вечером произошло знаменательное событие.
Через клиентскую часть был загружен и продемонстрирован первый треугольник.
2007-07-24_084051.jpg

Условия работы для “серверных” не выносимые — отключена админка в связи с затянувшейся переделкой GUI-библиотек.
Поэтому наполнять базу данных мира товарищам приходится вручную.

Надо отметить, что самый первый треугольник был загружен ещё месяц назад, но никакого развития не получилось в связи с разработкой Alternativa3D 3.0 и серьёзными изменениями в ядре.

Вот, что видно в консоли:
2007-07-24_084252.jpg

Инверсные матрицы

24.07.2007 Антон Волков

Восстановили расчёт инверсных матриц.
Они нужны для обратного перевода из системы координат камеры в локальные координаты любого объекта.

В процессе тестов получилась симпатичная загигулина:
2007-07-24_143604.jpg

По нажатию на любую кнопку загигулина строится по новым параметрам.

Также можно попробовать загигулину с поворотом камеры

Оптимизация Flash на низком уровне

23.07.2007 Антон Волков

Думаю, что принципиальная возможность есть. Но, честно говоря, пока в процессе разработки влазить в это смысла нет. Когда 3D-движок доведём хотя бы до готовности 90%, тогда решим. Хорошо будет сделать низкоуровневую оптимизацию для честной Z-сортировки.

Можно поиграться с простеньким декомпилятором. Возможно, это наведёт на мысли по оптимизации исходного кода.

Например, метод переноса матрицы выглядит на Flash-ассемблере так:

function translate(Number, Number, Number):void { /* disp_id 0*/
  // local_count=4 max_scope=1 max_stack=3 code_len=36
  0     getlocal0
  1     pushscope
  2     findproperty  	d
  5     getlex        	d
  8     getlocal1
  9     add
  10    initproperty  	d
  13    findproperty  	h
  16    getlex        	h
  19    getlocal2
  20    add
  21    initproperty  	h
  24    findproperty  	l
  27    getlex        	l
  30    getlocal3
  31    add
  32    initproperty  	l
  35    returnvoid
}