3d графика, единичные векторы и ортогональные матрицы - PullRequest
1 голос
/ 29 декабря 2010

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

  1. Когда у меня есть ортогональная матрица (например, матрица TBN), и я позволяю opengl интерполировать ее между вершинами, три результирующих вектора (T, B и N) все еще остаются единичной длиной? они все еще находятся под углом 90 градусов друг к другу?
  2. Когда я умножаю выборку моей карты нормалей (единичной длины) на мою ортогональную матрицу, гарантируется ли результат также на единицу длины? Я думаю, что это так, но не могу рассуждать.
  3. Я думал об использовании детальных карт нормалей, чтобы объекты, расположенные близко, выглядели не так плохо, как сейчас. Это будет означать, что есть две нормальные карты. Как мне объединить два образца?

Чтобы ответить на мой собственный вопрос, коллега подошел к работе над # 2 и предложил элегантное доказательство. Здесь немного много, но достаточно сказать, что это правда.

Ответы [ 2 ]

1 голос
/ 07 января 2011

Поскольку все еще нет полных ответов, я решил, что мне стоит попробовать:

1) Нет и нет. Представьте себе три вектора v1, v2 и v3, которые попарно ортогональны и имеют единичную длину. Тогда, конечно, -v3 имеет длину единицы и также ортогональн к v1 и v2. Теперь представьте матрицы A=(v1|v2|v3) и B=(v2|v1|-v3). Если вы интерполируете между ними, вы получите C=((v1+v2)/2|(v1+v2)/2|0) прямо в середине. Легко видеть, что это не будет поддерживать длину: (0 0 1)^T просто станет нулевым вектором. Кроме того, первый и второй столбцы будут равны, что означает, что их угол равен 0 °. Однако на практике две матрицы, которые вы будете интерполировать, обычно не будут достаточно разными для такого вырождения. это если ваша поверхность ориентируема. Поверхности ориентируемы, если на них можно определить согласованность внутри и снаружи. Мебиус-стрип - типичный контрпример! Немного более правильным способом будет интерполяция поворотов (опять же, поверхность должна быть ориентируемой): вы можете использовать сферическую интерполяцию (google!) Или нормализованную интерполяцию (интерполировать матрицы и ортогонализировать, но это также не удастся в некоторых случаях) , Однако обе интерполяции могут быть дорогостоящими - и на практике люди просто преобразуют источник света в координаты TBN вершин и используют линейную интерполяцию (что эквивалентно просто линейной интерполяции на матрицах TBN).

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

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

1 голос
/ 05 января 2011

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

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

2) Единичный вектор, умноженный на ортонормированную матрицу, будет иметь единичную длину. Вы действительно просто делаете поворот в другую систему отсчета. Если векторы в матрице ортогональны, но не нормальны, ваш вектор будет уменьшен на ту же долю.

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

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

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