Для чего используется метод getNormals() в TriangleMesh JavaFX

В настоящее время я работаю над приложением JavaFX 3D и сталкиваюсь с методом getNormals() в классе TriangleMesh.

Как и в TriangleMesh, класс используется для создания определяемого пользователем 3D-объекта Java FX, и в этом случае
getPoints() используется для добавления точек
getFaces() используется для добавления лиц,
используется getTexCoords() для управления текстурой 3D-объекта,
но я не уверен, для чего используется метод getNormals() в классе TriangleMesh.

В классе TriangleMesh мы можем установить формат вершины в VertexFormat.POINT_TEXCOORD и VertexFormat.POINT_NORMAL_TEXCOORD.
Но если мы установим vertexFormat как «VertexFormat.POINT_NORMAL_TEXCOORD», тогда нам нужно добавить индексы нормалей к граням, как показано ниже:
[ p0, n0, t0, p1, n1, t1, p3, n3, t3, // Первый треугольник текстурированного прямоугольника

p1, n1, t1, p2, n2, t2, p3, n3, t3 // Второй треугольник текстурированного прямоугольника ]

как описано в https://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/TriangleMesh.html

Я не обнаружил никакой разницы в 3D-форме, если бы использовал vertexFormat как POINT_TEXCOORD или POINT_NORMAL_TEXCOORD.

Итак, для чего нужен метод getNormals() в TriangleMesh JavaFX?

Заранее спасибо..


person PrashantP    schedule 28.06.2016    source источник


Ответы (1)


Использование нормалей в компьютерной графике:

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


Нормали влияют на затенение лица.

Стандартным механизмом затенения для JavaFX 8 является затенение Фонга и Модель отражения Фонга. По умолчанию Phong Shading предполагает плавно меняющийся (линейно интерполированный) вектор нормали к поверхности. Это позволяет визуализировать сферу путем затенения с ограниченной геометрией вершин. По умолчанию векторы нормалей будут рассчитываться как перпендикулярные граням.

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

Этот пример из Википедии показывает заштрихованную сферу Фонга справа. Обе сферы на самом деле имеют одинаковую геометрию. Распределение нормалей, которые вносят вклад в уравнение затенения Фонга, является стандартным, плавно интерполированным, основанным на стандартном вычислении нормалей для каждой грани (поэтому пользовательские нормали не предоставляются). Уравнение, используемое для расчета затенения, описано в PhongMaterial javadoc, и вы можете увидеть нормальный вклад в алгоритм затенения с точки зрения как расчета диффузного цвета, так и зеркальных бликов.

фонг затенение

Стандартные 3D-модели, такие как obj-файлы, могут по желанию предоставлять нормали:

vn i j k

Заявление о полигональной и произвольной геометрии.

Задает вектор нормали с компонентами i, j и k.

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

Когда нормали вершин присутствуют, они заменяют группы сглаживания.

i j k — координаты i, j и k нормали вершины. Это числа с плавающей запятой


Итак, зачем вам это?

Самый простой способ объяснить это — взглянуть на нечто известное как группы сглаживания (пожалуйста, нажмите на ссылку, я не буду вставлять сюда из-за авторских прав). Как видно из связанного изображения, когда группа сглаживания применяется к набору граней, можно получить четкую границу (например, складку или угол) между сгруппированными гранями. Указание нормалей позволяет вам выполнить то же самое, что и группа сглаживания, только с большим контролем, поскольку вы можете указать отдельные нормали для каждой вершины, а не для всей группы связанных граней. Примечание JavaFX позволяет указать группы сглаживания через getFaceSmoothingGroups() для случаев, когда вы не хотите утруждать себя определением полной нормальной геометрии через getNormals().

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

карта нормалей

Базовое чтение - Как понимать материалы Фонга ( и прочее)

person jewelsea    schedule 28.06.2016