Создание меша. Создание разрушаемых мешей

Настройка WI-FI 01.12.2021
Настройка WI-FI
Меш (Mesh) или Градиентная сетка подходит и для EPS8 и для EPS10. Единственное, что Mesh лучше изначально рисовать в Adobe Illustrator, так как при сохранении в EPS из других программ (например, CorelDraw) меш может растрироваться. (А может и нет, тут уж сами проверяйте). Урок по основам меша представил мне Гринько Валерий, за что ему огромное спасибо, а так же честь и хвала. 🙂 Для отрисовки меша для стоков сначала необходимо выбрать фото. И фотография должна быть именно своя. Не пытайтесь искать хорошее фото в интернете в надежде, что автор его не узнает, что вы его отрисовали. И не пытайтесь изменять его. Лучше возьмите свое фото, пусть не такое красивое, но все же свое. Тем более, что для отрисовки Mesh вам не понадобится исключительное качество фотографии. Сам автор этого урока уже «погорел» на такой оплошности. Отрисовал чужую фотографию коктейля, за что удалили его аккаунт. И теперь он вынужден раскручивать свой аккаунт снова.

По поводу съемки фотографии. Снимайте в естественном свете, то есть без вспышки, и тогда блики и тени, которые вы будете отрисовывать с помощью Mesh, будут иметь красивый естественный вид. Фото необходимо вставить в Adobe Illustrator и заблокировать слой, на котором он находится. Саму градиентную сетку можно делать двумя способами. Мы рассмотрим только их принципы.

Первый способ.

1. Создать новый слой и на нем нарисовать фигуру по форме совпадающую с объектом. На примере мы нарисовали окружность, по форме близкой к вишне.
2. А затем эту фигуру нужно переделать в градиентную сетку инструментом Mesh (U), кликая им по середине. В результате чего появится сетка.
3. Слой с мешем следует поместить под слой с фотографией. В нашем случае это слой Layer2. 4. А после чего приступить к самому главному, к моделированию сетки по форме вишни. Добавление новых узлов сетки производим инструментом Mesh (U), а их перемещение и выделение белой стрелочкой Direst Selection (A). Сколько нужно создать узлов? Если создать слишком мало, форма получится слишком гладкой и только издали будет подходить на рисуемый объект. Если сразу создать слишком много, то можно запутаться с редактированием. Поэтому нужно стараться максимально минимальным количеством узлов сетки создать приемлемую форму. Ограничений здесь нет, речь только о целесообразности. Узлов должно быть больше там, где есть изменение цвета.
5. После того, как сетка создана, можно переходить раскрашиванию. Образцы цвета можно брать прямо с фотографии. Сначала активируем белую стрелочку (A), затем выбираем инструмент Пипетка Eyedropper (I). Для того, чтобы выбрать точку зажимаем , то есть временно активируем белую стрелочку, щелкаем по нужной точке на Mesh, которой хотим придать цвет, затем отпускаем и щелкаем на фотографии на то место, где нужно этот цвет получить. Для того, чтобы выделить несколько точек и задать им один цвет, дополнительно к нужно нажать еще и . Переключая видимость слоя с фотографией мы можем отслеживать изменение в нашем моделируемом объекте.
Сначала мы получаем нечто такое, а потом добавляя точки, перемещая их и задавая им цвет, мы доводим форму до совершенства. Тут не лишними были бы знания и чувство формы и цвета, но, думаю, что многое приходит с опытом.

Второй способ.

Иногда форма объекта бывает очень сложной и построение сетки Mesh может быть осложнено тем, что она будет вести себя непредсказуемо. Тогда Mesh можно сделать другими способом: сделать Mesh из прямоугольника, а затем применить к нему маску в виде искомой формы.

1. Создаем прямоугольник и делаем из него Mesh точно так же, то есть инструментом Mesh (U) щелкаем по прямоугольнику, чтобы появилась сетка. 2. Создаем форму объекта, в нашем примере это будет круг. Помещаем его поверх прямоугольника-меша и делаем из него маску, то есть выделяем эти два объекта из из контекстного меню, вызванного правой кнопкой мыши, выбираем Make Clipping Mask.
3. Далее раскраску производим таким же образом.

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

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


Эта страница была показана 41007 раза.

Аналогичная техника применяется для отображения изображений с МРТ , metaball-ов и для вокселизации рельефа.

В этой части я расскажу о технике создания разрушаемого рельефа Marching Cubes, а в более общем применении - для создания плавного граничного меша твёрдого объекта. В этой статье мы начнём с рассмотрения двухмерной техники, затем трёхмерной, а в третьей части рассмотрим Dual Contouring. Dual Contouring - это более совершенная техника, создающая тот же эффект.

Наша цель

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

Функция - это отличный способ описания произвольной фигуры. но она не помогает нам отрисовать её.

Для отрисовки нам нужно знать её границу , например, точки между положительными и отрицательными значениями, где функция пересекает ноль. Алгоритм Marching Cubes берёт такую функцию и создаёт полигональную аппроксимацию её границы, которую можно использовать для рендеринга. В 2d эта граница будет непрерывной линией. При переходе в 3d она становится мешем.

Реализация двухмерных Marching Cubes

Примечание: код на python , в котором содержится откомментированный код со всем необходимым.

Для простоты давайте начнём с 2d, а позже перейдём к 3d. Я буду называть алгоритмы в 2d и в 3d «Marching Cubes», потому что по сути они являются одним алгоритмом.

Шаг 1

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

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

Шаг 2

Затем мы обрабатываем каждую ячейку отдельно, заполняя её соответствующей границей.
Простая таблица поиска обеспечивает 16 возможных комбинаций углов, находящихся снаружи или внутри. В каждом случае она определяет, какая граница должна быть отрисована.
Все сочетания двухмерных marching cubes

Шаг 3

После повторения процесса для всех ячеек границы соединяются, создавая готовый меш, даже несмотря на то, что каждая ячейка рассматривалась независимо.
Отлично! Думаю, это в целом походит на исходный круг, описанный формулой. Но как видите, он весь изломан, а отрезки расположены под углами в 45 градусов. Так получилось, потому что мы решили выбрать вершины границ (красные квадраты), равноудалённые от точек ячейки.

Адаптивность

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

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


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

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


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

Часть 2. Трёхмерные Marching Cubes

Итак, в 2D мы разбиваем пространство на сетку, а затем для каждой вершины ячейки вычисляем, где находится эта точка - внутри или снаружи сплошной области. В 2d-сетке у каждого квадрата по 4 угла, и для каждого из них есть два варианта, то есть у каждой ячейки существует возможных комбинаций состояний углов.

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

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

Плохая новость заключается в том, что у куба 8 углов, то есть существует рассматриваемых возможных случаев. И некоторые из этих случаев гораздо более сложны, чем в 2D.

Очень хорошая новость заключается в том, что нам совершенно не нужно в этом разбираться. Вы можете просто скопировать собранные мной случаи и перейти сразу к разделу с результатами («Соединяем всё вместе»), не задумываясь обо всех сложностях. А потом начать читать о dual contouring, если вам нужна более мощная техника.

Все сложности

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

Вы всё ещё читаете? Отлично, мне это нравится.

Секрет заключается в том, что мы на самом деле не обязаны собирать все 256 различных случаев. Многие из них являются зеркальными отражениями или поворотами друг друга.


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

Остальные два случая можно найти простым поворотом первого случая.

Мы можем использовать ещё один трюк:


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

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

Единственный разумный человек

Если прочитать или большинство туториалов по Marching Cubes, то в них говорится, что необходимо всего 15 случаев. Как же так? Ну, на самом деле это правда - три нижних случая с моей схемы не обязательно нужны. Вот снова три этих случая в сравнении с противоположными им другими случаями, дающими схожую поверхность.
И второй, и третий столбцы правильно отделяют сплошные углы от пустых. Но только когда мы рассматривает один куб в отдельности. Если посмотреть на рёбра каждой грани ячейки, то можно увидеть, что они различаются для второго и третьего столбцов. Инвертированные не будут правильно соединяться с соседними клетками, оставляя отверстия в поверхности. После добавления лишних трёх случаев все ячейки правильно соединяются.

Соединяем всё вместе

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


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

Часть 3. Dual Contouring

Marching Cubes просты в реализации, поэтому часто используются. Но у алгоритма есть множество проблем:


Что же нам делать?

На сцене появляется Dual Contouring

Примечание: в этом туториале больше рассматриваются концепции и идеи, чем методы реализации и код. Если вам больше интересна реализация, то изучите реализацию на python, в которой содержится откомментированный код со всем необходимым ( и ).

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

Dual Contouring помещает в каждую ячейку по одной вершине, а затем «соединяет точки», создавая полный меш. Точки соединяются вдоль каждого ребра, имеющего смену знака, как и в marching cubes.


Примечание: слово «dual» («двойственный») в названии появилось потому, что ячейки в сетки становятся вершинами меша, что связывает нас с двойственным графом .

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

Получение градиента

В нашем простом примере с 2d-кругом радиуса 2,5 задаётся следующим образом:
(другими словами, 2,5 минус расстояние от центральной точки)

Воспользовавшись дифференциальным исчислением, мы можем вычислить градиент:


Градиент - это пара чисел для каждой точки, обозначающих, насколько изменяется функция при движении по оси x или y.

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


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

Адаптивность

Пока мы получили такой же ступенчатый вид, который был и у Marching Cubes. Нам нужно добавить адаптивности. В алгоритме Marching Cubes мы выбирали, где вдоль ребра будет находиться вершина. Теперь мы можем свободно выбирать любую точку внутренностей ячейки.

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

И градиенту. Заметьте, что мы сэмплировали градиент вдоль рёбер, а не в углах.


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

Переходим в 3d

Случаи в 2d и в 3d на самом деле не очень отличаются. Ячейка теперь является кубом, а не квадратом. Мы выводим грани, а не рёбра. Но на этом различия заканчиваются. Процедура выбора одной точки в ячейке выглядит так же. И мы по-прежнему находим рёбра со сменой знака, а затем соединяем точки соседних ячеек, но теперь уже четырёх ячеек, что даёт нам четырёхсторонний полигон:


Грань, связанная с отдельным ребром. У неё есть точки в каждой соседней ячейке.

Результаты

Dual contouring создаёт гораздо более естественные формы, чем marching cubes, что можно увидеть на примере созданной с его помощью сферы:


В 3d эта процедура достаточно надёжна, чтобы выбирать точки, находящиеся вдоль ребра острого участка и выбора углов при их возникновении.

Проблемы

Колинеарные нормали

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

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

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


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

Техника 1: решение QEF с ограничениями

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

Техника 2: смещение QEF

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

Благодаря этому решение всего QEF стягивается к центру.

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

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

Подробнее обе техники показаны в коде .

Самопересечения

Ещё одна проблема dual contouring заключается в том, что иногда он может генерировать самопересекающуюся 3d-поверхность. В большинстве случаев на это не обращают внимания, так что я не решал эту проблему.

Существует статья, в которой рассказывается о её решении: «Intersection-free Contouring on An Octree Grid», Ju and Udeshi, 2006

Однородность

Хотя получаемый dual contouring меш всегда герметичен, поверхность не всегда является хорошо заданной. Так как на ячейку приходится всего одна точка, при прохождении через ячейку двух поверхностей она будет общей для них. Это называется «однородным» мешем и может вызывать проблемы у некоторых алгоритмов текстурирования. Проблема часто возникает, когда сплошные объекты тоньше, чем размер ячейки или несколько объектов почти касаются друг друга.
Обработка таких случаев является значительным расширением функционала базового Dual Contouring. Если вам нужна эта функция, то рекомендую изучить эту реализацию Dual Contouring или

Расширение алгоритма

Благодаря относительной простоте создания мешей Dual Contouring гораздо проще расширить до работы со схемами ячеек, отличающихся от рассмотренных выше стандартных сеток. Как правило, алгоритм можно выполнять для октодеревьев , чтобы получить различные размеры ячеек ровно там, где нужны подробности. В целом идея аналогична - выбираем по точке на ячейку с помощью сэмплированных нормалей, затем для каждого ребра со сменой знака находим соседние 4 ячейки и комбинируем их вершины в грань. В октодереве для нахождения этих рёбер и соседних ячеек можно использовать рекурсию. У Мэтта Китера есть об этом.

Другое интересное расширение заключается в том, что для Dual Contouring нам необходимы всего лишь определение того, что находится внутри/снаружи, и соответствующие нормали. Хотя я говорил, что у нас для этого есть функция, мы можем извлечь ту же самую информацию из другого меша. Это позволяет нам выполнить «ремеш», т.е. сгенерировать чистое множество вершин и граней, очищающих исходный меш. В качестве примера можно привести модификатор remesh из Blender.

Дополнительное чтение

  • Dual Contouring - это одна из множества похожих техник. См. другие подходы со своими плюсами и минусами в списке SwiftCoder .

Теги: Добавить метки

В данном туториале я максимально подробно расскажу, как создать новый меш предмета в The Sims 2 , используя средства SimPE и 3dsMax.

В сети есть множество туториалов о том, как сделать свой собственный уникальный объект для Симс 2 . Я хочу добавить немного больше от себя того, чего я не увидела в других уроках. Но постараюсь не менее детально и доступно объяснить для новичков, как же все-таки сделать свой предмет, имея на руках следующие программы:
- SimPE (я пользуюсь версией 0.68, есть более новая, но в ней отсутствует импорт/экспорт 3ds формата - придется скопировать папку с плагинами из старых версий, если вы пользуетесь этой версией)
- 3ds Max или любой другой 3D редактор, которым вы умеете пользоваться (здесь я буду рассказывать на примере Макса)

Предисловие: Также хочу заметить, что делать объект с нуля мы не будем. Все предметы делаются посредством клонирования из других объектов. Многие новички спросят: "Почему?" Да потому, что создание объекта с нуля – это не просто создание его меша и текстуры, помимо меша у предмета есть множество функций, характеристик, отвечающий в игре за его функциональность, месторасположение, взаимодействие с другими объектами и кучу других действий. Оставим это разработчикам, а сами возьмем их труд за пример и будем клонировать предмет уже с готовыми функциями. Но не переживайте, предмет в последствии станет отдельным и уникальным объектом!

1. Совместимость предмета с игрой.

Прежде, чем начать, хочу обратить ваше внимание на то, что не все предметы совместимы с оригинальной версией игры. Например, если вы клонируете регистрационную стойку для гостиницы, то она будет работать только при наличие аддона Бон Вояж, если клонируете автомобиль, то он работает под дополнение Ночная жизнь. Но бывает и так, что вы клонируете какой-то простой стандартный предмет, а он почему-то не работает у других ребят.
Все дело в аддонах. Вы можете клонировать обычный холодильник, имея на руках, допустим, дополнение Бизнес, которое добавляет в него функцию для готовки порций на продажу. И кажется, что он должен работать у всех, но почему-то те, кто не имеет этого дополнения жалуются, что предмет не появился в режиме покупок или вызывает ошибку и сбой игры.
Если вы хотите, чтобы ваш предмет был универсальным и работал без совместимости с аддонами (то есть, он будет работать даже у тех, у кого вовсе нет дополнений, только оригинальная игра), то я предлагаю следующий вариант:
- зайдите в SimPE в верхнее меню Extra - Preferences

Перейдите во вкладку File Table

Здесь вы увидите список установленных у вас аддонов, если вы хотите убрать совместимость предмета с ними, снимите их галками.

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

2. SimPE - клонирование предмета

Итак начнем создание объекта. Запустите SimPE, если он еще не запущен. Нам нужно открыть закладку Object Workshop, она должна быть в правом верхнем углу. Если же ее там нет, зайдите в Window - Object Workshop.

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

Нажмем Next, выберем Clone (Клонировать) со следующими настройками:

Примечание: я заметила, что при клонировании таких объектов, как кровати, шторки и некоторые столешницы, пропадает текстура в пакете. Долго мучалась, и потом сообразила: оказывается, такие объекты при клонировании берут текстуру у стандартных объектов, из которых они клонированы. Если же вы хотите, чтобы у вашего предмета была своя собственная текстура, то при клонировании таких объектов нужно выделить параметр Create a stand-alone object

Итак, идем дальше. Теперь появится окно с выбором названия объекта, его ценой и описанием. Можете вписать туда свои параметры. Советую вписывать на английском, поскольку игра не у всех русифицирована и ваш русский шрифт превратится просто-напросто в иероглифы. Жмем Finish.
Появляется следующее окно:

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

3. SimPE - назначение уникального GUID (делаем наш объект уникальным).

В 1-м этапе мы создали полноценный клон предмета, который заменяет оригинал в игре. Но теперь нам нужно его отделить от оригинала и сделать полноценным уникальным объектом. Для этого не выходя из SimPE, заходим в дерево ресурсов (Resource Tree) - Object Data (OBJD)

В окне Resource List вы увидите файл, нажмите на него. Теперь в нижнем левом углу перейдите на вкладку Plugin View и нажмите на кнопку Get GUID

Здесь нужно зарегистрировать себя как нового юзера для получения уникальных GUIDов для своих объектов. И в дальнейшем ваша авторизация будет появляться автоматически при получении GUIDов.

Что такое GUID? Это некий номер, который имеет каждый объект в игре. Если вашему объекту не назначен уникальный номер, он будет иметь номер прототипа, из которого был клонирован, и будет заменять его в игре. За вами выбор - делать уникальный объект или заменяющий стандартный, смотря, чего вы хотите добиться.

Нажимаем Register Object, после чего поле GUID обновляется на новый код. Выберите галкой Update all MMATs и нажмите на Update MMATs and commit. После этого можете сохранить свой пакет (File - Save).

Примечание. Если в данном разделе вы видите несколько файлов, получение GUID"ов для них производите следующим образом:
- найдите название основного файла (тот, который не имеет окончания А, В или С), у меня это Table - Dining - Formica. При получении GUIDа для него, перед тем, как нажать Update MMATs and commit, поставьте галку Update all MMATs - это обновит все гуиды в разделе Material Override.
- после этого для файлов с окончанием А, В, С или D получение GUID"ов происходит без включения галки Update all MMATs

В Overall Sort вы можете поменять раздел, в котором появится ваш предмет в Режиме покупок.

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

4. SimPE - экспорт меша и текстур.

Теперь наш объект готов к использованию, но его внешний вид еще не изменен. Для того, чтобы достать из пакаджа меш объекта,
1 - зайдите в Geometric Data Container (GMDC) в дереве ресурсов (Resource Tree),
2 - кликните на файл в закладке Resource List и внизу 3 - перейдите на вкладку Plugin View.

Внизу вы увидите окошко с несколькими (либо одним) файлом - это части меша.

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

Строчки с концовкой shadow нам не нужны (это тени от объекта). Поставьте галку напротив нужного меша и кликните Preview, чтобы посмотреть, что вы выбрали и убедиться, что это то, что вам нужно. (перемещение превьюшки - левая кнопка мыши, вращение - правая кнопка мыши, увеличение - удерживая колесико мыши, вперед-назад).
Теперь выберите координаты XYZ (если вы перепутаете координаты, ваш стол может лечь боком на пол) и нажмите Export.
Появится окно с выбором директории, куда сохранить экспортированный файл. Предлагаю сохранить файл в папку с нашим проектом и дать ему название 01. Если вы работаете в 3ds Max, формат выбираете.3ds. Экспортируем файл.

Теперь выудим из пакаджа текстуры. Зайдем в Дереве ресурсов (Resource Tree) в ветку Texture Image, кликнем на файл в рабочем окне Resource List и посмотрим на Plugin View. Черно-белые изображения - это альфа-каналы теней, нам не нужны. Выбираем цветные текстурки, которые взяты с самого объекта и нажимаем Export. Сохраняем в ту же папку с нашим проектом. Можете поменять им имя, это не столь важно.

5. 3ds Max - меняем меш (каркас) предмета.

Ну наконец-то, добрались до самого интересного! Хочу сказать: что все, что было до этого, только на первый взгляд выглядит сложным. Сейчас этап с клонированием и экспортом я прохожу максимум за 2 минуты. Я надеюсь, что вы также быстро привыкнете делать это, даже не заглядывая в данный туториал.

Те, кто умеет в нем работать, сами смогут сделать каркас без посторонней помощи. Те, кто впервые работает в Максе, советую пройти несколько туториалов из его справки или зайти в наш раздел по 3ds Max и потренироваться там. Но все же основные моменты я постараюсь описать очень подробно.

Есть 2 способа изменения меша: либо изменять уже существующий меш, либо создавать полностью новый, а затем подгонять его под размер оригинала. Я предлагаю второй вариант. Итак, чтобы загрузить наш меш в Макс, нажмем File - Import и выберем только что экспортированный.3ds файл. Почему я импортировала его до создания нового меша? Потому, что вам уже есть, с чем сравнивать создаваемый меш как в масштабе, так и по габаритам.

Возьмем самые простые фигуры (Create - Standart Primitives) или же более сложные (Create - Extended Primitives) и сделаем из них простой столик. Я возьму обычный Box и Cylinder. Вы можете делать любые модификации с этими фигурами, чтобы добиться сложных изгибов. Помните, что в основе любой сложной фигуры все равно лежит какая-то простая, которую вы потом просто видоизменяете и модифицируете.

Немного об интерфейсе 3ds Max для тех, кто ничего в нем не понимает:
Чтобы выделить и начать редактировать фигуру, нажмите на нее правой кнопкой мыши Convert to - Convert to Editable Mesh. После чего появятся функции редактирования меша (Vertex - Вершины, Polygon - Полигоны и т.д.) Чтобы закончить редактирование, снова нажмите Convert to - Convert to Editable Mesh.
Чтобы увеличить/уменьшить фигуру, в тех же функциях редактирования меша есть Scale - Масштаб (используйте сразу все координаты для изменения масштаба, иначе при увеличении по одной координате ваш меш растянется.
Для поворота фигуры используйте Rotate
Для движения фигуры пользуйтесь Move
Если вы хотите слить 2 фигуры в одну, пользуйтесь Attach
Включить / выключить отображение граней F4 (очень удобно при работе с разверткой текстуры)

Внимание!!! Не забывайте, что:
- масштаб нового меша должен по габаритам совпадать с масштабом прототипа!
- плоскость нового стола должна по высоте совпадать с плоскостью прототипа, иначе ваши предметы либо погрузятся в стол, либо будут висеть над ним! Подгонять высоту стола удобнее на проекциях в увеличении, либо вручную, прописывая координаты XYZ. То же самое касается стульев, кроватей, диванов и т.д.
- положение нового стола должно в конечном счете сравняться с положением прототипа, иначе ваш стол уедет вбок. Если координаты прототипа 0.0.0, то вы можете выставить их вручную для нового меша, после чего удалить прототип! Если же координаты смещены, то старайтесь максимально подогнать расположение нового меша под старый!

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

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

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

Но пока наша модель не готова к Экспорту. Нам еще предстоит сделать развертку текстуры. Для начала давайте наложим на наш новый меш экспортированные ранее текстуры. Выберите Material Editor в правом верхнем углу

Выберем первый шар и зайдем в Diffuse

В появившемся списке щелкаем 2 раза на Bitmap и выбираем первую из экспортированных текстур для нашего столика. То же самое проделываем со вторым шаром для второй текстуры.
Теперь перетягиваем соответствующие текстуры (шары) на соответствующие части меша. Не забудьте нажать Show map in viewport, чтобы было видно текстуру на меше.

Вот, что получилось

Как видите, текстуры лежат хаотично, видны пятна и ненужные уголки изображения. Чтобы этого не было, мы должны сделать развертку текстуры. Она поможет нам как бы развернуть части меша на текстуре (помните развертку мешей одежды? - у каждой части тела свое место расположения). Также и тут. Мы определим для каждой части меша свое место на текстуре.
Для этого выделяем нужный сабсет (ножку или столешницу). И далее переходим в панель модификаторов в правом верхнем углу, откройте Modifier List и выберите модификатор Unwrap UVW.

Откроется дополнительное окошко с непонятными линиями и клетками. Не пугайтесь. Не закрывая окошка, перейдите к проекции своего меша, на ней удобнее всего выделять элементы. Советую перейти на уровень редактирования полигонов (Face). Советую также включить отображение граней (F4) и на панели справа включить галку Ignore Backfacing (это позволит выделять видимые передние грани без случайного выделения невидимых сзади). Выделите нужные вам элементы для создания части текстуры, затем, в зависимости от формы, выбираем, как мы будем разворачивать текстуру. Поскольку у меня выделенный элемент имеет цилиндрическую форму, я выбираю тип развертки Cylindrical во вкладке Map Parameters.

Для плоских частей меша я использую тип развертки Planar.

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

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


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

Теперь вы можете открыть их в Фотошопе, отредактировать текстуры на свой вкус, сохранить с тем же именем, после чего обновите просмотр в Максе и вы увидите, как лежит отредактированная текстура на вашем объекте.
"А как же использовать раскладку в Фотошопе, чтобы все детали попали под сетку", - спросите вы? Для этого в окне с разверткой есть меню Tools - Render UVW Template, выбираете в ней ширину и высоту экспортируемой текстуры, кликаете кнопку Render UV Template, затем в окне рендера - дискету для сохранения и сохраняете в удобном для вас формате. Затем накладываете ее в Фотошопе с настройками прозрачности или смешения слоя. Очень удобно!


Если вы довольны результатом меша и текстуры, можете экспортировать меш из Макса. File - Export, сохраняем в папку с проектом с формате.3ds под новым именем 02.

6. SimPE - импорт меша и текстур.

Осталось дело за малым. Открываем пакадж с нашим столиком. Заходим в Дерево ресурсов (Resource Tree), кликаем на строку в рабочем окне Resouse List и смотрим на Plugin View. Убеждаемся, что координаты стоят XYZ, и нажимаем Import. Выбираем наш новый меш 02, после чего появится вот такое окошко:

В нем будут указаны 2 части нашего меша. Мы должны заменить соответствующие части мешей на новые. Для этого в нижнем правом углу в строке Action вместо Add выбираем Replace и ниже указываем, что заменить. Не перепутайте, какие части какими заменять, для этого можете посмотреть кол-во полигонов в частях. Тот, у которого 35, явно будет столешницей. После того, как вы указали замену, нажмите ОК.

Части заменены, можете выбрать их галочками и нажать Preview для просмотра. Если вы довольны результатом, нажмите Commit, а затем сохраните пакадж.

Осталось Импортировать новые текстуры. Заходим в Дерево Ресурсов (Resource Tree) в ветку Texture Image и выбираем соответствующую текстуру. Нажимаем Import и выбираем замену, после чего изображение обновится. Теперь щелкаем правой кнопкой мыши на новое изображение и выбираем Update all Sizes. Обновятся все размеры текстур. Делаем Commit и повторяем процедуру со второй текстурой, после чего сохраняем пакадж.

Ура! Объект закончен, теперь вы можете переместить его в папку Downloads и запустить игру для проверки.

Послесловие: Фух! Ну и писанины тут набралось, надеюсь это вас не смутило и вы достойно прошли все этапы! Пусть вас не пугает количество текста в этой теме, я просто старалась как можно более подробно описать для новичков все этапы. На самом деле, после того, как вы привыкнете делать предметы, вы перестанете сюда заглядывать и будете делать мебель, декорации и др. намного быстрее. Свой первый предмет я делала 2 недели. Свой последний - 2 часа))
Удачи!


Для создания сценария урока в Библиотеке ОЭМ необходимо нажать на кнопку «Добавить материал» и выбрать пункт меню «Интерактивный урок» в выпадающем списке выбора материалов.

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

Откроется конструктор интерактивного урока, который разделен на три части:

  • конструктор интерактивного урока – для формирования структуры интерактивного урока и добавления материала;
  • настройка этапа – для формирования этапа интерактивного урока и добавления материала;
  • настройка материала – для настройки свойств добавленного материала.

Урок может содержать несколько этапов. Для добавления этапа существует кнопка «Добавить». Нажав на крестик можно удалить этап.

В этапе интерактивного урока расположены формы для экранов (слева-направо):

  • интерактивная панель;
  • планшет учителя;
  • планшет ученика.

Для заполнения области настройки этапа интерактивного урока надо выделить одну из форм, например, интерактивную доску. Область настройки содержит инструменты добавления материала: пользовательский текст или текстовый материал, изображение, видео, аудио, ссылку, тестовое задание, интерактивный объект и таблицу.

В области настройки этапа интерактивного урока можно добавить несколько полей с инструментами для заполнения содержания. Для этого необходимо воспользоваться навигационной панелью внизу экрана.

Для отключения/включения конструктора интерактивного урока (левая часть экрана) и настройки материала (правая часть экрана), а также для изменения масштаба отображения используйте навигационную панель внизу экрана.

  1. Выберите время этапа. Это необходимо для суммарного подсчета времени урока и контроля времени урока.
  2. Выберите тип деятельности: учебный материал, блиц, тест, виртуальная лаборатория.

В настройках этапа Вы можете переименовать этап. Для этого введите новое название в строку «Название этапа».

Если на экранах Вы планируете показывать одинаковую информацию, скопируйте содержание заполненного слайда в настройках этапа интерактивного урока. Для этого нажмите кнопку «Копировать» на изображении экрана, с которого необходимо снять копию на пустом слайде интерактивного урока.

При завершении работы необходимо нажать кнопку «Сохранить».


Как создать меш из любого хаоса
В Minecraft мы можем копать в любом направлении, убирая за раз по одному блоку с чётко заданными краями. Но в других играх разработчикам удаётся разрушать рельеф плавно, без кубичности Minecraft.

Аналогичная техника применяется для отображения изображений с МРТ , metaball-ов и для вокселизации рельефа.

В этой части я расскажу о технике создания разрушаемого рельефа Marching Cubes, а в более общем применении - для создания плавного граничного меша твёрдого объекта. В этой статье мы начнём с рассмотрения двухмерной техники, затем трёхмерной, а в третьей части рассмотрим Dual Contouring. Dual Contouring - это более совершенная техника, создающая тот же эффект.

Наша цель

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

Функция - это отличный способ описания произвольной фигуры. но она не помогает нам отрисовать её.

Для отрисовки нам нужно знать её границу , например, точки между положительными и отрицательными значениями, где функция пересекает ноль. Алгоритм Marching Cubes берёт такую функцию и создаёт полигональную аппроксимацию её границы, которую можно использовать для рендеринга. В 2d эта граница будет непрерывной линией. При переходе в 3d она становится мешем.

Реализация двухмерных Marching Cubes

Примечание: код на python , в котором содержится откомментированный код со всем необходимым.

Для простоты давайте начнём с 2d, а позже перейдём к 3d. Я буду называть алгоритмы в 2d и в 3d «Marching Cubes», потому что по сути они являются одним алгоритмом.

Шаг 1

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

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

Шаг 2

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

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

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

Если соединить всё вместе, то это будет выглядеть так:

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

Часть 2. Трёхмерные Marching Cubes

Итак, в 2D мы разбиваем пространство на сетку, а затем для каждой вершины ячейки вычисляем, где находится эта точка - внутри или снаружи сплошной области. В 2d-сетке у каждого квадрата по 4 угла, и для каждого из них есть два варианта, то есть у каждой ячейки существует возможных комбинаций состояний углов.

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

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

Плохая новость заключается в том, что у куба 8 углов, то есть существует рассматриваемых возможных случаев. И некоторые из этих случаев гораздо более сложны, чем в 2D.

Очень хорошая новость заключается в том, что нам совершенно не нужно в этом разбираться. Вы можете просто скопировать собранные мной случаи и перейти сразу к разделу с результатами («Соединяем всё вместе»), не задумываясь обо всех сложностях. А потом начать читать о dual contouring, если вам нужна более мощная техника.

Все сложности

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

Вы всё ещё читаете? Отлично, мне это нравится.

Секрет заключается в том, что мы на самом деле не обязаны собирать все 256 различных случаев. Многие из них являются зеркальными отражениями или поворотами друг друга.


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

Остальные два случая можно найти простым поворотом первого случая.

Мы можем использовать ещё один трюк:



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

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


Единственный разумный человек

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

Dual Contouring помещает в каждую ячейку по одной вершине, а затем «соединяет точки», создавая полный меш. Точки соединяются вдоль каждого ребра, имеющего смену знака, как и в marching cubes.

Примечание: слово «dual» («двойственный») в названии появилось потому, что ячейки в сетки становятся вершинами меша, что связывает нас с двойственным графом .

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

Получение градиента

В нашем простом примере с 2d-кругом радиуса 2,5 задаётся следующим образом:

(другими словами, 2,5 минус расстояние от центральной точки)

Воспользовавшись дифференциальным исчислением, мы можем вычислить градиент:

Градиент - это пара чисел для каждой точки, обозначающих, насколько изменяется функция при движении по оси x или y.

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

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

Адаптивность

Пока мы получили такой же ступенчатый вид, который был и у Marching Cubes. Нам нужно добавить адаптивности. В алгоритме Marching Cubes мы выбирали, где вдоль ребра будет находиться вершина. Теперь мы можем свободно выбирать любую точку внутренностей ячейки.

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

и градиенту. Заметьте, что мы сэмплировали градиент вдоль рёбер, а не в углах.

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

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

Переходим в 3d

Случаи в 2d и в 3d на самом деле не очень отличаются. Ячейка теперь является кубом, а не квадратом. Мы выводим грани, а не рёбра. Но на этом различия заканчиваются. Процедура выбора одной точки в ячейке выглядит так же. И мы по-прежнему находим рёбра со сменой знака, а затем соединяем точки соседних ячеек, но теперь уже четырёх ячеек, что даёт нам четырёхсторонний полигон:

Грань, связанная с отдельным ребром. У неё есть точки в каждой соседней ячейке.

Результаты

Dual contouring создаёт гораздо более естественные формы, чем marching cubes, что можно увидеть на примере созданной с его помощью сферы:

В 3d эта процедура достаточно надёжна, чтобы выбирать точки, находящиеся вдоль ребра острого участка и выбора углов при их возникновении.

Выбор местоположения вершины

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

В 3d проблема ещё более усугубляется, потому что здесь становится больше нормалей.

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

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


С математической точки зрения отдельные штрафные функции являются квадратом расстояния от идеальной линии для текущей нормали. Сумма всех квадратных членов является квадратичной функцией , поэтому общая штрафная функция называется QEF (quadratic error function, функцией квадратичной ошибки). Нахождение минимальной точки квадратичной функции - это стандартная процедура, имеющаяся в большинстве библиотек работы с матрицами.

Проблемы

Колинеарные нормали

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

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

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

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

Техника 1: решение QEF с ограничениями

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

Техника 2: смещение QEF

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

Благодаря этому решение всего QEF стягивается к центру.

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

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

Подробнее обе техники показаны в коде .

Самопересечения

Ещё одна проблема dual contouring заключается в том, что иногда он может генерировать самопересекающуюся 3d-поверхность. В большинстве случаев на это не обращают внимания, так что я не решал эту проблему.

Существует статья, в которой рассказывается о её решении: «Intersection-free Contouring on An Octree Grid», Ju and Udeshi, 2006

Однородность

Хотя получаемый dual contouring меш всегда герметичен, поверхность не всегда является хорошо заданной. Так как на ячейку приходится всего одна точка, при прохождении через ячейку двух поверхностей она будет общей для них. Это называется «однородным» мешем и может вызывать проблемы у некоторых алгоритмов текстурирования. Проблема часто возникает, когда сплошные объекты тоньше, чем размер ячейки или несколько объектов почти касаются друг друга.

Обработка таких случаев является значительным расширением функционала базового Dual Contouring. Если вам нужна эта функция, то рекомендую изучить эту реализацию Dual Contouring или

Расширение алгоритма

Благодаря относительной простоте создания мешей Dual Contouring гораздо проще расширить до работы со схемами ячеек, отличающихся от рассмотренных выше стандартных сеток. Как правило, алгоритм можно выполнять для октодеревьев , чтобы получить различные размеры ячеек ровно там, где нужны подробности. В целом идея аналогична - выбираем по точке на ячейку с помощью сэмплированных нормалей, затем для каждого ребра со сменой знака находим соседние 4 ячейки и комбинируем их вершины в грань. В октодереве для нахождения этих рёбер и соседних ячеек можно использовать рекурсию. У Мэтта Китера есть об этом.

Другое интересное расширение заключается в том, что для Dual Contouring нам необходимы всего лишь определение того, что находится внутри/снаружи, и соответствующие нормали. Хотя я говорил, что у нас для этого есть функция, мы можем извлечь ту же самую информацию из другого меша. Это позволяет нам выполнить «ремеш», т.е. сгенерировать чистое множество вершин и граней, очищающих исходный меш. В качестве примера можно привести модификатор remesh из Blender.

Дополнительное чтение

  • Dual Contouring - это одна из множества похожих техник. См. другие подходы со своими плюсами и минусами в

Рекомендуем почитать

Наверх