Архив за Июль, 2007
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+нажатие — вогнуть
Загруженные с сервера домики
26.07.2007 Антон ВолковAlternativa3D All-in-one
26.07.2007 Антон ВолковУже видно, что концепция третьей версии 3D-движка позволяет сравнительно легко расширять и модифицировать систему. Как вариант, есть возможность сделать разные виды камеры — ортогональный/перспективный, с честной сортировкой/по средней глубине. Это внушает надежду на разнообразное применение нашего движка в других проектах.
Правильный шейдинг
26.07.2007 Антон ВолковПоняли, что вчерашняя формула квадратичного отражения света от объекта некорректна.
Поковырявшись, решили остановиться на функции нормального распределения (по Гауссу).
В результате остался один параметр — “бликовость”.
Предлагаю на оценку пару демок:
Управление:
- Пробел — добавить источник света
- Колесом мыши меняется степень “бликовости”
Блики у материалов
25.07.2007 Антон ВолковВосстанавливаем освещение
25.07.2007 Антон ВолковПервый 3D-контакт клиента с сервером
24.07.2007 Антон ВолковВчера вечером произошло знаменательное событие.
Через клиентскую часть был загружен и продемонстрирован первый треугольник.

Условия работы для “серверных” не выносимые — отключена админка в связи с затянувшейся переделкой GUI-библиотек.
Поэтому наполнять базу данных мира товарищам приходится вручную.
Надо отметить, что самый первый треугольник был загружен ещё месяц назад, но никакого развития не получилось в связи с разработкой Alternativa3D 3.0 и серьёзными изменениями в ядре.
Инверсные матрицы
24.07.2007 Антон ВолковВосстановили расчёт инверсных матриц.
Они нужны для обратного перевода из системы координат камеры в локальные координаты любого объекта.
В процессе тестов получилась симпатичная загигулина:
![]()
По нажатию на любую кнопку загигулина строится по новым параметрам.
Также можно попробовать загигулину с поворотом камеры
Оптимизация 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 }

