среда, декабря 31, 2008

Лучшее за 2008 год

Согласно старой традиции, я публикую список наиболее популярных постов за 2008 год. В этом году я постила сильно меньше чем в предыдущих - сказался выход на работу на полный рабочий день. Тем не менее аудитория росла стремительными темпами в течение всего года. В перечислении этого года будет немного другая разбивка по категориям, потому что было много постов с тегом gamedev и его нельзя уже игнорировать (по общему количеству статей он даже опередил тег fun!).


C++

Возможно, самый важный const - просто ссылка на один из постов Герба Саттера оказалась неожиданно популярной. Рассказ про RVO и NRVO также был популярен, но тут уже никаких неожиданностей.

Программирование
Система контроля версий, багтрак и wiki - самый популярный пост этого года.
Пост Get that job at Google - эта ссылка сопровождалась логической задачкой, а потому вызвала шквал комментариев с правильными ответами, комментариев же с неправильными ответами было ещё больше.
Архитектура Skype - факт наличия в P2P сетях супернодов, через которых идет чей-то чужой трафик, для многих явился огорчительной неожиданностью.


Fun
BigDog, март 2008 - ролик про BigDog'а вообще популярен в Интернете. Как и
Большой адронный рэп
:-)

Gamedev
Много было постов в этой категории, очень они были объемные. Но популярностью, довольно слабенькой надо сказать, пользовался только Завершился Intel Game Demo Contest 2008.



Me

Впечатления от ведения блога понравились не только программистам.

Лучшее из старого
Тут практически без изменений с прошлого года.
Хорошие книги по С++ для начинающих, .kkrieger и Теория отрисовки графов устойчиво популярны.


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

В планах много новых постов по С++, тем более, что вот-вот должен выйти новый Стандарт. А также ждём выход Larrabee в 2010, то есть в 2009 публикаций об этой технологии будет всё больше. Скучно не будет :-).

С Новым Годом, ура!

Ссылки по теме:
Лучшее за 2007 год
Лучшее за 2006 год
Лучшее за 2005 год

вторник, декабря 30, 2008

Новогоднее программистское интервью

bishop3000 опубликовал интервью с 18 интересными программистами. И я там тоже есть, ага :-). Почитала остальных - действительно интересно получилось.

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

Updated 09.01.2009:
Это интервью имело продолжение.
Рождественское программистское интервью
А тут сам bishop3000 отвечает на эти же вопросы.

понедельник, декабря 29, 2008

Хабраэффект

Недавно на меня сослались на Хабре и там же началось обсуждение хабраэффекта, насколько он сильный и так далее.

В статистике хабраэффект выглядит вот так.

Народу пришло гораздо больше чем обычно, но чтобы завалить blogspot.com, этого явно недостаточно. alenacpp.blogspot.com откликался как обычно, вообще ничего заметно не было. Спасибо Гуглу.

Не только хабраэффект так выглядит, остальные эффекты примерно такие же. Их разрушительная сила несколько преувеличена :-).


Ссылки по теме:
Слэшдот-эффект

пятница, декабря 26, 2008

Статическая переменная в функции класса

Небольшой С++ паззл. Определим класс

class CBase
{
...
public:
...
void BaseTest()
{
static int i=0;
i++;
cout<<i<<endl;
}
};


А потом где-нибудь в main() напишем следующий код.

CBase b1;
CBase b2;

b1.BaseTest();
b2.BaseTest();


Ну и стандратный вопрос - что будет выведено на экран?

Проблема тут в том, что статическая переменная будет одна на все создаваемые экзепляры класса. Редко когда такой код пишется намеренно, люди так не проектируют. Это либо результат рефакторинга, или остатки кода "сейчас быстренько проверим, а потом поправим".
Если программист ожидал, что статических переменных будет несколько, то ошибка сразу может быть не видна. Пока у вас только один экземпляр класса - всё работает как ожидалось. А если их несколько - программа будет вести себя странно и это будет сложно отловить.

На всякий случай правильный ответ:
1
2


Ссылки по теме:
comp.lang.c++.moderated - static variable in non-static member function

среда, декабря 10, 2008

Unigine


Немножечко попиарю Unigine. Это игровой движок, который разрабатывается в Томске. Стоит он недорого и есть всякие приятные скидки для независимых разработчиков.

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

четверг, декабря 04, 2008

Построение анимаций в Spore

Я как-то уже давала ссылку на рассказ Криса Хекера про анимации в Споре. Но это было давно и с тех пор Крис Хекер успел выступить на SIGGRAPH'е. Выступление это было в августе этого года и этот его рассказ значительно подробнее, вот он: Real-time Motion Retargeting to Highly Varied User-Created Morphologies, [.pdf] Я сделала небольшой перессказ этого труда.

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


  • Надо построить существо из отдельных деталей
  • Текстурировать его
  • Построить анимации


Крис Хекер рассказывает только о построении анимаций.

Терминология Споры
Каждый персонаж Споры состоит из тел.
Тела - анатомически части, позвоночник, конечности. Обычно персонаж состоит из 20-80 тел.
Каждое тело содержит позицию, вращения, BB, информацию по положению в иерархии отец-ребенок. Также тела содержат теги-возможности. Которые говорят что это тело может. Например, тело-рука имеет тег-возможность "хватать".
Тела имеют деформации, которые контролируют низкоуровневую анимацию тела. Деформации стандартны для различных типов тел, например все тела-рты реагируют на деформацию открыть-закрыть.
Тела формируют направленный ациклический граф. В ранних прототипах графы были довольно сложные, даже циклы содержали, но потом их упростили. Потому что пользователю они только мешали.

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

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

Аниматор может редактировать анимационные данные на некотором загруженном персонаже и тут же смотреть как от этого меняются другие персонажи.


Когда анимация играет на персонаже в первый раз, проходят всякие разные проверки. Например проверка предикатов: HasGraspers, HasFeets. И тут есть варианты - бранчи. Если у персонажа есть чем хватать, руки там, то хватательная анимация будет задействовать руки. Если рук нет, то будет ртом хватать.

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

Как оно ходит
Количество ног заранее неизвестно, местность не является абсолютно плоской. Ноги могут быть разной длины и как угодно расположены.
Сначала ноги кластеризуются в группы по длине. Далее, для каждой группы, ноги, прикленные к одному уникальному бедру, группируются, и система походки генерит циклический шаблон движения ног, присваивая фактор порядка и триггер шага.

Фактор порядка - это промежуток времени в течение цикла шага когда нога находится на земле.

Триггер шага - это сдвиг по циклу шага, когда данная конкретная нога начинает свой подцикл.

Бедра сдвигаются и поворачиваются, чтобы во время шагания торс двигался соответственно.

Интересно, что они настраивали параметры шагания по-разному для двух групп: для тех существ, у которых ног от одной до шести, и для тех у кого ног семь или больше.

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

Вообще про хождение написано как-то в общих словах. Например, мне было бы очень интересно увидеть как именно они считают фактор порядка и триггер шага на конкретных примерах.

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

Тестирование
Тупо проверяли на самых разных существах какие именно анимации не работают. Выясняли почему и правили.


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

Вообще занимательное чтиво. Необычно и увлекательно :-).