Сохраните «рутину», которая, учитывая некоторый вклад, генерирует 3d модель - PullRequest
1 голос
/ 29 марта 2012

Ну, это время года, когда я был занят в своем новом, передовом проекте R & D (просто для удовольствия ... и, возможно, в конечном счете, с прибылью).

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

Однако основная часть этого проекта - это возможность генерировать 3d-модель из определенных входных критериев.Сгенерированная модель должна отличаться в каждом поколении.

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

Чтобы привести пример некоторого вывода:

var apple = new AppleGenerator();
apple->set_size_between(30, 50); // these two numbers are just samples...
apple->set_seeds_between(3, 8); // apple must have at least 3 seeds*
var apple_model = apple->generate();

// * I realize seeds may not be exactly part of the model, but I can't of anything else

Итак, мне нужно рассмотреть некоторые моменты здесь:

  1. Как сохранить эти модели в виде данных?
  2. Знаете ли вы какие-либо инструменты, которые могут помочь?
  3. Мне нужно учесть фактор случайности (например, яблоки будут иметь несколько разные формы каждый раз)
  4. Полагаю, математика сыграетхорошая часть здесь, но так как это сложные формы, будет невозможно создать необходимые формулы для каждой модели, верно?
  5. Кроме того, текстуры также должны относиться к каждой части модели.так, чтобы модель выглядела случайной (например, я мог бы детализировать красный цвет на 40–60 процентов, а остальное - зеленый для сгенерированного яблока).

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Посмотрите на некоторые основные архитектурные принципы, используемые для кодирования Spore , видеоигры о развивающихся живых существах: http://chrishecker.com/My_liner_notes_for_spore

Вот пример того, какXML-сериализация сетки вместе с некоторыми случайными изменениями поведения: http://www.ogre3d.org/tikiwiki/Morph+animation#The_XML_format_of_meshes_with_morph_animation

Чтобы все ваши яблоки немного отличались, вы можете применить случайное преобразование (или деформацию).См. Например: http://wiki.blender.org/index.php/Doc:2.4/Manual/Modifiers/Deform/MeshDeform

2 голосов
/ 29 марта 2012

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

Давайте рассмотрим несколько случаев:

Объект более или менее известен:

Самый простой случай - иметь 3d модель обычным способом, а затем немного ее рандомизировать.Взять, к примеру, яблоко.Рандомизация может варьироваться от размера яблока до цвета его текстуры и повреждения плода.

Все ваши объекты могут быть описаны с использованием поверхностей NURBS:

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

Ваши объекты имеют симметрию вращения:

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

На текстурах

Это намного сложнее, чемгенерация сетки.Это происходит главным образом потому, что текстуры несут гораздо больше информации, чем сетки (они более подробны).Вы можете иметь много стратегий генерации текстур.В случае вашего яблока вы можете выбрать несколько вершин, дать им цвета (один красный, один зеленый, другой красный и т. Д.) И интерполировать другие цвета вершин.Это создает плавный переход цветов, которые могут хорошо смотреться на яблоке.Однако если вы создаете нож, который выглядит просто ужасно.

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

Заключение

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

1 голос
/ 29 марта 2012

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

https://stackoverflow.com/questions/441388/most-common-3d-model-format

...