Поддержка сочленений в физическом движке

Физический движок Atrium обзавелся базовой поддержкой сочленений (или ограничений – Constraints) между телами. В данный момент реализован один тип сочленений – шарнир (BallConstraint), который удерживает два тела на определенном расстоянии друг от друга, позволяя им вращаться вокруг заданной точки.

Изменения доступны в репозитории Atrium на GitHub.
Сборка для Windows (2,63 МБ)

Кроме того, вслед за dlib, система сборки проектов Cook также переехала на GitHub. Репозиторий проекта доступен по адресу: http://github.com/gecko0307/cook.

Дуальные числа и касательная к кривой Безье

Дуальные числа, поддержка которых не так давно появилась в dlib (dlib.math.dual), обладают замечательным свойством: с их помощью можно реализовать автоматическое дифференцирование функций. Если производить вычисления не над вещественными, а над дуальными числами, то в вещественной части результата получается значение самой функции в заданной точке, а в дуальной – значение ее производной.
При этом если оформить функцию в виде шаблона, она без лишних телодвижений расширяется до множества дуальных чисел. Следующий пример показывает дифференцирование простейшей квадратичной функции:

import std.stdio;
import dlib.math.dual;

T parabola(T)(T x)
{
return x*x;
}

void main()
{
float x = 1.0f;

Dualf eval = parabola(Dualf(x, 1.0f));
float value = eval.re;
float deriv = eval.du;

writeln(deriv);
}

При запуске программа выдаст значение производной – 2 для точки 1. Правильность результата нетрудно проверить, зная формулу производной степенной функции: если f(x) = xn, то f ‘(x) = nxn-1. Следовательно, если f(x) = x2, то f ‘(x) = 2x.

Теперь начинается самое интересное. Попробуем вместо скалярных величин взять векторные и дифференцировать функцию кривой Безье (dlib.geometry.bezier) для двумерного случая:

import dlib.math.dual;
import dlib.math.vector;
import dlib.geometry.bezier;

alias DualVector2f = Vector!(Dualf, 2);

void main()
{
float t = 0.5f;

DualVector2f eval = bezierCurveFunc2D(
DualVector2f(Dualf(0.0f), Dualf(0.0f)),
DualVector2f(Dualf(1.0f), Dualf(1.0f)),
DualVector2f(Dualf(2.0f), Dualf(1.0f)),
DualVector2f(Dualf(3.0f), Dualf(0.0f)),
Dualf(t, 1.0f));
}

Результирующий вектор eval будет содержать в вещественной части точку на кривой, а в дуальной – вектор касательной к кривой в этой точке, который нам остается только нормировать:

Vector2f point = Vector2f(eval.x.re, eval.y.re);
Vector2f tangent = Vector2f(eval.x.du, eval.y.du).normalized;

Таким образом, нехитрая алгебра дуальных чисел позволяет эффективно вычислять производные и векторы касательных, что, несомненно, может найти широкое применение в игровых движках – например, когда необходимо получить вектор скорости объекта, движущегося по некой математически описанной траектории.

dlib 0.1.2

Коллекция библиотек dlib обновилась до версии 0.1.2. Были внесены несколько значительных нвовведений:

  • В dlib.image.color типы ColorRGBA и ColorRGBAf были переименованы в Color4 и Color4f соответственно. Для обеспечения обратной совместимости, старые имена сохранены в виде псевдонимов, но новый код рекомендуется писать с использованием новых имен;
  • Добавлена поддержка свертки изображений (dlib.image.filters.convolution), которая позволяет реализовать на ее основе множество различных фильтров. Есть несколько встроенных ядер 3×3: Identity, BoxBlur, GaussianBlur, Sharpen, Emboss, EdgeEmboss, EdgeDetect, Laplace;
  • Добавлена поддержка цветового пространства HSV. На его основе реализованы эффекты Chroma Key (“зеленый фон”) и Color Pass (выборочное обесцвечивание).
  • Исправлены баги, связанные со сборкой при помощи DUB.

Страница проекта:
https://github.com/gecko0307/dlib

Скачать dlib 0.1.2:
https://github.com/gecko0307/dlib/releases/tag/v0.1.2

Релиз dlib 0.1

Состоялся первый нестабильный релиз коллекции библиотек dlib.

Нововведений по сравнению с последней ревизией SVN практически нет (если не считать функцию генерации тангенс-векторов для полигональных мешей) – релиз просто ознаменовал переезд проекта на GitHub (однако старый репозиторий в обозримом будущем продолжит обновляться параллельно с новым).

Одновременно с этим был зарегистрирован пакет dlib в реестре DUB: http://code.dlang.org/packages/dlib.

Страница проекта:
https://github.com/gecko0307/dlib

Скачать dlib 0.1:
https://github.com/gecko0307/dlib/releases/tag/v0.1

Обновление dlib (r23)

Состоялось обновление набора библиотек dlib.

  • В модуле dlib.math.vector реализованы функция isAlmostZero, шаблоны для целочисленных векторов (Vector2i, Vector2u). vectorDecreaseToZero теперь поддерживает векторы произвольного размера;
  • В dlib.math.utils добавлены функции sign и swap;
  • В dlib.math.matrix3x3 реализовано покомпонентное сложение и вычитание матриц;
  • В dlib.math.matrix4x4 добавлены функции shadowMatrix для построения теневых матриц (проекции вершин на плоскость) и matrixFromAxisAngle для построения матриц вращения из представления “ось-угол”;
  • Для изображений в частотном диапазоне (dlib.image.compleximage) реализованы обратная свертка (deconvolve) и деление (divide).

Изменения доступны в ревизии r23 и выше.

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