Art of Trampoline Fandango

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

Correctly running simulation

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

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

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

Трудности перевода

Всегда завидовал людям, чьё имя имеет аналог в английском, а еще лучше норвежском языке. Вот у моей сестры, например, — Ольга. И всем все понятно. Никто ни разу не ошибался пытаясь произнести его. :( ) Миху часто превращают в Майкла (Michael) на английский манер, Арину время от времени называют Аиной (Aina), Юля превращается в Джулию (Julia), Алексей в Алекса (Alex), а вот я становлюсь греком: Диметро, так звали меня итальянцы, которым это было ближе, чем русское Дмитрий.

Теперь при знакомстве я представляюсь Димитрий. Так проще. Мне не приходится привыкать к новому имени, которое наверняка изобретут, а моим новым знакомым легче произнести первый слог имени, чем, ломая язык, пытаться выговорить две непривычные согласные в самом начале слова.

PS: Поначалу удивлялся как, всем известные имена John (Джон) и Jessica (Джессика) преобразились в норвежской речи в Йун и Йессика. Но больше всего впечатлила трансформация имени Jesus (Иисус) в испанском языке в Хесус (да, “j” произносится как “х”, таковы языковые правила).

Путешествуя, будьте готовы к тому, что ваше имя может звучать иначе, чем на родине. :)

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)

Обновления от Microsoft

Visual-Studio-2010-Ultimate

Если, кто еще не в курсе, то спешу уведомить: “Уже давненько (пару-тройку недель назад) вышел официальный релиз Visual Studio 2010.”

Вот тут можно почитать о нововведения на русском, а также статья на Хабре о новинке.

Daily comic strip

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

Раньше я никогда не читал газет. Нет, не потому что я не умею или не люблю читать. Просто я предпочитаю хорошие книги ежедневному чтению газетных заголовков. Но, видимо, чужой пример заразителен и я все чаще стал просматривать последние новости, когда под руку попадает свежая газета. Наверное, тому виной Аринка, она частенько прихватывает с собой по пути домой свежую газету :) . Всё-таки, если постоянно живешь и работаешь в другой стране, то постепенно перенимаешь чужие привычки и традиции.

Но речь не об этом. Почти у каждой газеты есть свой развлекательный уголок, в котором публикуют кроссворды, анекдоты и тому подобное. Все эти вещи на любителя. Я не разгадываю кроссворды или пытаюсь отыскать десять различий между двумя картинками. Я смотрю комиксы. Да-да, ежедневный стрип с приглянувшимися героями.

Вот о некоторых из них я и расскажу.

Pondus

pondus Очень популярный комикс в Норвегии. Основные темы: отношения между людьми, спорт, отдых. Как раз то, что так интересно среднестатистическому норвежцу, да и русскому тоже :)

Ссылка на официальный сайт (на норвежском)
Ссылка на Dagbladet (стрипы на норвежском)

Nemi

nemi Второй по популярности комикс в Норвегии (Неми Монтоя уступает по популярности только Pondus’у)-
Это веселый и местами очень смешной комикс, рассказывающий о похождения готичной девушки и её друзей. О её отношении к шоколаду, сексу и алкогольным напиткам.

Ссылка на официальный сайт
Ссылка на русское сообщество (с переводами)
Ссылка на Dagbladet (стрипы на норвежском)

Wulffmorgenthaler

6af505e0ffa54b48baf0bc0e068610d0 Абсолютно не политкорректный, частенько пошлый комикс. Черный юмор повсюду. Никаких границ и правил. Возможно именно поэтому он так популярен в Швеции, Норвегии и России.

Ссылка на официальный сайт
Ссылка на русское сообщество в ЖЖ (с переводами)

 

PS: Да я знаю, что есть еще куча интересных комиксов, но это, на мой взгляд, лучшие :)

Old church

In almost any city in Europe there is an old church. The doors are always open. Anyone can go inside and look at the interiors. We always do so:

An old church somewhere in the center of Bruxelles