Войти
ПрограммированиеФорумГрафика

Как расчитать правильный Tangent Space? (комментарии) (2 стр)

Страницы: 1 2 3 4 5 Следующая »
#15
16:44, 10 сен 2010

Imaginary unit
Нет такого метода дающего приемлемый результат.

#16
16:45, 10 сен 2010

shekh
В идеальном мире тангент должен делать художник а не алгоритм какой-нибудь.

#17
18:29, 10 сен 2010

evirus
>так может поделиться с общественностью этим?

может..
Для чего вообще мержить тангенты:
Если 2 соседних треугольника имеют общие пикселы на текстуре нормали, то при несовпадающих тангентах будет конфликт за кодирование этих пикселов.
Что приведет к мусору (артефактам) в изображении.
Обычно встречается проверка угла между векторами и если меньше типа 30 градусов то мержится.
А если UV в этом вертексе разорваны то это ничего не меняет, или в лучшем случае ничего не мержится.

Я предлагаю делать иначе:
Первым делом собираем монотонные группы: нет разрыва по смусгруппе, и нет разрыва или складки UV. В монотонных группах мержим тангенты безусловно.
Не смержить их нельзя потому что из монотонности следует что участок должен быть гладким и использует общие пикселы.

Дальше мержим группы, между которыми нет разрыва по смусгруппе. При этом не просто усредняем векторы, а находим для них ориентацию наиболее близкую к исходной, но чтоб в результате между всеми векторами были прямые углы.
Иными словами уравнять 2 тангентспейса можно восемью способами вместо одного:
s1=s2; t1=t2
s1=s2; t1=-t2
s1=-s2; t1=t2
s1=-s2; t1=-t2
s1=t2; t1=s2
s1=t2; t1=-s2
s1=-t2; t1=s2
s1=-t2; t1=-s2

Такой способ предотвращает перекручивание, сохраняет гладкость и сильно уменьшает швы на разрывах и складках UV (потому что в ортогональных тангентах нормаль кодируется с одинаковой точностью, очень заметно если тектура сильно пожатая, например dxt).
В частности на линии симметрии (складка UV) получатся симметричные тангенты (s1=s2; t1=-t2) или (s1=-s2; t1=t2), в которых нормаль кодируется *одинаково*.

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

#18
22:22, 10 сен 2010

shekh
В принципе, нужно старатся чтобъ расчитъваемъй тангент спейс совпадал с тем, которъй бъл в соответном пакете расчета нормалмепа.
Или же експортить нормалмеп в object space.
Тогда же расчет не сильно сложнъй - считаем гладкую нормаль по геометрии (вертекс==pos), считаем T,B по вертекс==(pos,uv) и потом въпрямляем T,B так чтобъ dot( cross(T,B), N) == 0.
Если нужна гладкость Т и B (?), то можно их сгладить по индексам вертексов сглаженнъх только по нормали.

#19
23:27, 10 сен 2010

KpeHDeJIb
А как художник должен заботиться о ТБН? Правда не понял...

#20
17:35, 11 сен 2010

Z
>В принципе, нужно старатся чтобъ расчитъваемъй тангент спейс совпадал с тем, которъй бъл в соответном пакете расчета нормалмепа.

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

#21
17:53, 11 сен 2010

shekh
> просто потребители скажем 3дмакс не проявляют такого интереса
Да, с Максом туго.

>Если нет плагинов для тангента - это вообще не пакет расчета нормалмапа, а так прикрутка чтоб как у всех.
Да? Ну, афаик ни zbrush ни mudbox не дают его.

> а выполнить расчет самостоятельно,
Расчет нормалмепа?

#22
18:34, 11 сен 2010

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

#23
19:58, 11 сен 2010

DeadMeat
AFAIK не дает их Макс. То что в IGame - лажа.

#24
20:37, 11 сен 2010

Хм.. Ну т.е. с тех пор ситуация не изменилась? Жаль... ну ниче.

#25
21:46, 11 сен 2010

Вижу уже не первую (а наверно даже 6-ю ... 7-ю) вариацию алгоритма рассчета TBN. Пояснений никаких - понимай как хочешь.
Статья не дает ответа на вопрос, ибо из голого кода не следует никаких гарантий *правильности* результата и не указаны никакие ограничения алгоритма.

shekh, да, меши с TBN бывают разные. Это может быть и персонаж с отзеркаленным нормалмапом и разными группами сглаживания, и какой-нибудь разрушаемый объект, заранее порезанный на фрагменты, обработанный в ZBrush и переведенный из хайполу в лоу с запеканием нормалей…  но в итоге все сводится к одному – есть треугольник, для трех вершин которого надо рассчитать тбн.
При этом, нормали у трех вершин треугольника могут быть различны – из-за действия групп сглаживания.

Z, почти как ты и описал, я в конце-концов сделал свой рассчет tbn, не опираясь на чужие алгоритмы.
До этого, честно признаюсь, я аккуратно, по очереди, копипастил себе в код штук пять вариаций алгоритма из разных источников, но все они давали ошибки в разных местах на испытуемом объекте. Лень + копипаста = зло.

Для тех, кому это может быть интересно, делюсь подробной последовательностью шагов для рассчета "правильного" TBN:

1.  Определяем тот факт, что поданный на рассчет треугольник может оказаться вырожденным – если так, то не считаем ничего во избежание ошибок.
2.  Рассчитываем «настоящую» нормаль грани через cross двух сторон треугольника.

Считаем «стартовый» тангент, взятый от настоящей нормали грани - «стартовый» он потому, что пока игнорирует группы сглаживания нормалей:

3.  Берем в качестве тангента одну из сторон треугольника, нормализуя ее.
4.  Теперь надо повернуть тангент так, что бы он соответствовал текстурной оси U. Угол поворота вычисляем легко, так как знаем все текстурные координаты вершин треугольника. Проверяем - если треугольник флипнутый на текстуре, то угол нужно обратить.
5.  Поворачиваем тангент на вычисленный угол. В качестве оси поворота используем настоящую нормаль.
6.  Находим «стартовую» бинормаль путем поворота уже найденного тангента на 90 градусов вокруг настоящей нормали.

Теперь надо повернуть «стартовые» тангент и бинормаль до соответствия со "сглаженной" нормалью:

7.  Получаем угол между нормалью из групп сглаживания и настоящей нормалью.
8.  Получаем ось поворота через cross двух этих нормалей.
9.  Поворачиваем «стартовые» тангент и бинормаль вокруг этой оси на полученный угол - получаем финальные тангет и бинормаль.

#26
2:36, 13 сен 2010

Z

>>Если нет плагинов для тангента - это вообще не пакет расчета нормалмапа, а так прикрутка чтоб как у всех.
>Да? Ну, афаик ни zbrush ни mudbox не дают его.

Может решили что 99% не отличат где какой тангент или подстроятся, а остальные сами себе буратины :)

>> а выполнить расчет самостоятельно,
>Расчет нормалмепа?

да его

Прошло более 2 лет
#27
18:20, 26 авг 2013

В конце второго примера:

    newT.normalize ();
    newB.normalize ();
    //Vertices [i].tangent  = newT;
    //Vertices [i].binormal = newB;

    float lenT = newT.length ();
    float lenB = newB.length ();

    if (lenT <= 0.0001 || lenB <= 0.0001)

Выражение в if всегда равно false.

#28
18:45, 26 авг 2013

Действительно :)
Нормализацию значит надо поставить в конец.

#29
18:48, 26 авг 2013

И вообще какой-то непонятный код. Давно это было... %)

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.