Как проверить нормали в 3ds max

Обновлено: 04.07.2024

Нормали используются для определения того, какая сторона грани или вершины считается «внешней». Внешняя сторона грани или вершины — это сторона, которая подвергается рендерингу, если вы не используете двусторонние материалы или не включаете параметр «Принудительно 2-сторонний» в диалоговом окне «Настройка рендеринга» Панель «Общие» в свитке «Общие параметры».

Как отразить что-либо в 3ds Max?

Чтобы отразить ногу робота, выполните следующие действия:

  1. Откройте. Робот-механизм.
  2. Выберите все объекты, составляющие ногу робота, в левом окне просмотра и откройте диалоговое окно "Зеркало" с помощью инструментов.
  3. В диалоговом окне "Зеркало" выберите X в качестве оси отражения и "Экземпляр" в качестве выделенного клона.
  4. Нажмите "ОК", чтобы закрыть диалоговое окно.

Как вы соблюдаете нормали в Maya?

Выберите лица. Выберите Mesh Display > Conform…. Установите для параметра Reverse normals on одно из следующих значений:

  1. Чтобы инвертировать нормали выбранных граней, выберите «Выбранные грани».
  2. Чтобы поменять местами нормали граней и нормали вершин, а затем извлечь вершины, выберите «Выбранные грани», а затем извлеките их.

Что создает зеркальную копию выбранного объекта?

Команда зеркального отображения в AutoCAD используется для создания копии (зеркальной копии) выбранного объекта. Мы также можем удалить исходный объект после зеркалирования объекта. Объекты, представляющие то же самое, что и половина их объекта, могут быть зеркально отражены по центральной линии, чтобы создать другую половину объекта.

Как инвертировать нормали?

Обратные нормали полигонов

  1. Выберите лица, которые хотите перевернуть:
  2. Выберите Mesh Display > Reverse > в наборе меню Modeling.
  3. Установите для параметра «Обратить нормали» одно из следующих значений: Чтобы инвертировать нормали выбранных граней, выберите «Выбранные грани».
  4. Нажмите "Обратить нормали".

Как включить блендер для отбраковки задней поверхности?

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

Как вы обращаете нормали?

Как Maya проверяет нормали лица?

Как отобразить нормали граней полигональных объектов Maya

  1. Добавьте многоугольный цилиндр в рабочую область, выбрав «Создать» > «Многоугольный примитив» > «Цилиндр» (включая параметры).
  2. В параметрах установите для параметра "Разделение по осям" значение 6.
  3. Чтобы просмотреть нормали объекта, выберите объект и выберите «Отображение» > «Многоугольники» > «Нормали граней».

Как изменить нормали в Autodesk 3ds Max?

Как взвешенные нормали лица могут улучшить трехмерное затенение?

Где найти унифицированные нормали в 3ds Max?

Сколько нормалей у вершины в 3ds Max?


Автор:

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


Слева: нормали, показанные пиками, указывают ориентацию граней на пирамиде.

Справа: отражение нормалей может сделать лица невидимыми (или видимыми) в затененных окнах просмотра и визуализации.

В этих объектах могут появляться нежелательные нормали:

  • Сетки, импортированные из других приложений.
  • Геометрия, созданная сложными операциями, такими как логические объекты, токарные объекты или лофты.

Нормали используются для определения того, какая сторона грани или вершины считается внешней стороной. Внешняя сторона грани или вершины — это сторона, которая подвергается рендерингу, если вы не используете двусторонние материалы или не включаете параметр «Принудительно 2-сторонний» в диалоговом окне «Настройка рендеринга» Панель «Общие» в свитке «Общие параметры».

Чтобы просмотреть или изменить нормали лица, выполните одно из следующих действий:

  • Применить модификатор Normal. Если выбор подобъекта «Лицо» активен, к выбранным лицам применяется «Нормальный». Если грани не выбраны, параметр "Обычный" применяется ко всему объекту.
  • Примените модификатор Edit Mesh, включите режим подобъектов Face, Polygon или Element, а затем используйте функции в свитке Surface Properties, чтобы изменить направления, в которых указывают нормали.
  • Преобразуйте объект в редактируемую сетку, включите режим подобъектов Face, Polygon или Element и используйте функции в свитке Surface Properties.

Просмотр нормалей

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

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

Объединение нормалей

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

Унифицировать нормали можно в свитке Surface Properties и в модификаторе Normal.

Если вы анимируете создание сложного объекта, такого как вложенное логическое значение или лофт, и считаете, что операция может привести к несовместимым граням, примените к результату модификатор Normal и включите Unify Normals.

Переворот нормалей

Используйте функцию "Отразить нормали", чтобы изменить направление всех выбранных граней. Отражение нормалей объекта выворачивает его наизнанку.

Flip Normals находится в свитке Surface Properties и в модификаторе Normal.

Модификатор Lathe иногда создает объект с нормалями, направленными внутрь. Используйте флажок Flip Normals в свитке Parameters модификатора Lathe, чтобы настроить нормали. Вы также можете использовать модификатор Normal с включенными параметрами Unify и Flip, чтобы исправить реечные объекты, вывернутые наизнанку.

Небольшие сценарии для исправления нормали выбранных фигур (направление вытягивания).

- Выберите фигуры для исправления .

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

Добавлен еще один скрипт для автоматического исправления ориентации фигур.

* Если у вас есть изогнутая 3D-форма, лучше использовать первый скрипт для исправления вручную.

– ОБНОВЛЕНИЕ 1:

  • Сделать макросы видимыми/включенными, когда выделенный фрагмент содержит фигуры.

– ОБНОВЛЕНИЕ 2:

Нормальный вор Нурс

Этот скрипт перенесет нормали от исходного объекта к целевому объекту в зависимости от расстояния.

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

Выберите исходный объект, выберите целевой объект/лица и нажмите "украсть" !

  • Работает с любым геометрическим объектом.
  • Сохраняет стек.
  • Добавляет модификатор "Редактировать нормали".

Скрипт можно найти в пользовательском интерфейсе в категории "Noors"


Выровнять по лицам

Скрипт 3ds Max для выравнивания выбранных объектов по граням выбранного объекта.
Для получения более подробной информации перейдите по ссылке для скачивания .

Унифлип

v1.1 Исправлена ​​ошибка отражения нормалей нескольких объектов в группе

Отразить нормали полигонов или объектов
Отразить (обратить) сплайны

Простые карты

Обзор:
Простой инструмент для рендеринга карт сверху вниз из 3dsmax. Идеальным способом использования этого инструмента было бы создание мозаичных текстур. Помимо мозаичных текстур, это поможет накладывать дополнительные мелкие детали на уже созданные внутриигровые сетки гораздо более простым способом.

Интерфейс:


Выровнять поворот по направлению

Выровнять поворот по направлению (вектор) позволяет выровнять оси X, Y, Z или XYZ локального поворота каждого из выбранных объектов по направлению (вектору), заданному двумя точками, выбранными на сцене. SNAP будет включен автоматически. Если при выборе оси нажата клавиша Shift, точка поворота будет перемещена в первую указанную точку.

Версия 1.1 должна корректно работать с Pen(планшетами).

Средние/копировать нормали вершин границы

Марк Роберт / Trebor777 ( [email protected] )

Инструмент для исправления швов между двумя объектами путем усреднения или копирования нормалей от границ друг друга.

Пользователь должен выбрать одинаковое количество вершин в обеих сетках с помощью модификатора EditPoly с именем «VertSelect». Он создается автоматически при выборе мешей, если их еще нет.

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

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

Нормаль лица — это вектор, определяющий, в какую сторону направлено лицо. Направление, которое указывает нормаль, представляет переднюю или внешнюю поверхность лица. Чтобы вычислить нормаль лица в сетке, вы просто берете векторное произведение двух векторов ребер лица. В следующем коде показано, как это делается с помощью API 3ds max. Он перебирает каждую грань в сетке и сохраняет вычисленную нормаль грани в таблице Point3 с именами fnorms.В конце кода API DebugPrint() используется для отображения каждой нормали в таблице в окно отладки IDE VC++.

void Utility::ComputeFaceNormals(Mesh *mesh)

Точка3 v0, v1, v2;

// Вычисляем нормали граней (поверхностей) сетки

for (int i = 0; i getNumFaces(); i++, face++)

// Отображаем нормали в окне отладки IDE VC++

DebugPrint("\nЛицо нормальное[%d]=(%.1f, %.1f, %.1f)",

i, fnorms[i].x, fnorms[i].y, fnorms[i].z);

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

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

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

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

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

Класс, используемый для вычисления нормалей вершин с учетом сглаживания, показан ниже. Этот класс VNormal подобен классу RNormal, используемому внутри 3ds max. Класс содержит Point3, который является нормалью, DWORD для групп сглаживания и указатель на следующую нормаль — этот класс представляет собой связанный список. Переменная инициализации используется как флаг, указывающий, была ли инициализирована первая нормаль в списке.

// Связанный список нормалей вершин

VNormal(Point3 &n,DWORD s)

Ключевым методом этого класса является AddNormal() . Он используется, когда грань собирается добавить свою нормаль к вершине. В этот метод передаются нормаль и информация о сглаживании для этой грани. Он проверяет, разделяет ли переданная нормаль информацию о сглаживании с существующей нормалью. Если да, то добавляется нормаль, а биты сглаживания объединяются побитовым ИЛИ. Если нет, создается новая нормаль вершины. Таким образом, по мере добавления нормалей, которые совместно используют информацию о сглаживании, они вносят свой вклад в общую нормаль для этого условия сглаживания в вершине. Если это нормаль, грань которой не имеет общей информации о сглаживании, выделяется новая вершинная нормаль.

// Добавляем нормаль в список, если биты группы сглаживания перекрываются,

// иначе создаем новую нормаль вершины в списке

void VNormal::AddNormal(Point3 &n,DWORD s)

if (!(s&smooth) && init)

if (далее) next->AddNormal(n,s);

далее = новый VNormal(n,s);

// Извлекает нормаль, если группы сглаживания перекрываются или есть

// только один в списке

Point3 &VNormal::GetNormal(DWORD s)

иначе вернуть следующий->GetNormal(s);

// Нормализуем каждую нормаль в списке

VNormal *ptr = следующий, *prev = этот;

if (далее) next->Normalize();

Метод ComputeVertexNormals(), показанный ниже, представляет собой демонстрационный метод, в котором используется описанный выше класс VNormal. Первое, что нужно сделать, это создать таблицу нормалей вершин. Обратите внимание, что, поскольку класс Tab не выполняет никакой инициализации (он только выделяет память), код перебирает каждую нормаль и вызывает конструктор для выполнения инициализации. Затем он проходит через каждую грань, вычисляет нормаль поверхности и добавляет ее к каждой из трех нормалей вершин для грани с помощью AddNormal(). Когда все грани обработаны, он проходит по нормалям каждой вершины и нормализует их.

В приведенном ниже коде нормали вершин отображаются с помощью DebugPrint() в окне вывода. Если в вершине имеется более одной нормали, отображается каждая из них (метод DisplayVertexNormal() рекурсивно вызывает сам себя для отображения каждой).

// Вычисляем нормали грани и вершины

void Utility::ComputeVertexNormals(Mesh *mesh)

Точка3 v0, v1, v2;

// Вычисляем нормали поверхности грани и вершины

for (int i = 0; i getNumVerts(); i++)

для (i = 0; i getNumFaces(); i++, face++)

// Вычисляем нормаль к поверхности

для (i=0; i getNumVerts(); i++)

// Отображаем нормали в окне отладки IDE VC++

DisplayVertexNormal(vnorms.Addr(i), i, 0);

void Utility::DisplayVertexNormal(VNormal *vn, int i, int n)

DebugPrint("\nВершина %d Обычная %d=(%.1f, %.1f, %.1f)",

i, n, vn->норма.x, vn->норма.y, vn->норма.z);

if (vn->следующий) DisplayVertexNormal(vn->следующий, i, n+1);

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

Взвешивание по углу лица

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

Создайте коробку по умолчанию и преобразуйте ее в редактируемую сетку. Перейдите в режим SubObject и найдите вершину 1 (обычно находится в переднем нижнем левом углу). Отобразите края и перейдите в свойства объекта, чтобы снять флажок «Только края» (чтобы вы видели скрытые края). Вы увидите, что вершина 1 используется нижними гранями 1 и 2. (В SDK это вершина 0 и грани 0 и 1.) Она также используется передними гранями 5 и 6 и левой гранью 11. (4, 5,10.)

Если бы мы просто усреднили нормали всех падающих лиц, мы бы получили:

Нормализовать (2*(0,0,-1) + 2*(0,-1,0) + (-1,0,0)), что равно (1/3, 2/3, 2/ 3).

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

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

Нормировать (PI/2*(0,0,-1) + PI/2*(0,-1,0) + PI/2*(-1,0,0)) = (1,1, 1)/кв.(3)

Это более естественно для пользователя. Нормаль каждой вершины направлена ​​симметрично от всех трех сторон. (Отдельные передний и нижний треугольники могут иметь разные углы, но их пары всегда дают в сумме PI/2.)

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

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

// Угол равен 0, 1 или 2 -- угол какого угла нам нужен?

float FindVertexAngle(Mesh *mesh, int face, int angle)

int cnext = (угол+1)%3;

int cprev = (угол+2)%3;

DWORD *vv = mesh->faces[face];

// Получить векторы ребер:

Point3 A = mesh->verts[vv[cnext]] - mesh->verts[vv[угол]];

Point3 B = mesh->verts[vv[corner]] - mesh->verts[vv[cprev]];

// Нормализуем векторы-ребра, но возвращаем 0, если любой из них имеет нулевую длину.

длина с плавающей запятой = длина (A);

если (!len) вернуть длину;

если (!len) вернуть длину;

// Скалярное произведение дает косинус угла:

число с плавающей запятой = DotProd (A,B);

если (dp>1) dp=1.0f; // не должно происходить, но может

Чтобы быть эффективным при вычислении всех нормалей, вы можете кэшировать нормализованные направления ребер (A и B). Вы можете проиндексировать их по списку смежных ребер для сетки, где edir[i] — это единичный вектор, указывающий от вершины ae->edges[i].v[0] до ae->edges[i].v[1] (AdjEdgeList *ae).

Взвешивание по площади лица

Еще одна возможность – взвесить нормали по площади каждого лица. Площадь лица вычислить очень легко, это всего лишь половина длины нормального перекрестного произведения:

void GetAreaAndNormal (Mesh *mesh, int face, Point3 & N, плавающая область)

DWORD *vv = mesh->faces[face].v;

Point3 A = mesh->verts[vv[1]] - mesh->verts[vv[0]];

Point3 B = mesh->verts[vv[2]] - mesh->verts[vv[0]];

площадь = длина (N) / 2,0f;

Это работает с любыми двумя ребрами для A и B.

Чтобы взвесить нормали лица по площади, вы можете напрямую использовать вектор N=A^B.

Взвешивание по площади дает интересный результат, но, возможно, не такой удовлетворительный, как взвешивание по углу лица.

Читайте также: