#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);