Фигуры Лиссажу для анимации оружия

Оружие в шутерах от первого лица не должно быть прибито к камере гвоздями – оно раскачивается в такт ходьбе, да и при стоянии на месте медленно ходит туда-сюда из-за постоянного движения рук. Конечно, довольно трудно сымитировать этот эффект в полном соответствии с реальностью, но можно обойтись дешевым и убедительным фейком. Оружие можно двигать вдоль кривой Лиссажу: x = sin(t), y = cos(2t). В результате получается траектория, изображенная на рисунке справа.

Vector2f lissajousCurve(float t)
{
    return Vector2f(sin(t), cos(2 * t));
}

//...

if (playerWalking)
    t += 10.0f * delta;
else
    t += 1.0f * delta;
    
if (t > 2 * PI)
    t = 0.0f;
    
Vector2f p = lissajousCurve(t) / 10.0f;
weapon.localPos = Vector3f(p.x, p.y, 0.0f);

Меню в Atrium

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

Доступны свежие сборки:
Для Windows (1,74 МБ)
Для Linux (2,76 МБ).

Исходники проекта доступны на GitHub.

Журнал «FPS» №23

Вышел 23 номер электронного PDF-журнала «FPS», посвященного разработке игр, программированию, компьютерной графике и звуку.

Читайте в этом номере:
 
> Blender: новости
> История Blender
> «Икона стиля»: 

новые тенденции в дизайне значков
> GIMP. Фотолаборатория: 

отделение темных участков от светлых
> Derelict. Джентльменский набор разработчика игр
> Новости игровой индустрии
> И в этом вся соль! Native Client от Google
> Загадки числа «Пи»
> Страсти по Оруэллу: на пороге электронного тоталитаризма
> 20 причин не использовать Facebook

Номер доступен для онлайн-чтения и загрузки на сервисе Issuu.com, Документах Google и Dropbox

Последние новости по проекту вы можете узнать в публичной странице журнала в социальной сети Google+: http://gplus.to/fpsmag. Добавляйте нас в круги, оставляйте свои комментарии и отписывайтесь в нашем сообществе.

 

Сохранение PNG в dlib

В dlib теперь поддерживается сохранение изображений в формат PNG (Portable Network Graphics) — ранее было доступно только чтение файлов этого формата. За сохранение отвечает функция savePNG в модуле dlib.image.io.png.
Изменения доступны в ревизии r22 и выше.

http://code.google.com/p/dlib/

Обновление Atrium

Свершилось! Результат моей работы за последние месяцы — основа будущего шутера от первого лица с физическими головоломками — доступен на GitHub. Добавлена заготовка игрового уровня, а также действующий гравитационный излучатель, при помощи которого игрок может передвигать динамические объекты (из-за ограничений в нынешнем физическом движке, таковые объекты представлены только сферами, но в будущем не исключена поддержка других типов тел). Исходники собираются DMD 2.060 и выше. Под Linux рекомендуется использовать LDC.

Сборка для Windows: atrium-testbuild3-win32.zip (1.18 МБ).

Случайная выборка с учетом веса

Один из распространенных приемов в игровой логике – использование элемента случайности. Он используется, например, при машинной генерации уровней, лабиринтов, или когда на локации появляются случайные враги или бонусы. При этом зачастую требуется выбрать случайный объект из какого-либо списка с учетом того, что некоторые из них имеют большую вероятность выбора, чем другие – то есть, имеют больший “вес”.

Я написал особую реализацию алгоритма такой выборки – она работает не с обычными массивами, а с перечислениями (enum). В шаблон функции передаются два перечисления – самих элементов и их весов. Этот пример иллюстрирует также богатые возможности метапрограммирования, CTFE и интроспекции в D.

import std.stdio;
import std.traits;
import std.random;
import std.algorithm;

T weightedRandomEnum(T, W)()
    if (isNumeric!W &&
        is(T == enum) && is(W == enum) && 
        EnumMembers!T.length == EnumMembers!W.length)
{
    enum members = [EnumMembers!T];
    enum weights = [EnumMembers!W];
    enum weightsSum = reduce!("a + b")([EnumMembers!W]);
    
    auto randomNumber = uniform(0, weightsSum);
    
    foreach(i, weight; weights)
    {
        if (randomNumber < weight)
            return members[i];
        else
            randomNumber -= weight;
    }
    
    assert(0, "Should never get here");
}

enum Color
{
    Red, Yellow, Green, Blue
}

enum Weights
{
    Red = 100, 
    Yellow = 20, 
    Green = 20, 
    Blue = 5
}

void main()
{
    foreach(i; 0..10)
        writeln(weightedRandomEnum!(Color, Weights));
}

Обновление dlib

Состоялось серьезное обновление набора библиотек dlib. В числе нововведений:

  • Появилась начальная поддержка быстрого преобразования Фурье (FFT) в dlib.image. Возможна фильтрация и свертка изображений (со стороной 2^n) в частотной области;
  • Обновлен пакет dlib.math, добавлена реализация комплексных и дуальных чисел, а также внесены исправления и дополнения в dlib.math.matrix3x3 и dlib.math.matrix4x4;
  • Обновлен пакет dlib.geometry, добавлен класс ориентированных боксов (OBB), трехмерных треугольников и полигональных мешей. Реализована проверка на пересечение между сферой и треугольником, а также сферой и OBB. Добавлен модуль dlib.geometry.bezier с реализацией кривых Безье.

Иллюстрация FFT-свертки: быстрое синтетическое боке (оптическое размытие):

Изменения доступны в ревизии r21 и выше. В ближайшем будущем ожидается первый релиз проекта.

http://code.google.com/p/dlib/

Фиксированный шаг времени

Доступна новая тестовая сборка Atrium: в физическом движке реализован новый таймер, который учитывает интерполяцию между кадрами с фиксированным шагом времени. Физика «не любит» нефиксированный шаг, поэтому время между двумя кадрами рендеринга разбивается на определенное количество шагов, а остаток просто линейно интерполируется.

atrium-physics-test5-linux-x86.tar.bz2

Atrium: интеграция физики

Доступна сборка Atrium со включенным физическим движком. Данная демонстрация показывает возможность создания игры от первого лица на основе физики: объект-игрок тоже представлен динамическим твердым телом (у которого просто отключена угловая скорость) массой в 80 кг. Перемещение игрока осуществляется путем приложения сил в нужных направлениях.

atrium-physics-test2-win32.zip (3.13 Мб)