Войти

Программирование игр

Игровой движок, 3D графика, сеть, физика, логика, уеб

НовостиСтатьиПодсказкиТерминыFAQФорумИнфо

Статьи

Имитация раскачивания дерева под воздействием ветра
Имитация раскачивания дерева под воздействием ветра
Статья демонстрирует простой метод имитации воздействия ветра на дерево (куст), реализованный на вертексном шейдере.

Читать | Комментарии [19]
9 окт. 2020

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

Читать | Комментарии [25]
3 июня 2020

Гидродинамика Шрёдингера на пальцах
Предрасчёт рейкаста для эффективного рендеринга травы и меха
На пути к эффективному алгоритму Global Illumination, часть 1
Синхронизации в Vulkan

Термины

Universal Scene Description (USD)
Universal Scene Description (USD)
Universal Scene Description (USD) — файловый формат описания трехмерной сцены, разработанный компанией Pixar.

Читать
5 июня 2018

Verge3D
Verge3D
Verge3D - трёхмерный движок для веба, использующий технологию WebGL. Основан на Three.js, от которого отличается наличием реалистичных материалов, визуальным редактором логики Puzzles, средой создания приложений и более тесной интеграцией с программами моделирования Blender и 3ds Max. 14 декабря 2017 года в рамках проекта был запущен облачный сервис Verge3D Network для публикации и распространения 3D-приложений.

Читать | Комментарии [19]
8 дек. 2017

Вуду-программирование
Blend4Web
Forward+

Подсказки

MAX Script: Разделение 3D модели на элементы по группам нормаль векторов.
MAX Script: Разделение 3D модели на элементы по группам нормаль векторов.
Здесь представлен скрипт 3D Studio MAX, при помощи которого можно разделить 3D модели на элементы по группам нормалей, также смотрите «MAX Script: Разделение 3D модели на элементы по группам сглаживания».

Читать
10 мая 2020

Delphi: Точный таймер (Win API)
^ Матрица LookAt
Инверсия матрицы 4x4

Новости

Развитие рендера в Path of Exile
Выложили мой доклад с exilecon. В нём я рассказываю о нескольких необычных техниках рендеринга, разработанных для Path of Exile. Доклад на английском языке. Есть русские субтитры.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Ссылка | Комментарии [66]
8 апр. 2020

Ray Tracing Gem. Доступно бесплатно!
Опубликована PDF-книга «Ray Tracing Gem. High-quality and real-time rendering with DXR and other APIs» на 600+ страниц, подготовленная NVIDIA и разными специалистами из области рейтрейсинга. Можно скачать отсюда:
https://link.springer.com/book/10.1007/978-1-4842-4427-2

Ссылка | Комментарии [7]
4 мар. 2019

Microsoft анонсировала DirectX Raytracing (DXR)
На проходящей в Сан-Франциско конференции разработчиков игр (GDC) компания Microsoft анонсировала поддержку в DirectX 12 технологии DirectX Raytracing (DXR). Новый программный интерфейс позволяет производить просчет рейтрейсинга при помощи поддержки этой технологии в железе.

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

SEED-screenshot | Microsoft анонсировала DirectX Raytracing (DXR)

Подробнее…

Ссылка | Комментарии [504]
20 мар. 2018

О дизайне игровых подсистем в 2048 Tournament
Опубликован доклад по итогам разработки игры 2048 Tournament. В нём секции о естественной и искусственной сложности, о принципах дизайна систем, о типах ошибок, о декларативном формировании сценария действий, о том, как у нас работает конечный автомат и о паре архитектурных трюков.

P.S. Не забудьте включить полноэкранный режим просмотра.
Ссылка на доклад: http://www.goo.gl/6DoH7R

2048_tournament_postmortem | О дизайне игровых подсистем в 2048 Tournament

Ссылка
27 янв. 2015

Форум

Planar reflection и корректные нормали.26 окт. 202011:22Kripto289
Добрый день,
Делаю отражения для воды. Сделал несколько вариантов и размышляю над тем, как можно улучшить следующие 2 метода:
waterRefl | О дизайне игровых подсистем в 2048 Tournament

screen space planar reflection. Это трассировка отражения по поверхности (как SSR),
+ самый быстрый метод рендеринга отражений для воды в рантайме. В отличии от классического SSR тут нет реймарчинга.
+ pixel-perfect метод рендеринга в сравнении с другими методами SSR.
+ работает в forward режиме, так как не требуются нормали и достаточно буфера глубины.
- работает только на плоских поверхностях, игнорируя нормали.
- артефакты свойственные скринспейс техникам.

Планарные отражения
+ нет артефактов как у SSR
- дорого
- имеют те же минусы с нормалями

Кубмапа окружения.
+ самый существенный плюс, это отражение более приближенное к реализму.
+ можно рендерить десятки источников света за одно чтение кубической карты в шейдере. Не нужно городить огород из массива источников света, тайлингом, pbr бликами и т.д. Визуально выглядит физично, например солнечные дорожки.
+ можно рендерить источники света разной формы. Например всякие неоновые лампы, притом опять же с реалистичным бликом. Хотя можно пойти дальше и опять же рендерить всю сцену :)
+ можно запечь дальние планы (горы/небо)
+ можно объединить статичные кубмапы с ssr.
+ можно интерполировать отражение между несколькими статичными кубмапами.
- Рендерить её в рантайме очень дорого, хотя можно сделать пару оптимизаций (например рендерить только видимые стороны/рендерить стороны в разных кадрах/и т.д.)
- Так же проекция кубмапы захватывает и область под водой, что вываливатся в артефакты, когда дно перекрывает всё отражение.

Можно визуально сравнить оба метода на скрине, только отражение на воде и ничего больше.

Собственно вопрос как можно побороть минусы?
Можно ли как-то рендерить физически коректные нормали в screen space planar reflection?
Как избавиться от артефактов кубмапы ниже плоскости воды? Городить огород из плоскостей отсечения при рендеринге сторон? Есть ли способ проще?

Правка: 11:23

Террайн и Continuous collision detection25 окт. 20206:17MikeNew
Столкнулся с проблемой CCD (туннелирования) при обработке столкновений с террайном для маленьких (или движущихся с большими, относительно своих размеров, скоростями объектов). При попадании на "шов":

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

Столкновение тела с террайном у меня считается как столкновение каждого (лежащего внизу под телом, а не вообще каждого) треугольника террайна.

Почему такое происходит, я понимаю:
Изображение

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

Думал, поможет, но результаты неудовлетворительны, работает криво.

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

Как вы с таким боретесь?

Правка: 6:17

Поиск маршрута24 окт. 202015:59slepov
Поиск маршрута:
есть клеточная карта с пустым/занятыми областями, начальное положение персонажа, координаты клеток с голдой. Задача - построить маршрут для персонажа чтобы обойти и собрать всю голду.

На сколько я знаю это классическая задача комиваяжера (без ограничения посещения вершин) ?
И она не имеет эффективного решения (NP сложность). Или это ни так?

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

Создание интерьера комнаты24 окт. 20206:57Harris
Решил создать игру , где делаешь интерьер комнаты , но не знаю с чего начать и как гуглить. Может поможете с какими-нибудь ссылками на статьи или Ютуб видео

Правка: 6:57

Нужно ли переходить на macOS Catalina если Делаешь на Ios 1421 окт. 202022:41MegaMan11
Ребят проблема! Жесть обновил Iphone 6s до 14.1 не могу теперь проверить игру на нем. Посмотрел что нужно сделать и так понял вообще жесть какая-то для ios 14 нужен xCode последний версии, а для XCode нужен последний macOS Catalina, а у меня macOS High Sierra, а чтоб ее установить нужен Новый Жесткий диск! и потом установить на этот диск - macOS Catalina ( 20 гигов ) потом туда новый XCode (12 гигов) и Юнити потом на него Опять установить установить Вроде так? Я так все понимаю? Или можно как то на High Sierra все сделать !
Какой движок выбрать для ностальгической игры а-ля Quake?21 окт. 202019:53winter
ВНЕЗАПНО возникло сразу несколько идей—по геймплею, сеттингу, сюжету. Где все это было, когда мне было 20?

Хочется проехаться на волне ностальгии и запилить дему в стиле оригинальной Кваки и грядущего Wrath: Aeon of Ruin. Какое двигло подобрать?

Сама первая Квака—по идее, самый труъшный вариант, но не хочется связываться с архаичным BSP tree и системой порталов. Плюс—должны быть диалоги и заскриптованные сцены, а я уже не помню, насколько гибок QuakeC и насколько можно с его помощью "расширить и углубить" геймплей.

Требования:

1. Визуальная эстетика первой Кваки.
2. Жанр—action/adventure, т.е. и пострелять, и покастовать спеллы, и поюзать предметы.
3. Диалоги и заскриптованные сцены.

Правка: 19:54

Поиск пути на шахматной Iso карте21 окт. 202018:16xXZyzzXx
Нужна помощь с правильным определением радиуса на изометрической (смещённой) карте, по которому юниту можно совершать передвижение. Вот моя карта в спойлере ниже:

+ Показать

Трудность для меня заключается в том, как правильно получить список тайлов, желательно по эвклидовой метрике.

euclidian | О дизайне игровых подсистем в 2048 Tournament

При таком построении плиток идёт смещение нечётного тайла, соответственно в одном случае будет такое построение передвижения:

          (x, y+2)

    (x, y-1)..(x+1, y-1)

(x-1, y)..(x, y)..(x+1, y)

    (x, y+1)..(x+1, y+1)

          (x, y+2)


А в случае со смещённой плиткой значение X будет уменьшено на 1 в 4-ех направлениях:
          (x, y+2)

    (x-1, y-1)..(x, y-1)

(x-1, y)..(x, y)..(x+1, y)

    (x-1, y+1)..(x, y+1)

          (x, y+2)

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

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

+ Показать

Очень буду рад формулам, либо коду, желательно python.

Blender -> FBX -> UE4 Import/Export21 окт. 202017:57SkyDev
Hello World!,

Пробую инпортировать в UE4 свою простую скелетку, но что-то идет не так. Создал куб 100x100x100см, скелет из 2х костей, добавил 1 экшн анимации, экспортирую.

fbxerr3 | О дизайне игровых подсистем в 2048 Tournament

При импорте в UE4 получаю множество ошибок, одна из которых:
Imported bone transform is different from original. Please check Output Log to see detail of error. 

В логах много:
LogFbx: Warning: IMPORT TRANSFORM ERROR : ...

fbxerr2 | О дизайне игровых подсистем в 2048 Tournament

Получаю в итоге нормальный скелет, аним. меш, но трек анимации поломан, таймлайн есть он даже проигрывается, а анимации нет.

fbxerr4 | О дизайне игровых подсистем в 2048 Tournament

Если при экспорте в поле Apply Scalings вместо All Local выбрать FBX Unit Scale, импортируется в UE4 без ошибок, но в анимации куб очень маленьких размеров.

fbxerr1 | О дизайне игровых подсистем в 2048 Tournament

Что не так, как сделать правильно?

Правка: 17:57

Undo/Redo на удаление объектов20 окт. 202014:460xc0de
Интересно, кто как делает отмену/повтор на удаление объектов, особенно если на объект ссылаются другие сущности или предыдущие операции в списке undo операций.

Рассмотрим пример:
Мы вращаем объект A, создаем операцию, которая хранит предыдущее и текущее состояние трансформации и ссылку(sharedptr) на объект A.
Следующим действием мы удаляем объект A и создаем операцию, которая хранит атрибуты объекта, чтобы можно было его создать заново при undo. Тут возникает проблема, что предыдущая операция хранит ссылку на удаленный объект, т.е. объект все еще живой, но его нет в сцене, при этом в сцену при undo добавляется новый объект - копия старого, на который все еще указывает sharedptr предыдущей операции вращения объекта.

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

Другой вариант, который приходит в голову - поместить объект в некую обертку:

class ObjectLink : public RefCounted
{
   Object * pObject;
};
И хранить ссылки не напрямую на объект, а на objectLink, в котором менять указатель pObject при undo/redo. Но тут тоже есть подводный камень - нужно следить, чтобы никто случайно не скопировал себе указатель на pObject, который может стать невалидным при очередном undo/redo.

Третий вариант - хранить не указатели, а уникальные идентификаторы объектов, а сами объекты доставать их хэша.

Посоветуйте, как лучше сделать.

Правка: 15:39

Простая игра пятнашки, передвижение спрайтов (С++, GLFW, GL 4.6)20 окт. 20209:15std::variant
Застрял на простой теме, на перемещении и смене местами числовых спрайтов.
Понимаю, что задача простая, но я туплю... и не могу понять как их перемещать мышкой,
типа drag end drop? Мышкой потянул, спрайт встал на место другого...
Имеется атлас из чисел от 1 до 15 + пустая клетка, сетка представлена массивом 4 на 4
const int N = 4;
const int tile_size = 64;
int grid[N][N] = {};

int width = tile_size * N;
int height = tile_size * N;
int xpos = 0;
int ypos = 0;

int pixel_x;
int pixel_y;
инициализация сетки:
int n = 0; 
for (int i = 0; i < N; ++i) {
  for (int j = 0; j < N; ++j) {
    n++;
    grid[i + 1][j + 1] = n;
  }
}
обработка мышки, делает совсем не то, просто сменяет одну цифру на другую при наведении,
но ни как не drag&drop:
void cursor_position_callback(GLFWwindow* window, double x, double y)
{
  xpos = static_cast<int>(x) / tile_size;
  ypos = static_cast<int>(y) / tile_size;
}

void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
  if ((button == GLFW_MOUSE_BUTTON_LEFT) && action == GLFW_PRESS)
  {
    int dx = 0;
    int dy = 0;

    if (grid[xpos + 1][ypos] == 16) { dx = 1; dy = 0; };
    if (grid[xpos][ypos + 1] == 16) { dx = 0; dy = 1; };
    if (grid[xpos][ypos - 1] == 16) { dx = 0; dy = -1; };
    if (grid[xpos - 1][ypos] == 16) { dx = -1; dy = 0; };

    int n = grid[xpos][ypos];
    grid[xpos][ypos] = 16;
    grid[xpos + dx][ypos + dy] = n;

    std::cout << "Cursor position at (" << xpos << " : " << ypos << ")\n";
  }
}

Правка: 16:34

Букмекерские конторы по материалам http://winline.ru. , ігрові автомати , Вычислительная гидродинамика