Всегда ли в матрице TBN нормальные, касательные и бикасательные векторы перпендикулярны?

Это связано с проблемой, описанной в другом вопросе (изображения там):

Проблемы шейдера Opengl - странные артефакты отражения света

У меня есть импортер .obj, который создает структуру данных и вычисляет касательные и битангенсы. Вот данные для первого треугольника в моем объекте:

Структура данных

Мое понимание касательного пространства состоит в том, что нормаль указывает наружу от вершины, касательная перпендикулярна (ортогональна?) к вектору нормали и указывает в направлении положительного S в текстуре, а бикасательная перпендикулярна обоим. Я не уверен, как вы это называете, но я думал, что эти 3 вектора образуют то, что будет выглядеть как повернутая или преобразованная ось x, y, z. Это не будут 3 случайно ориентированных вектора, верно?

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

Но потом я увидел данные объекта... Моя структура имеет 270 вершин, и все они имеют 0 для касательной Y. Верно ли это для данных касательной? Являются ли эти касательные нормальным пространством вершин или что-то в этом роде? Или они просто выглядят совершенно неправильно? Или я не понимаю, как это работает, и мои данные верны?

Чтобы приблизиться к решению моей проблемы в другом вопросе, мне нужно убедиться, что мои данные верны, и мое понимание того, как работает математика освещения касательного пространства.


person badweasel    schedule 15.03.2013    source источник
comment
По определению, 3 вектора перпендикулярны. Конечно, они могут быть неперпендикулярными по разным причинам, но это приведет к срезанию/искажению текстурного пространства.   -  person Damon    schedule 15.03.2013
comment
Итак, вы голосуете за то, что мои данные касательной неверны?   -  person badweasel    schedule 15.03.2013
comment
Бикасательная и нормальная идентичность выглядит как что-то не так (по крайней мере, это очень редко). В основном это означает, что любые образцы текстуры, которые вы возвращаете, находятся на линии, определяемой касательным вектором. Это будет выглядеть очень странно.   -  person Damon    schedule 15.03.2013
comment
То, что все Y равны нулю, делает их действительно двумерными векторами. Итак, в каком пространстве обычно находится касательный вектор? касательное пространство, но что это значит? Пространство изображения текстуры? Они не должны быть в плоскости, которую представляет треугольник, на который накладывается текстура? Думаю, мне нужно пересчитать их все самому и посмотреть, как они сравниваются.   -  person badweasel    schedule 16.03.2013


Ответы (1)


Касательный и бикасательный векторы указывают в направлении компонентов S и T координаты текстуры (U и V для людей, не привыкших к терминам OpenGL). Таким образом, касательный вектор указывает вдоль S, а бикасательный — вдоль T.

Так что да, они не должны быть ортогональными ни к нормальному , ни друг к другу. Они следуют направлению наложения текстуры. Действительно, это их цель: позволить вам преобразовывать нормали из пространства модели в пространство текстуры. Они определяют отображение из пространства модели в пространство текстуры.

Касательная и битангенс будут ортогональны друг другу, только если компоненты S и T в этой вершине ортогональны. То есть, если наложение текстуры не имеет сдвига. И хотя большинство алгоритмов наложения текстур пытаются свести к минимуму сдвиг, они не могут его устранить. Поэтому, если вам нужна точная матрица, вам нужен неортогональный тангенс и битангенс.

person Nicol Bolas    schedule 15.03.2013
comment
Но как насчет приведенной там выдержки из данных. Бикасательная вершины 2 такая же, как нормаль. Это кажется правильным? И... все тангенсы y равны нулю? Это тоже не кажется правильным, не так ли? - person badweasel; 15.03.2013
comment
@badweasel: я не могу контролировать то, что генерирует эта программа; Я могу только сказать вам, каким должен быть правильный ответ. Вам придется просмотреть свои данные, чтобы убедиться, что они соответствуют тому, что вы получаете. - person Nicol Bolas; 16.03.2013
comment
Я жду, чтобы принять это как ответ, так как я получаю противоречивую информацию. Смотрите мой комментарий к моему вопросу. По вашему опыту, касательные обычно имеют нулевой Y, когда они сопоставляются со сферой? Игнорирование моих данных в течение минуты, чтобы предположить, что это неправильно ... является ли касательная в пространстве / системе координат 2d-текстуры или плоскости, созданной треугольником? - person badweasel; 16.03.2013
comment
Кроме того, ваш ответ заключается в том, что они НЕ ДОЛЖНЫ быть ортогональны друг другу, но большинство руководств по написанию шейдеров карты рельефа вычисляют битангенс = крест (нормаль, касательная). Так же, как и любое руководство о том, как это сделать, предполагает, что ваша текстура не будет иметь никакого сдвига, потому что кажется, что это было бы крайне неточным предположением в большинстве реальных приложений. - person badweasel; 16.03.2013
comment
@badweasel: большинству руководств все равно. Пока результат достаточно хорош, они готовы оставить все как есть. Кроме того, вы не должны чувствовать давление, чтобы принять ответ, который, по вашему мнению, недостаточно хорошо отвечает на ваш вопрос. - person Nicol Bolas; 16.03.2013
comment
@badweasel: является касательной в пространстве/системе координат 2d-текстуры или плоскости, созданной треугольником? Ни то, ни другое. Касательная находится в том же пространстве, что и нормаль, которая обычно является модельным пространством. Касательная указывает в направлении, в котором движется компонент координаты текстуры S. - person Nicol Bolas; 16.03.2013
comment
Другими словами, при разработке касательных векторов в вершине вы обычно используете векторы, представляющие соседние ребра как в пространстве текстуры, так и в пространстве модели, чтобы сопоставить одно с другим. Здесь есть хорошая статья: terathon.com/code/tangent.html - person JasonD; 16.03.2013
comment
@JasonD, но даже этот код просто берет перекрестное произведение нормы и загара, чтобы получить битан. он не вычисляет битан самостоятельно из текстуры s и t. Ответ (я знаю, написанный не вами) говорит, что tan и bitan будут ортогональны только в том случае, если s и t ортогональны. Тогда почему бы не рассчитать битан на основе направления t и s? Никто этого не делает, и большинство шейдеров воссоздают битан с помощью cross(). - person badweasel; 17.03.2013
comment
@badweasel: Тогда почему бы не рассчитать битан на основе направления t и s? Данный сайт делает именно это; это в математической части вверху страницы. Позже в нем говорится: «Не обязательно верно, что касательные векторы перпендикулярны друг другу или вектору нормали [...] Однако можно с уверенностью предположить, что эти три вектора будут, по крайней мере, близки к ортогональным. Точность последней части зависит от вашей сетки. - person Nicol Bolas; 17.03.2013
comment
@badweasel: Никто так не делает Я так делаю. Тот факт, что другие пытаются этого избежать, не означает, что это правильно для них. Если вы хотите, чтобы рельефное отображение было правильным, используйте 3 вектора. Если вы хотите, чтобы ваша рельефная карта была достаточно хорошей, а может и нет, вы используете кросс-произведение. Людей онлайн обычно не волнует правильность. - person Nicol Bolas; 17.03.2013
comment
Хорошо спасибо. Я не так хорошо читаю математические формулы, как код. Поэтому я просмотрел текст, перешел к коду и перенес его на объект c и свою структуру данных. Можете ли вы пояснить в своем ответе, что они, как правило, близки к ортогональным: однако можно с уверенностью предположить, что три вектора будут, по крайней мере, близки к ортогональным, поэтому использование алгоритма Грама-Шмидта для их ортогонализации не должно вызывать каких-либо неприемлемых искажения. И тогда я приму твой ответ. Потому что я читал, что это могут быть любые 3 вектора, и это не будет хорошей матрицей преобразования. Спасибо! - person badweasel; 17.03.2013
comment
@badweasel: Нет. Я с этим не согласен. Я считаю такое мышление опасным. Меня не волнует, сколько людей в сети используют кросс-продуктовый хак; математически правильно нужно передать 3 вектора. Период. - person Nicol Bolas; 17.03.2013
comment
Интересный. В порядке. Я собираюсь попробовать это снова в своем коде, убрав грамм-Шмидт и просто нормализовав вектор. И посмотрите, как это выглядит. Однако мне нужно придумать, как добавить код для расчета битана. - person badweasel; 17.03.2013
comment
@NicolBolas: часть ваших комментариев здесь должна быть включена в ваш ответ, так как это может быть полезно для многих людей. Еще одна вещь, которую вы должны указать в своем ответе: как кто-то вычисляет правильный битангенс, если не векторное произведение? Это так же просто, как поменять местами S и T на этой странице и обработать пересчитанный тангенс как бикасательная? - person Peter O.; 13.06.2015