Извлечение ребер из нормального вектора

#math #3d

#математика #3D

Вопрос:

Я читаю файл Wavefront .obj, в котором предоставлены нормали. И я хочу вычислить касательную вручную.

Есть ли какой-либо способ, которым я мог бы извлечь edge1 и edge2, которые создают нормальный вектор?

Ответ №1:

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

Вам нужно ограничить свой вопрос, решив, в каком направлении вы хотите, чтобы двигались ваши касательные векторы. Это http://support.microsoft.com/kb/131130 может помочь вам вернуться к этому пути. HTH,

Комментарии:

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

Ответ №2:

Смотрите http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-13-normal-mapping / для введения в тангенс и битангенсы; они также являются дополнительными ссылками внизу, если вы хотите получить более подробную информацию.

Однако ваш вопрос касается нормального.

OBJ — это индексированный формат с одним индексом для позиций и одним (другим) индексом для нормалей (и так далее для всех атрибутов).

Итак, если у вас есть строка, подобная этой :

 f 0/10 1/11 2/12
  

у вас есть грань, представляющая собой треугольник (3 индекса); индексы положения равны 0,1,2 (зависит от вашего obj-файла, это описано в заголовке файла). Чтобы получить позиции, проиндексируйте массив position :

 vec3 vertexPos1 = positions[0]; // or more generically, positions[faceIndices[i  ]]
vec3 vertexPos2 = positions[1];
vec3 vertexPos2 = positions[2];
  

egde — это дельты позиций :

 vec3 edge1 = vertexPos2 - vertexPos1; // order is important
vec3 edge2 = vertexPos3 - vertexPos1;
  

нормаль — это перекрестное произведение этих ребер :

 vec3 normal = cross(edge1,edge2); // order important too
normalize(normal);