Поддержка сохранения в JPEG в ближайшем будущем не планируется.
Поддержка JPEG в dlib
Поддержка сохранения в JPEG в ближайшем будущем не планируется.
Графический движок DGL обзавелся поддержкой Inter-Quake Model (IQM) — свободного формата для хранения 3D-моделей со скелетной анимацией.
IQM спроектирован в качестве замены MD5 известным разработчиком Ли Сальцманом, лидером проектов Sauerbraten, Tesseract и ENet. В настоящее время формат используется многими свободными играми и движками, в том числе Sauerbraten, DarkPlaces, Alien Arena, Xonotic и Warsow.
Формат бинарный, не привязан к какому-либо движку или графической технологии, легко читается и записывается. Существует полнофункциональный экспортер в IQM для Blender, что делает этот формат идеальным выбором для открытых игровых проектов.
Эффект Chroma Key (“цветовой ключ”) заключается в сегментации изображения с тем, чтобы отделить объект переднего плана от фона. При этом цвет фона должен быть сплошным и равномерным – как правило, выбирают либо зеленый, либо синий, в зависимости от того, какой цвет отсутствует на объекте. Отделенное изображение затем накладывается на другой фон – например, на фотографию или рендер виртуальной сцены.
Существуют различные алгоритмы подобной сегментации, мы рассмотрим один из самых простых. Несмотря на простоту, он достаточно эффективен. Метод основан на нахождении евклидового расстояния в пространстве RGB – между цветом исходного пикселя и цветом фона. Если рассматривать цвета как точки в трехмерном пространстве, то пиксели, например, зеленого фона будут представлять собой облако точек, сосредоточенное вокруг “абсолютно зеленой” точки – (0, 1, 0). Чтобы получить значение альфа-канала (0 – пиксель принадлежит фону, 1 – не принадлежит), мы просто нормируем расстояние в заранее выбранном диапазоне.
import dlib.math.vector;
import dlib.math.utils;
import dlib.image.image;
import dlib.image.color;
SuperImage chromaKey(
SuperImage img,
Color4f keyColor,
float minDist,
float maxDist)
{
auto res = new ImageRGBA8(img.width, img.height);
foreach(y; img.col)
foreach(x; img.row)
{
Color4f col = img[x, y];
Color4f delta = col - keyColor;
float distSqr = dot(delta, delta);
col.a = clamp(
(distSqr - minDist) / (maxDist - minDist),
0.0f, 1.0f);
res[x, y] = col;
}
return res;
}
Вот пример использования этой функции:
import dlib.image.io.io;
auto img = load("input.png");
auto res = img.chromaKey(Color4f(0, 1, 0), 0.3f, 0.7f);
res.save("output.png");
Результат не идеален – если наложить изображение на фон, вокруг предмета наблюдается зеленоватый контур. От него можно избавиться путем эрозии альфа-канала: изображение пропускается через дискретный оконный фильтр 3х3, который присваивает пикселю наименьшее значение в окне. В результате, непрозрачная область “теряет” несколько пикселей контура, и зеленый ореол практически исчезает.
SuperImage erodeAlpha(SuperImage img)
{
uint kw = 3, kh = 3;
auto res = img.dup;
foreach(y; img.col)
foreach(x; img.row)
{
auto c = img[x, y];
foreach(ky; 0..kh)
foreach(kx; 0..kw)
{
int iy = y + (ky - kh/2);
int ix = x + (kx - kw/2);
if (ix < 0) ix = 0;
if (ix >= img.width) ix = img.width - 1;
if (iy < 0) iy = 0;
if (iy >= img.height) iy = img.height - 1;
float a = img[ix, iy].a;
if (a < c.a)
c.a = a;
}
res[x, y] = c;
}
return res;
}
Доступна новая демонстрация работы dmech — на этот раз, на примере игровой кинематики (Character Controller) для игры от третьего лица. Персонаж умеет двигаться и прыгать, взаимодействуя со всеми физическими объектами и тримешем уровня.
Управление:
Стрелки — поворот вправо-влево и движение вперед-назад;
Пробел — прыжок.
Исходники вскоре будут доступны в рамках проекта Atrium.
Вышел первый стабильный релиз Cook2 — программы сборки проектов на языке D. По сравнению с первой версией проекта, Cook2 перенес множество серьезных изменений и нововведений:
std.getopt. Подробнее читайте в конольной справке (--help) и в документации по проекту.version и debug (в настоящее время других инструментов сборки для D с подобной функциональностью практически нет).В физическом движке dmech реализована поддержка пересечения тел с лучом (raycast). В качестве алгоритма для этого используется разновидность GJK. На данный момент есть возможность «стрелять» лучом в статические и динамические выпуклые тела, в ближайшем будущем появится также поддержка полигональных мешей.
Все изменения доступны в репозитории dmech на GitHub.
Все изменения доступны в репозитории dmech на GitHub.
В dmech возвращена поддержка статических полигональных мешей. Она существовала и ранее, но ее на долгое время пришлось убрать по причине несовместимости с нынешней архитектурой движка — сейчас, наконец-то, ее код удалось адаптировать.Изменения доступны в репозитории dmech на GitHub.