Art of Trampoline Fandango

¿dǝǝɥs ɔıɹʇɔǝlǝ ɟo ɯɐǝɹp spıoɹpuɐ op

Archive for the ‘Development’ Category

Correctly running simulation

После долгих мытарств связанных с различными особенностями поддержки мягких тел в библиотеке PhysX, я наконец-то сгенерировал вполне таки рабочую тетрахедру, которая описывает геометрические свойства нашего кабеля, проходящего через определенные точки в пространстве.

Вполне приемлемый результат:

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

Fixed normals

Только недавно заметил, что освещение в последнем видео не совсем правильное. Что-то не так было с массивом нормалей. Поискал в коде и нашел ошибку. Я просто тупо перепутал направление нормалей, когда считал их через вектора и вместо того, чтобы “торчать” наружу, нормали указывали внутрь 3d-mesh’a. Отсюда и такое нелепое освещение. Вот так выглядит “правильный” mesh c “правильным” массивом нормалей:

Fixed normals

Код переехал на Xatrix2

Переписал код на технический движок фирмы, для которой я пишу диплом. Переход был безболезненный, так как технологии используются одни и теже: DirectX и C#. Немного пришлось потыкаться с эффектом рендеринга (новая версия движка использует в основном шейдеры для отрисовки примитивов), но все быстро решилось. На видео пример того, как все это работает:

Cable mesh rendering. Here were used 50 randomized point.

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

3D mesh

Эти путевые заметки о работе над своим дипломом я пишу лично для себя. Лет этак пять назад, когда я попал на первую в своей жизни практику (это, кстати, была педагогическая практика), я очень сильно пожалел о том, что не вёл небольшой дневник, куда записывал бы все события/настроения/впечатления/результаты за прошедшие дни и недели. В конце практики, как полагается, надо было сдавать подробный отчет, а вот вспомнить и проанализировать каждое из сотни событий, случившихся за месяц практики, было невозможно.

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

За последнюю неделю дописал алгоритм “выдавливания” 2д окружности вдоль просчитанной кривой. Пришлось немного поискать по интернету, чтобы понять каким образом можно построить окружность в 3Д, имея перпендикуляр к плоскости окружности и её центр. Помог вот этот пост.

Немного больше, чем я ожидал, писал метод, который забивает под завязку массив indeces (те кто программировал 3д графику – поймут что это за массив). В итоге получилось, что финальный 3d-mesh, точнее его треугольники, лицом обращены задом наперед. Что давало возможность видеть внутренности кабели, в то время как внешняя сторона превращалась в невидимку. Дело в том, что я привык к OpenGL, в котором нумерация вершин треугольника (по-умолчанию) идет по ходу часовой стрелки, в то время как 3д-движок XNA по-умолчанию использует режим Cullmode с опцией CounterClockwise (против часовой стрелки). Вот и получались этакие уродства:

Wrong facing of triangles in mesh

Зеленые точки на рисунке, расположены внутри цилиндра и не должны быть видны наблюдателю

Далее можно посмотреть видео…

Retro screensaver

I am pretty sure, that everyone remembers the old screensaver "Starfield", which was a part of Windows9x. During weekends I tried to recreate this screensaver, using the XNA Framework.

Here is my version (deep-deep alpha) of how it looks:

System requirements as usual for XNA 3.1 based apps::

  • Must be running at least Windows XP Service Pack 2 (or higher).
  • Must have a video card that supports at least Shader Model 1.1.

Download binaries:
Starfield.scr

How to install:
Simply put *.scr file in your Windows directory (usually it is something like: “c:\Windows”) and use “Control Panel/Appearance and Personalization/Personalization/Change screensaver” dialog to set Starfield as default screensaver.

Don’t forget to install:
.NET Framework 3.5 Redistributable
XNA Framework Redistributable 3.1
in order to get it work!

Interpolation methods

Для симуляции кабелей на базе soft body model я буду использовать бесплатный физический движок PhysX, поддерживаемый разрабатываемый Nvidia (в свое время он сменил несколько названий: Novodex –> Ageia Physics –> Nvidia PhysX). Сама физическая модель мягких тел использует геометрию объекта состоящую из тетраэдров (простейшим примером может служить форма египетских пирамид), для того чтобы просчитать каким образом изменяется форма объекта под воздействием внешних сил (столкновения с другими объектами, гравитация и т. д.).

Для начала неплохо было бы просчитать и сгенерировать вершины и полгины для самого кабеля. С чего начать? Ну, во-первых, на начальном этапе мы всегда знаем точки в пространстве, за которые будет подвешен кабель, и точки в пространстве через которые этот кабель будет проходить (“уворачиваясь” от препятствий на пути: всяческих труб и т. д.). То есть у нас всегда есть набор “контрольных точек”, которые описывают форму кабеля. Далее нам следует получить некоторую кривую, которая опишет как этот наш кабель располагается в пространстве. Мы конечно можем просчитать эту кривую простейшим методом линейной интерполяции, но тогда форма кривой будет грубой, “квадратной”, что совсем нас не устраивает.

Если немного поискать в интернетах, то очень быстро отыщется термин сплайны. :) Вот его то мы и будем использовать при интерполяции наших контрольных точек. В этом случае получится очень гладкая и изящная кривая, – как раз то, что нам нужно для создания mesh для кабеля.

Вот, как это примерно выглядит:

Это то, чем я занимаюсь на данный момент. В следующий раз я расскажу о процессе “выдавливания” профиля вдоль полученной кривой. Таким образом мы получим mesh кабеля с заданным диаметром.

PS: Рабочие бинарники можно скачать тут (у вас должен быть установлен .Net 3.5 и XNA 3.1 frameworks)