Сделал пару образов для своего персонажа
Какой вам нравится больше?
Какой вам нравится больше?
Красный
Желтый
Хочу сделать футаж и анимацию в стиле ретровейва в блендере 2.76-2.79. Просто у блендера 2.76-2.79 более низкие требования по сравнению с более новыми версиями.
Ноут HP Pavilion Gaming Laptop 15: Windows 10 Home SL 64bit 22h2, Intel Core i5-8300H 2.3 GHz, Intel UHD Graphics 630, NVIDIA GeForce 1060 MaxQ 3 ГБ, 12ГБ ОЗУ.
Покупать ПК или добавлять диск ssd и озу в ноут не вариант, так как это дорого, а размеры стола не позволяют поставить пк (он по габаритам будет более громоздкий, чем ноут)
Это продолжение поста Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля, ч.1
Дисклеймер: игра была написана как простенькая, но познавательная демка именно для PowerVR MBX и именно для Axim X51v. Именно поэтому здесь нет нормального Update-таймера, расчёта дельты времени, а игра прибита к константным временным отрезкам и величинам скорости!
Итак, как же игры подобного планы работают «под капотом»? По факту, обычно мы с вами никуда не едем: фоновые модели ландшафта и дороги просто скроллятся и телепортируются друг за другом, когда одна из частей уходят за экран, что создаёт эффект бесконечной дороги. И эта техника используется во многих играх! Что же касается машинок, от которых мы должны лавировать, то это не мы едем на них, это они едут на нас! По итогу создаётся эффект будто мы с вами куда-то едем и уворачиваемся от машинок, хотя на деле это не так!
Начинаем с реализации базовой вещи в архитектуре любой современной игры, а именно системы игровых объектов. В нашей игре нет необходимости в реализации сложного графа сцены с комплексной компонентной системой, или, например, ECS. Хватит классического линейного списка игровых объектов (который использовался, например, в Half-Life), по которому объект World проходится каждый кадр, вызывая необходимые функции для обновления состояния объекта и его отрисовки:
public abstract class Entity
{
public Transform Transform;
public abstract void Update();
public abstract void Draw();
}
public void Spawn(Entity ent)
{
if(ent != null)
Entities.Add(ent);
}
public void Remove(Entity ent)
{
entityRemovalList.Add(ent);
}
public void Update()
{
sky.Update();
renderer.Update();
spawner.Update();
foreach (Entity ent in Entities)
ent.Update();
foreach (Entity ent in entityRemovalList)
Entities.Remove(ent);
entityRemovalList.Clear();
}
public void Draw()
{
sky.Draw();
renderer.Draw();
foreach (Entity ent in Entities)
ent.Draw();
}
Самым первым нашим объектом будет машинка игрока, которой можно будет управлять!
Модельки я взял лоуполи со скетчфаба, вот ссылка на ВАЗ 21099 и VW Golf Mk2. Спасибо авторам моделей за их работу!
Наследуемся от Entity и реализуем абстрактные методы с логикой объекта. Здесь мы получаем состояние аппаратных кнопок влево и вправо, в зависимости от них вычисляем направление поворота машинки и, собственно, поворачиваем машинку путём сложения с координатой X вычисленного направления, помноженного на «скорость» поворота машинки. Для лучшего визуального эффекта, мы также плавно поворачиваем машинку эффектом а-ля EaseIn/EaseOut:
float hVel = Engine.Current.Input.GetKeyState(GamepadKey.Left) ? -1 : (Engine.Current.Input.GetKeyState(GamepadKey.Right) ? 1 : 0);
Transform.Position.X += hVel * SteerSpeed;
Transform.Rotation.Y = MathUtils.lerp(Transform.Rotation.Y, 180 + (hVel * 35), 0.1f);
Теперь нам нужно, чтобы машинка где-то «ездила». Для этого мы моделируем в блендере примитивный кусок дороги с элементами ландшафта:
А затем реализуем примитивный рендерер фона, который будет скроллить два одинаковых seamless-куска уровня и как я уже говорил ранее, просто телепортировать их друг за другом, создавая эффект бесконечности.
public SectorRenderer()
{
road = Model.FromFile("road.mdl");
roadMaterial.Diffuse = Texture2D.FromFile("road.tex");
terrain = Model.FromFile("terrain.mdl");
terrainMaterial.Diffuse = Texture2D.FromFile("grass.tex");
sector1.Position.Y = -4;
sector2.Position.Y = -4;
sector2.Position.Z = SectorSize;
}
public void Update()
{
sector1.Position.Z -= ScrollingSpeed;
sector2.Position.Z -= ScrollingSpeed;
if (sector1.Position.Z + SectorSize < 0)
sector1.Position.Z = SectorSize;
if (sector2.Position.Z + SectorSize < 0)
sector2.Position.Z = SectorSize;
}
public void Draw()
{
Engine.Current.Graphics.DrawModel(road, sector1, roadMaterial);
Engine.Current.Graphics.DrawModel(terrain, sector1, terrainMaterial);
Engine.Current.Graphics.DrawModel(road, sector2, roadMaterial);
Engine.Current.Graphics.DrawModel(terrain, sector2, terrainMaterial);
}
Где terrain.mdl — окружающий ландшафт, а road.mdl — собственно, сам меш дороги. Получаем вот такой эффект:
Артефакты на видео — следствие проблем с точностью float у MBX Lite в процессе клиппинга геометрии при ближней плоскости отсечения в 0.1f. Меняем на 1.0f и всё снова работает нормально :)
Чуть изменяем проекцию, переместив камеру выше и наклонив на 45 градусов и игра уже похожа на Traffic Racer!
Переходим к реализации машин трафика. Модельки их машин будут загружаться при старте игры:
private static void LoadTrafficModel(int idx, string name)
{
PreloadedCars[idx] = Model.FromFile(name + ".mdl");
PreloadedMaterials[idx].Diffuse = Texture2D.FromFile(name + ".tex");
}
public static void Preload()
{
PreloadedCars = new Model[1];
PreloadedMaterials = new Material[1];
LoadTrafficModel(0, "traffic1");
}
А сама их логика предельно проста. При спавне, машинка выбирает себе полосу, по которой будет ехать и рандомный множитель скорости, который вносит разнообразие в игру:
Rand rand = new Random();
Transform.Position.X = Game.Current.world.PickLane(rand .Next(0, 4));
Transform.Position.Y = Game.Current.world.Player.Transform.Position.Y;
Transform.Position.Z = rand .Next(ZOffset, ZOffsetMax);
selectedBias = rand.Next(0, SpeedBias.Length - 1);
int carModel = rand .Next(0, PreloadedCars.Length - 1);
model = PreloadedCars[carModel];
material = PreloadedMaterials[carModel];
А при обновлении, машинка просто продолжает ехать вниз! Логика простая до жути, даже без перестроений.
Transform.Position.Z -= BaseSpeed * SpeedBias[selectedBias];
Переходим к обработке столкновений. Помним, что мы на этапе конвертации моделей посчитали Axis Aligned Bounding Box для каждой модели? В качестве алгоритма мы будем использовать классический AABB — или Rect vs rect:
public bool Intersects(BoundingBox box)
{
return (X < box.X + box.X2 && Y < box.Y + box.Y2 && Z < box.Z + box.Z2 && box.X < X + X2 && box.Y < Y + Y2 && box.Z < Z + Z2);
}
Теперь для проверки столкновения между ними, нам надо посчитать абсолютный Bounding Box для каждого игрового объекта:
Bounds = model.Bounds;
Bounds.X += Transform.Position.X;
Bounds.Y += Transform.Position.Y;
Bounds.Z += Transform.Position.Z;
Затем итерируемся по списку всех игровых объектов в сцене, и если у нас есть машинка трафика, то проверяем на столкновение с машинкой игрока. Если столкнулись, то помечаем машинку игрока как разбитую и предлагаем игроку рестартнуть игру.
foreach (Entity ent in Game.Current.World.Entities)
{
if (ent is TrafficCar)
{
if (Player.Bounds.Intersects(((TrafficCar)ent).Bounds))
{
// TODO: Damage logic
Player.IsDestroyed = true;
}
}
}
Уже что-то немного похожее на игру. Добавим конечное препятствие — необходимость рестарта при столкновении с другой машинкой и для демки пока-что хватит.
public void Draw()
{
string scoreFmt = string.Format("Score: {0} x{1}", Game.Current.world.Statistics.Score, 1);
Engine.Current.Graphics.DrawString(scoreFmt, 15, 15, StatsColor);
if (Game.Current.world.Player.IsDestroyed)
{
int measure = Engine.Current.Graphics.MeasureString(RestartString);
Engine.Current.Graphics.DrawString("Press Return to restart", Engine.Current.Graphics.ViewWidth / 2 - (measure / 2), Engine.Current.Graphics.ViewHeight / 2, StatsColor);
}
}
Вот что у нас получилось:
Правда, что на МКАДе каждый вечер такое? Я просто не с МСК :)
Вот такой у нас получился материал про PowerVR MBX! С выходом iPhone, этот GPU дал толчок для появления красивых мобильных игр с уровнем графики, близким к полноценным домашним консолям… жаль, что золотая эра интересных, самодостаточных и бездонатных мобильных игр и закончилась во времена iPhone 5 :(
В остальном же, надеюсь материал был достаточно интересен и познавателен для всех моих читателей, даже тех, кто никогда не программировал игры! Был у вас Dell Axim X51v? Пишите в комментариях!
Исходный код демки и бинарники можно найти на моём гитхабе.
Материал написан при поддержке TimeWeb Cloud. Подписывайтесь на меня и @Timeweb.Cloud , чтобы не пропускать новые статьи каждую неделю! А ещё у меня есть своя телега, куда я публикую бэкстейдж статей и вовремя публикую ссылки на новый материал!
А ещё я собираю деньги на проект с уже настоящим, физическим ТАЗом и его электронным дооснащением бортовым компьютером "по самому дешману" своими руками! Уже собрано 50.000 рублей из планируемых 70.000 на машину, из них 45.000 моих личных сбережений и 5.000 рублей - помощь читателей, за что вам большое спасибо :)
Год назад смотрел видео в youtube “Картинку в 3D объект с помощью нейронной сети”, которая из изображения делает 3D модели. Ссылка на видео https://youtu.be/vHYxAMVFOb4?si=Q5vIlqkqz-7TAUxC Из недостатков этой нейросети было долгое ожидание генерации 3d модели (1 день) и сумма за готовую 3d модель, которая сопоставима со стоимостью заказа 3D модели на фрилансе. Под этим видео был комментарий следующего характера «Скорее это не нейронка, а просто дешёвый труд”. На тот момент я тоже подумал, что скорее всего делают люди и моделят за деньги. Со временем мое мнение поменялось. За последнее время нейронные сети стремительно развиваются. И сегодня доступно несколько нейронных сетей которые генерируют 3д модель по изображению или текстовому описанию
Большая Гауссова Модель
По своей сути Большая Гауссова Модель — это тип нейронной сети, которая может обучаться и генерировать сложные трехмерные фигуры на основе простых входных параметров. По сути, она действует как своего рода цифровой скульптор или художник, используя вероятности и статистику, чтобы заполнить пробелы между известными точками данных и создать связное, цельное целое. В одной из недавних демонстраций исследователи использовали Большую Гауссову Модель для создания детальных реконструкций целых зданий всего лишь из нескольких фотографий, сделанных под разными углами. Анализируя закономерности и особенности, общие для нескольких изображений, модель смогла заполнить недостающие детали и создать полное и точное представление экстерьера здания.
Видео по созданию с помощью программы LUMA AI
Нейросеть Pifu HD
Нейросеть PIFU - это алгоритм машинного обучения, который позволяет создавать 3D-модели человека на основе одной фотографии. Он был разработан в 2019 году командой ученых из Университета Цюриха в Швейцарии.
Процесс создания 3D модели с помощью PIFU начинается с загрузки фотографии человека в специальную программу для обработки изображений. Затем программа использует алгоритмы машинного обучения для анализа формы и пропорций лица на фотографии. На основе этих данных создается геометрическая модель, которая затем преобразуется в 3D модель.
Одной из особенностей PIFU является то, что он может создавать 3D модели людей с различными типами кожи, волос и глаз. Это позволяет создавать более реалистичные модели, которые могут быть использованы в различных областях, таких как медицина, кино и видеоигры.
Однако, следует отметить, что PIFU не является идеальным алгоритмом для создания 3D моделей людей. Он может иметь некоторые ограничения и ошибки, особенно если фотография не очень хорошего качества или если человек на фотографии имеет необычный тип лица или прическу. Кроме того, для создания 3D модели требуется достаточно высокое качество фотографии, чтобы алгоритмы могли точно проанализировать форму и пропорции лица.
Нейросеть ICON
ICON – революционная нейронная сеть, которая меняет традиционные методы создания трехмерных аватаров. В отличие от существующих методов, которые требуют либо постановочного 3D-сканирования, либо тщательно контролируемых двумерных изображений, ICON может создавать реалистичные 3D аватары из неограниченного количества реальных положений человека, используя только стандартные фотографии. ICON – Implicit Clothed humans Obtained from Normals (Неявные одетые люди, полученные от нормальных людей)
Попробовать нейросеть ICON https://hubai.ru/icon/
Создание 3D модели по текстовому запросу (описанию)
Мы рассказали Вам как нейросети могут создавать 3д модели по изображению. Но, нейросети способны не только создавать 3D модели из изображений, но и по текстовому описанию. Создание 3d моделей по текстовому описанию было лишь вопросом времени. Компания OpenAI создала генеративную нейросеть, которая способна преобразовывать текстовые промты в 3D-модели.
Нейросеть Shap E состоит из двух моделей: первая генерирует простое изображение на основе текстового запроса, а вторая — преобразовывает его в 3D-модель. Для этого она создает облака точек в пространстве, которые повторяют трёхмерную форму объекта.
Специалисты OpenAI обучили нейросеть Point-E создавать 3D-модели на массиве данных состоявшего из нескольких миллионов 3D объектов. В компании продолжат обучение алгоритмов, а также будут работать над тем, чтобы повысить качество детализации генерируемых моделей.
Нейросеть Shap-E с легкость генерирует предметы, скульптуры, архитектуру. И после повышения качества генерируемых 3д моделей в будущем это может пригодиться для 3D-печати. Или созданные нейросетью 3д модели будут появляться в виртуальных мирах,
В настоящее момент многие созданные нейросетью 3д модели из выглядят очень просто и даже примитивно, но потенциал этой нейросети весьма значителен.
Нейросеть TripoSR
TripoSR AI — уникальная платформа от компании Stability AI и Tripo AI, которая использует искусственный интеллект для создания первоклассных и удобных в использовании трехмерных моделей за считанные секунды! Благодаря современным методам синтеза и алгоритмам машинного обучения нейросеть TripoSR AI позволяет пользователям мгновенно преобразовывать тексты или визуальные изображения в сложные 3D-проекты, значительно сокращая время и ресурсы, необходимые для художественного творчества.
Попробовать нейросеть TripoSR https://hubai.ru/triposr/
Нейросеть для создания 3D модели с помощью карты глубины
Нейронная сеть, называемая генеративно-состязательной сетью (GAN), может быть обучена для преобразования двухмерных изображений в трехмерные модели. В данном случае нейросеть использует маску глубины изображения для определения глубины каждого пикселя на изображении. Затем эта информация используется для создания трехмерной модели, которая включает в себя текстуры и цвета, соответствующие исходному изображению.
Модель созданная при помощи нейрости с помощью карты глубины https://skfb.ly/oFoQz
Для обучения нейронной сети требуется большой набор данных, состоящий из пар изображений: двухмерного изображения и соответствующей ему трехмерной модели. Эти данные могут быть получены с помощью специальных 3D-сканеров или путем ручной работы.
После обучения, генеративно-состязательная сеть может быть использована для преобразования любого двухмерного изображения в трехмерную модель. Однако, следует учитывать, что результаты могут быть не очень точными, особенно если исходное изображение имеет низкое разрешение или содержит сложные детали.
Одним из основных преимуществ создания нейронных 3D-моделей является то, что оно устраняет многие ограничения, связанные с другими методами. Например, фотореалистичные 3D-модели, созданные традиционными методами, требуют обширных ресурсов, включая дорогостоящее оборудование, специализированное программное обеспечение и квалифицированных операторов. Более того, создание этих моделей вручную требует значительного времени и усилий, особенно для сложных сцен. Напротив, новый подход позволяет быстро и экономично создавать невероятно детализированные модели на основе базовых изображений. Это также облегчает создание динамических анимаций с участием виртуальных персонажей, которые убедительно двигаются и ведут себя.
Эта технология имеет множество практических применений в различных отраслях. Например, в сфере развлечений кинематографисты и игровые дизайнеры могут использовать Neural 3D Model Generation, чтобы воплощать в жизнь вымышленные миры и персонажей с большей легкостью и эффективностью, чем раньше. Между тем, преподаватели могут использовать его, чтобы предоставить учащимся интерактивную и увлекательную среду обучения, выходящую далеко за рамки простых учебников и слайд-шоу. Архитекторы и инженеры могут использовать его для виртуального тестирования проектов перед созданием физических прототипов, тем самым экономя ценные ресурсы и сводя к минимуму ошибки. Медицинские работники потенциально могут применять его для моделирования операций, помогая им в подготовке процедур и снижая риски во время реальных операций. Кроме того, розничные предприятия могут извлечь из этого выгоду, предлагая клиентам персонализированную демонстрацию продуктов удаленно через приложения дополненной реальности.
Несмотря на огромные перспективы, существует ряд проблем, которые необходимо преодолеть, прежде чем генерация нейронных 3D-моделей получит широкое распространение. Некоторые эксперты утверждают, что нынешний уровень точности все еще может не соответствовать определенным стандартам в конкретных областях. Более того, вычислительные требования для запуска алгоритмов могут существенно повлиять на производительность системы и энергопотребление, что требует мощной аппаратной настройки. Тем не менее, исследователи продолжают добиваться успехов в решении этих проблем, поэтому вполне вероятно, что в ближайшем будущем нас ждут дальнейшие улучшения.
В заключение отметим, что создание нейронных 3D-моделей — это инновационная и преобразующая технология, которая обещает изменить многие аспекты нашей жизни. По мере развития этой технологии мы ожидаем увидеть все более сложные и универсальные реализации, которые откроют множество новых приложений.
Работа на заказ Имперский Перехватчик (Imperial Interceptor).
Не было задачи создавать красивые рендеры, потому что работу выполнял под печать на 3д принтере.
Использовал чертежи из интернета.
Изначально создал базовую геометрию в 3dmax, а затем продолжил работы в Zbrush.
Дальнейшая детализация модели. Не нашел ни одного референса о том как выглядит кабина изнутри этого аппарата, поэтому придумал все свое))
Итоговый результат детализации в Zbrush.
Разделения модели на составные комплектующие. В этом проекте нужно было заранее сделать кабель канал для проводов, потому что в кабине должен был быть установлен светодиод а в подставке заранее вырезанное место под источник питания, сзади отверстие для переключателя.
Модель размером 25х35см. Печать и окраска студии Crazy Craft Sochi.
Если вы хотите заказать подобную работу, вы можете обратиться в мой телеграмм канал: t.me/Sochi3dsculpt