Касательный расчет OpenGL - PullRequest
1 голос
/ 12 января 2012

Я пытаюсь вычислить касательную линию (необходимую для рельефного отображения) для каждой вершины в моей сетке.V1, v2 и v3 - вершины треугольника, а t1, t2 и t3 - соответствующие текстурные координаты.Из того, что я понимаю, следует вывести касательную к трем вершинам треугольника.

Vec3f va = Vec3f{vertexData[a * 3 + 0], vertexData[a * 3 + 1], vertexData[a * 3 + 2]};
Vec3f vb = Vec3f{vertexData[b * 3 + 0], vertexData[b * 3 + 1], vertexData[b * 3 + 2]};
Vec3f vc = Vec3f{vertexData[c * 3 + 0], vertexData[c * 3 + 1], vertexData[c * 3 + 2]};

Vec2f ta = (Vec2f){texcoordData[a * 2 + 0],texcoordData[a * 2 + 1]};
Vec2f tb = (Vec2f){texcoordData[b * 2 + 0],texcoordData[b * 2 + 1]};
Vec2f tc = (Vec2f){texcoordData[c * 2 + 0],texcoordData[c * 2 + 1]};

Vec3f v1 = subtractVec3f(vb, va);              
Vec3f v2 = subtractVec3f(vc, va);  

Vec2f t1 = subtractVec2f(tb, ta);
Vec2f t2 = subtractVec2f(tc, ta);

float coef = 1/(t1.u * t2.v - t1.v * t2.u);

Vec3f tangent = Vec3fMake((t2.v * v1.x - t1.v * v2.x) * coef,
                          (t2.v * v1.y - t1.v * v2.y) * coef,
                          (t2.v * v1.z - t1.v * v2.z) * coef);

Моя проблема в том, что переменная coef иногда представляет собой значение nan (not a number), приводящее к отключению умножения.Моя сетка не очень сложная, простой цилиндр, но я хотел бы, чтобы универсальная формула для вычисления касательной линии включала рельефное отображение на всех моих сетках.

1 Ответ

1 голос
/ 12 января 2012

coef превращение в NaN указывает на некоторые численные проблемы с вашими входными данными, такие как вырожденные треугольники или координаты текстуры.Убедитесь, что выражение (t1.u * t2.v - t1.v * t2.u) не (почти) не исчезает, т. Е. Его абсолютное значение больше некоторого разумного порогового значения.

Хорошая проверка работоспособности: |vb-va|>0 ^ |vc-va|>0, |tb-ta|>0 ^ |tc-ta|>0, |normalized(vb-va) . normalized(vc-va)| < 1и |normalized(tb-ta) . normalized(tc-ta)| < 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...