Является ли бинормаль вершины крестом между ее нормалью и касательной? - PullRequest
1 голос
/ 15 мая 2010

Я пытаюсь выяснить, что такое бинормаль в контексте графического программирования, но вкратце, я увидел на сайте, что бинормаль вычисляется как перекрестное произведение между нормалью и касательной (то есть кросс (нормаль) , касательная)), это правильный способ вычисления бинормаля?

Ответы [ 5 ]

5 голосов
/ 16 мая 2010

Просто чтобы указать, что ПОЛНОСТЬЮ не является определением бинормального. Это определение Bi Tangent . Бинормаль - это нечто совершенно иное, связанное с «другим» нормалью, образованным изогнутой поверхностью.

Людям нужно научиться не повторять эту ошибку (совершенную кем-то в начале нормального картирования).

2 голосов
/ 15 мая 2010

Согласно mathworld бинормальный вектор определяется как cross(tangent,normal), где tangent и normal являются единицами нормальными векторами.

Обратите внимание, что, строго говоря, порядок имеет значение, когда вы берете перекрестные продукты. cross(tangent,normal) указывает в противоположном направлении от cross(normal,tangent). Это может иметь или не иметь значения в зависимости от вашего приложения. Это действительно не имеет значения, если ваши расчеты внутренне непротиворечивы.

1 голос
/ 16 мая 2010

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

varying vec3 normal;
varying vec4 vpos;
varying vec3 T,B;
void main()
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    normal = normalize(gl_NormalMatrix*gl_Normal);
    gl_Position =gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
    vpos = gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
    T = cross(normal,vec3(-1,0,0));
    B = cross(T,normal);
}

Хотя он может не дать желаемых результатов, иногда он должен доставить вас туда, куда вы хотите.

1 голос
/ 16 мая 2010

На самом деле нет, иногда это не так. В 3D графике, по крайней мере.

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

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

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

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

1 голос
/ 15 мая 2010

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

Касательные и бинормальные векторы представляют собой эквивалентные текстуры UV, то есть векторы, параллельные нормали поверхности.

С технической точки зрения, поскольку они образуют ортонормированный базис, то на практике бинормальный = перекрестный (касательный, нормальный) однако , поскольку бинормальные и касательные генерируются из UV в карте нормалей и могут усредняться нескольких вершин, то они не могут быть строго ортонормированными.

Пару хороших статей на эту тему читайте
http://www.3dkingdoms.com/weekly/weekly.php?a=37
и
http://www.blacksmith -studios.dk / проекты / загрузки / bumpmapping_using_cg.php

...