Игра с нуля — интересный челлендж для разработчика. Но если хотите пройти его на сложности Nightmare, можно еще и сделать собственный игровой движок, заточенный специально под проект. Подводных камней много, рассказываем, что важно знать при разработке такого гейм-дизайнерского софта, и что в него добавить.

Итак, вы задумались о создании собственного игрового движка. Отлично! У этого варианта множество плюсов в сравнении с использованием коммерческого — такого как Unity или Unreal. В этой статье разберемся, зачем разрабатывать свой движок, какие системы необходимо предусмотреть и как правильно подойти к процессу. 

Зачем?

Начнем с главного вопроса, который стоит задать себе, если вы решили разработать собственный движок: зачем это вам?

Резонными причинами могут быть, например, такие:

  • Хотите создать игру с использованием новой технологии, которую не поддерживают другие движки. Или поддерживают, но реализация слишком сложна и костыльна. Это может быть масштабная симуляция (Factorio), нестандартный проект, который не вписывается в готовые шаблоны (Noita, Miegakure), и множество других идей. В таких случаях нет иного выхода кроме как писать собственный движок под проект.

  • Хотите оптимизировать рабочий процесс под игры, которые создаете. Если для проекта не нужен полный объем возможностей коммерческого движка, есть смысл создать кастомизированный вариант с подходящими для конкретной игры редакторами и функциями. Если движок не затачивается под конкретный проект, стоит задуматься, так ли нужно самописное решение или все-таки достаточно готовых вариантов?

  • Не хотите в долгосрочной перспективе зависеть от чужих технологий. Если вы хотите иметь полный контроль над проектом, готовы самостоятельно исправлять ошибки (а не сидеть в ожидании багфикса от создателей) и не бояться, что очередное обновление сломает игру, то собственный движок — подходящий вариант! И не придется зависеть от прихотей крупных корпораций

  • Вам интересно разобраться, как устроены и работают игровые движки. Это отличная причина — по правде говоря, самый веский повод заняться разработкой собственного движка.

Раз уж начали составлять списки, то вот несколько неудачных причин браться за разработку движка. Если найдете свою среди этих пунктов — притормозите и подумайте еще раз. 

  • Вам кажется, что вы придумаете движок покруче, чем Unity или Unreal (или Godot, или GameMaker). Не выйдет. Разработать подходящий для специфических нужд софт можно  (см. предыдущий список), но в одиночку или маленькой командой невозможно создать универсальный движок, который будет конкурировать с известным универсальным ПО. Особенно при первой попытке.

  • Думаете, что иначе вы «ненастоящий программист»? Использование готового движка не делает гейм-разработчика хуже. Для того они и придуманы! Это просто инструмент для создания игр. 99% проектов можно разработать при помощи уже существующего софта — в этом нет ничего постыдного. Ведь главное — это сама игра!

  • Если вы хотите таким образом сэкономить время или деньги — забудьте! Создавать движок с нуля долго, а время = деньги. Использовать готовый софт выгоднее, чем пытаться разработать собственный. В долгосрочной перспективе это может стать выигрышной стратегией, но только если движок будет основой для нескольких прибыльных проектов, и при этом значительно удобнее в работе, чем коммерческие. Такое ПО разработать сложно, особенно если это первый опыт (и почти невозможно, если речь о 3D).

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

Я начинал с флэш-игр в 90-00х, и ни один движок того времени не поддерживал импорт флэш-анимаций. Единственным выходом было создать собственный софт. Намного приятнее и быстрее закидывать swf-файлы в папку с ресурсами и сразу использовать анимации в игре без промежуточных шагов типа экспорта в списки спрайтов.

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

Что?

Игровой движок — это рабочая среда, в которой создают игры. Он состоит из базы, на которой строится проект, и деталей, из которых, словно из деталей лего, состоит сама игра. Это золотая середина между «логикой игры» и «скучными техническими штуками»: благодаря движку в игровом коде не приходится вручную прописывать, как отобразить на экране условный треугольник, можно сразу заняться взаимодействием элементов.

Разные движки выполняют за вас разное количество работы. Некоторые просто отображают графику на экране (Flash, Pico-8). Другие сами по себе — целая игра с возможностью кастомизации или узко заточены под определенный жанр (RPGMaker, Ren’Py). А между ними — бесчисленное количество вариантов.

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

Базовые функции движка. 

Это основы, необходимые для того, чтобы начать создавать игры.

Инициализация системы.

Приводит программу в боевую готовность после запуска — открывает окно, загружает данные. С этим (и не только!) справится стандартная библиотека SDL, проще ее и использовать. 

Контроль частоты кадров

Ограничивает частоту сменяемости кадров для плавного изображения и оптимизации работы.

Ввод

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

Рендеринг

Большинство (ну как минимум 75%) игр так или иначе используют графику, и за нее отвечает как раз движок. В 2D-игре минимальному рендеру достаточно отображать на экране текстурированные четырехугольники. Шейдеры, буферы вершин, однобуферная прорисовка, меши, материалы и так далее — это прекрасные опции, которые можно добавить позднее, если понадобится. Если хочется заморочиться с OpenGL или Vulkan и кастомизировать рендерер — на здоровье! Но помните, нет ничего постыдного в том, чтобы использовать для рендеринга готовые библиотеки типа Ogre3D. Выбор зависит от целей и потребностей разработчика, а также от того, какие задачи интереснее решать самостоятельно.

Математические и прочие утилиты

Желательно, чтобы к этим библиотекам имели доступ как игровой код, так и движок. Плюс — ко всем иным полезным функциям и формулам, которые вы найдете в процессе разработки. STB — отличный ресурс для поиска всевозможных утилит, которые могут пригодиться при создании движка.

Дополнительные функции

Еще несколько систем, которые лучше добавить в движок ближе к делу, когда они непосредственно понадобятся для игры:

Управление игровыми объектами и сценами

Можно кодить и вручную, но практичнее предусмотреть систему для обработки отдельных игровых объектов и коллекций. Это один из ключевых механизмов в движке, ведь он управляет логикой игры. Из каких компонентов состоят объекты, на какие типы событий реагируют, как происходит взаимодействие, что со структурой памяти, используется ECS? (Кстати, «чистый» неадаптированный ECS лучше применять только для специфических кейсов.) Эти и не только  вопросы должна покрывать система управления объектами и сценами. Для таких задач доступны готовые библиотеки (особенно для чистого ECS), но, поскольку эта структура сильнее остальных влияет на игровой код, я склоняюсь к принципу «сделай сам». Использование существующего решения вынудит постоянно думать о том, как вписать логику игры в рамки. А надо наоборот — адаптировать движок под выражение задуманной игровой логики.

Аудио

Звуковые эффекты и музыка здесь разделены, хотя и прячутся под одним названием. Основные необходимые функции — это запуск и остановка звуковых циклов и воспроизведение звуковых эффектов от начала до конца. Этим аудио не ограничивается, но даже с двумя базовыми опциями можно далеко продвинуться. Минус в том, что стандартные звуковые фреймворки (FMod and Wwise) — коммерческие и с кучей лицензионных ограничений. Однако большинство ресурсов с открытым кодом раздражают неудобством (передаю привет OpenAL). Сам я использую FAudio — на мой вкус, простая и комфортная в использовании база для построения сложных звуковых механик. 

Загрузка и управление файлами

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

Нетворкинг

Окей, нетворкинг (онлайн-мультиплеер) — это ОЧЕНЬ опционально. Если не планируется режим p2p, то и не заморачивайтесь. Однако эту систему чрезвычайно сложно встроить в движок, который разработан не с расчетом на многопользовательские игры. Поэтому, если вы планируете или допускаете добавление мультиплеера, подготовьте почву заранее, потому что иначе придется переделывать все системы. 

Это базовый набор систем, которые входят в игровой движок. Другие варианты типа обнаружения столкновений, физики, сериализации, анимации и UI уже опциональны. Они распространены, поэтому входят в большинство движков, но для создания игр не обязательны. Например, предотвращение столкновений можно обеспечить при помощи математических утилит и прописать алгоритм в коде игры. Простейшую гравитацию и ускорение можно настроить без физических движков типа Box2D or Bullet. А полная сериализация вообще лишняя, если нужно попросту сохранить чекпойнт. 

В самописном движке однозначно будет меньше систем и функций, чем в универсальном коммерческом. Такова цель! Unity и Unreal — огромные монолиты, и каждая отдельная игра использует лишь малую часть предложенных опций. Добавляйте только то, что нужно для вашего конкретного кейса и сосредоточьтесь на том, чтобы сделать инструменты разработки лучше и комфортнее в использовании. 

Озанкомьтесь с тем, как работают другие игровые движки, прежде чем браться за собственный. Разберитесь, какие парадигмы и алгоритмы они используют, что реализовано классно, а что раздражает. Попробуйте создать мини-игру на нескольких движках, чтобы понять, как они устроены. 

Как?

Итак, вы взвесили за и против, поняли, чего хотите, и решили все-таки взяться за создание движка. И как же это сделать?

Сразу к делу: делайте игру параллельно с разработкой движка. Это правило нельзя нарушать. Изучите основы как можно скорее и сразу же начинайте создавать на этой базе игру. Движок — ничто без игры. 

Это необходимо, потому что функционал движка должен соответствовать потребностям сделанных на нем игр. Нельзя понять, как построить хорошую анимационную систему, если проект не требует сложной анимации. Слабые места движка проявляются в процессе написания игры. Может быть, нужна древовидная система, благодаря которой дальние объекты не будут рендериться, пока не приблизятся на определенное расстояние? Я не знаю, и вы не узнаете, пока не соберете игровой уровень, который будет страшно зависать. И даже тогда проблема может оказаться не в обновлении объектов — чтобы понять, надо проверить. 

Не программируйте того, что не нужно. Если единственный UI в игре — кнопка Play в главном меню, поздравляю! Не придется создавать мудреный пользовательский интерфейс. В The End Is Nigh нет ни физического движка, ни детектора столкновений. Там даже нет камеры, потому что она там не нужна. Я использовал электронную таблицу .csv, чтобы собрать карту мира, вместо всяких сложных редакторов. Делается легко и нормально работает.

Не буду вдаваться в подробности реализации — способов слишком много, каждый подходит для определенных случаев. Нет «наилучшего варианта рендеринга» или «самого правильного способа управления объектами». Все зависит от игры. Начинайте с основ и расширяйтесь по мере необходимости.

Что касается языков программирования — выбирайте, каким лучше владеете. Разработка движка — сама по себе непроста, а если делать это параллельно с изучением С++, обе эти задачи станут в два раза сложнее. C# идеально подойдет для создания движка. Медленнее, чем на С++, но не критично. Более медленный язык типа Python может вызвать затруднения, если в игре много движущихся объектов… но для некоторых игр пойдет. Используйте, что удобно. 

И еще — с первой попытки идеально не получится. Моей первой игрой на самописном движке стала Closure, и в ней полный бардак (забавно, что ее номинировали на награду «Техническое совершенство» на фестивале независимых игр в 2010 году). Системы рендеринга и обновления вдвоем обрабатывали всю игру. Добавлять новые объекты было крайне трудоемко, приходилось дописывать кучу кода и  работать с кривыми редакторами анимации, так что в итоге осталось с дюжину интерактивных предметов. У некоторых из них было несколько вариаций, кардинально менявших поведение объекта — это было проще, чем добавлять новые. Так что прожекторы, зеркала и турели по сути один и тот же объект! 

Но с ошибками приходит и опыт. Движок Closure написан кое-как, но оказался достаточно хорош, чтобы запустить игру на PS3. Идея переписать некоторые части движка была заманчивой, но это лишь отложило бы выход игры. Вместо этого я писал заметки о том, что получилось плохо, чтобы учесть ошибки в следующий раз. Особенно о том, что мешало непосредственно созданию игры. То же и с The End is Nigh. В ее движке (который, кстати, НАМНОГО лучше, чем в Closure) все равно была куча ошибок, которые я решал, стиснув зубы. Как только игра вышла, я сразу начал улучшать движок для следующего проекта, исправлять раздражающие баги и добавлять новые функции. 

И так раз за разом: учишься, создаешь игру, запускаешь, и все по новой. До тех пор, пока движок не станет действительно хорош. 

Не стал вдаваться в технические подробности, как внедрить в движок каждую отдельную систему. Это зависит от конкретных вариантов использования, есть сотни способов — и каждый из них правильный. Понять, что вам подходит — ВОТ в чем суть разработки движка, с таким настроем стоит браться за создание собственных проектов.

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

Комментарии (29)


  1. Travisw
    08.02.2022 16:24
    +2

    Я вот в раздумьях, потратил где-то 8 лет для написания игры(с перерывами разной длительности). Изучал С++ и графическую библиотеку одновременно, напечатал карточную игру, но код был ужасный(код не сохранился). В чем проблема печатать свой движок расскажу вкратце. Сначала сталкиваешься с проблемами языка на котором печатаешь, потом с тем как обрабатывать изображения, звук, устройства ввода типа клавиатуры или мыши. Далее с тем как управлять камерой (если нужно), печатаешь алгоритм управления cpu, делаешь интерфейс ui, потом упераешься в то, что надо создавать 3d модели (а код одной модели выходит за рамки экрана и состоит из нескольких тысяч строк кода), потом когда думаешь чтобы вынести его в файл отдельный, приходится печатать универсальный загрузчик для любой модели в твою игру/программу(я нахожусь пока здесь). Далее надо создать мир/сцену грубо говоря terrain. И как бы готово! Но в чем медлительность этого всего на моем примере, скажу так чтобы добавить что-то новое в игру, приходится печатать несколько строк, а можно/нужно сделать так как например в unreal или например в maya. Чтобы мышкой перетягивать/задавать координаты, выбирать текстуры(что удобнее и быстрее), остается только разобраться как это все добавить. А дальше вас остановит только ваш полет фантазии. Но как сказал автор время=деньги и батрачить ради своего движка уйдет уйма времени и денег. Вы разве не заметили, что все эти движки типа creation engine, frostbyte, cry engine у каждой студии свой движок и они мало кому нужны, а ваш движок напечатанный одним человеком, будет очень минимальным для ААА проектов и никому не нужным. Если бы я мог вернуться во времени назад я бы не стал этого делать, молодость прошла незаметно потраченное на это.


    1. noRoman
      08.02.2022 16:31
      +1

      Зато получен бесценный опыт в разработке.


      1. Travisw
        08.02.2022 16:38

        на динозаврских технологиях никому не нужных теперь


        1. noRoman
          08.02.2022 16:48
          +1

          А как же алгоритмы? Развитие мышления? Я думаю у вас всё не зря.


          1. Travisw
            08.02.2022 21:53
            +3

            Самое забавное, что я не помню кода, уже год ничего не делал. И еще совет, не вкручивайте сложные конструкции кода и формулы, даже комментарии не помогут. Так что зря - не зря, люди которые моего возраста закалачивают неплохие деньжата, работая на всяких дядь изучив один фреймворк или пару. А у меня так голый опыт, на который если взять там например какого-нибудь профи по играм, разнесёт меня в пух и прах на собесе.


      1. Aleksandr-JS-Developer
        09.02.2022 21:57

        Слишком тонко


    1. jmdorian
      08.02.2022 17:32
      +2

      приходится печатать универсальный загрузчик для любой модели в твою игру/программу(я нахожусь пока здесь)

      Простите, но зачем? Если ответ - чтоб набраться опыта, то ок. Но как по мне разработка движка и разработка каждого отдельного компонента - это разная работа, и цели у нее разные. По мне так важно соблюдать баланс между собственной разработкой и использованием готовых решений. В частности для импорта моделей есть assimp, работающий со всеми популярными форматами.
      А иначе недолго до переписывания STL скатиться, что совсем далеко от написания игрового движка, и уж тем более от создания игры.


      1. Travisw
        08.02.2022 18:37

        Да я слышал про assimp, но в том то и дело, что я не собираюсь же на ассемблере например печатать этот загрузчик. Но ведь даже его печатать тоже надо, а мотивации 0 это делать, сил уже никаких нет. Есть видео на ютубчике про него, на английском, ну может когда-нибудь, но не сегодня. Между завтра и никогда вот.


      1. Le0Wolf
        09.02.2022 00:30

        Ну... кто-то (не будем тыкать пальцем на Unreal engine) и stl свой имеет ) И у этого есть даже свои плюсы, поскольку туда можно всякое профилирование понатыкать и всяких крутых штук из C++20, чтобы потом видеть нормальный текст ошибки при компиляции, а не "в десятитысячной строке стотысячного файла stl возникла ошибка: _Ty не соответствует fhdvgdfhgdfg3!+333" ))


    1. AtariSMN82
      09.02.2022 00:15
      +1

      Мне тоже стало трудно добавлять в игру хоть что-то новое, придётся делать отдельный редактор эммитеров и пилить универсальные загрузчики. Хочу потратить молодость на это ;]

      Уже трачу


    1. Prizrak
      09.02.2022 16:36
      +1

      Очень вас понимаю. Я вот к тому же хватаюсь и за разные технологии и языки. Вроде бы как и сказали опыт. Но кто-то, как вы скзаали выучить 1 фреймворк и зашибает деньги. А тут знания есть и разнообразные и опыт большой, но все этопо отдельности не нужно.


    1. adictive_max
      11.02.2022 05:44

      чтобы добавить что-то новое в игру, приходится печатать несколько строк, а можно/нужно сделать так как например в unreal или например в maya. Чтобы мышкой перетягивать/задавать координаты, выбирать текстуры(что удобнее и быстрее)
      Вот по этому же принципу, кстати, часто выбираются и готовые движки. Для последнего микро-проекта (платформер на пару уровней для встройки в сайт) изначально был вариант взять Phaser, он и оптимизирован под web лучше и сборка по итогу весит меньше, но в конечном итоге был выбран Godot, потому что сцены были довольно большие и сложные, а удобный визуальный редактор сцены и встроенный упаковщик ресурсов сократили время разработки, а значит и бюджет для заказчика, раза в 2.


  1. KislyFan
    08.02.2022 23:06
    +3

    Но помните, нет ничего постыдного в том, чтобы использовать для рендеринга готовые библиотеки типа Ogre3D

    Эх, где мои 17 лет? Я иногда скучаю по тому ламповому времени, всем этим танцам с бубном по соединению Ogre, Physix, OpenAL, MyGui и Lua.. а все чтобы увидеть зеленого нинзю бегающего по полигону.


    1. AtariSMN82
      09.02.2022 00:08

      ОпенАл кул тема, интересно попробовать 3д звук. Там ещё velocity есть в параметрах, наверное с помощью него можно делать жффекты удаления/приближения к объекту


  1. AtariSMN82
    09.02.2022 00:02
    +1

    Взялся за игростроение, уже второй год пишу движок для своей 2d shoot'em'up игры. Всё взял прогрессивное - clang c++20, opus, stb_image, ffmpeg, webp, yaml, glfw. Начал бойко, а в середине разработки сильно просел - плохая модульность, зависимости классов друг от друга и баги что выстреливают через долгое время после их добавления, всё это сделало разработку рутиной не связанной с самой игрой да и тесты на публике добавили новых требований типа плавной анимации на 144гц мониторах и низких инпут лагах. Со всем этим я разобрался только сейчас благодаря гайдам от дедов, книжкам по гейм дизайну и советам по организации кода большого проекта. Если бы я знал бы это всё когда начинал, то... то ничего бы не изменилось, я бы даже не смог понять все эти советы, ведь не знал бы какие проблемы они могут решить. Надеюсь моя разработка не затянется на 7 лет, уж лучше бы на Годоте игры стряпал


  1. Le0Wolf
    09.02.2022 00:14

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

    1) Игровые движки отнють не универсальны, в большинстве случаев разработчик упёрся в ограничения, которые будут либо оооочень сложно обходиться либо вообще будут непреодолимыми без доступа к исходниками движка

    2) Игровые движки не основываются на SDL (если мы говорим о движках уровня Unreal Engine), у них часто даже стандартная библиотека своя (хотя вот кодеки видео, аудио и т.д. обычно ни кто свои не изобретает)

    3) Контроль частоты кадров - плохая практика (как то имел "счастье" общаться с одним игроком, который называл разработчиков игр рукопожатие ибо в одной старой игре у него на современной вилеокарте никогда не было больше 60 фпс). Контролировать надо физику, а кадры должны крутиться на максимум, на сколько позволяет железо

    4) Ввод на SDL на винде (на других платформах не знаю как) - это обработка событий winapi, что для игр не очень походит. Следовательно SDL и для ввода тоже не очень

    5) Ogre вроде как не библиотека, а полноценный графический движок

    6) FMod бесплатный для некоммерческих проектов и инди проектов


  1. HexExort
    09.02.2022 09:04

    круто)


  1. MrSung
    09.02.2022 09:04
    +2

    Писать движок нужно, чтобы было портфолио или если дохлый комп.


  1. Demanih
    09.02.2022 13:28
    +2

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

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


    1. Spectrum-Hyena
      09.02.2022 17:52

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

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


  1. OlegPatron92
    09.02.2022 22:03

    Как всё сложно :facepalm: Технические сложности всегда были последней проблемой в создание чего-либо. Всё упирается в команду, рынок, личные насущие потребности. Увы в наше время в нашем обществе очень часто как "Лебедь, рак и щука", каждый сильный программист хочет вытянуть что-то сам. Нету консолидации, доверия, веры в общее дело, как уверенности в своей изощренности. ИМХО.


  1. PsihXMak
    09.02.2022 22:46

    Сейчас как раз изучаю тему программирования графики. Добавлю свои ссылки, если кому интересно:

    1. Learning Modern 3D Graphics Programming - Классная книга, которая на пальцах объясняет базовые принципы работы 3D графики.

    2. Vulkan - По моему мнению, самая продвинутая на данный момент api для работы с 3D графикой. Ничем не уступает DirectX.

    3. Книга Роберта Нистрема "Паттерны Программирования Игр". Удалось урвать бумажный вариант. Просто отличная книга, где буквально написно, как логически создавать игры.

    4. Книги Кнута по Алгоритмам. Лично мне они показались нудноватыми, по этому я взял книгу "Грокаем Алгоритмы" Адитья Бхаргава. По моему, там вполне достаточно информации по алгоритмам, что бы работать с 3D графикой.


  1. Miheev2
    10.02.2022 10:36

    Уже отчаялся, но может тут кто знает.

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

    Все игровые движки по умолчанию имеют неотключаемве упрощения. А требуется именно 100% реализм, ограниченный только в мощность железа. Что бы вероятность прохождения плоскостей друг в друга хоть на 1мм, или улетания объекта в космос была 0.

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

    Цена/сложность не важна. Что бы не писать самому, может уже существует такой инструмент? Или я первый кто о таком задумался?


    1. PsihXMak
      10.02.2022 11:53

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

      Все игровые движки по умолчанию имеют неотключаемве упрощения. А требуется именно 100% реализм, ограниченный только в мощность железа.

      Это не так. Все игровые движки упираются в мощность железа. А "урощения" - оптимизации, которые позволяют работать с текущим железом.

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


      1. Miheev2
        10.02.2022 11:59

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

        Они считают физику на сервере, как эталон достоверности. А ни клиентах уже может использоваться упрощённая предскзательная, а сервер иногда сообщает реальное положение.

        Но как понимаю, ваш ответ - такого инструмента нет, надо писать самому.


        1. PsihXMak
          10.02.2022 14:28

          Если имеется в виду рендер в реальном времени - нет, такого нет и быть не может. Это физически невозможно.

          Если имеется в виду симуляция различных физических моделей, то можно посмотреть в сторону программ 3D анимации. Также, думаю, есть научный софт, но, это всё уже не из моей области.


          1. Miheev2
            10.02.2022 22:27

            Так почему в реальном времени невозможно?
            Если на расчёт требуется X мощности, а мощность железа 2X, то что помешает просчитать?

            Нужна именно 3D симуляция, но динамическая.
            Создал объекты, и они между собой взаимодеййствую в среде, подаются команды и тд.
            Не заготовка.

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


            1. PsihXMak
              11.02.2022 09:27

              Так почему в реальном времени невозможно?

              Потому что невозможно просчитать движение всех частиц во вселенной?

              Потому что, что бы посчитать элементарное освещение в мультике, потребуется пол года работы сервера на 55000 ядер?


              1. Miheev2
                11.02.2022 10:01

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

                Или погнулись, или разрезались и тд.

                Это точно выполнимая задача и на простом ПК, но нужна лишь библиотека..

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