Определить четвертый набор UV-координат из первых трех

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

введите здесь описание изображения

Например, на изображении выше я знаю, что верхние левые координаты — [0, 0], верхние правые координаты — [1, 0], а нижние левые — [0, 1]. Как я могу математически определить правые нижние UV-координаты [1, 1]? Я хочу выяснить, каким будет четвертый набор координат UV математически, чтобы текстура, отображаемая в треугольнике, координаты UV которого, как я знаю, соответствовала квадрату.

введите здесь описание изображения

Мне нужно уметь справляться со сложными ситуациями. Координаты UV и координаты X, Y и Z могут быть любыми, за исключением того, что я знаю, что это всегда будет плоское лицо.

введите здесь описание изображения

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

введите здесь описание изображения

Мой первоначальный подход к этому включал проверку того, насколько координата U изменяется на определенном расстоянии X, а затем то же самое для Y и Z, пока я не нашел взаимосвязь, но я продолжаю находить новые исключения из этой логики, и мне интересно, есть ли более простой способ.

Как я могу интерполировать UV для расчета четвертой, пятой... n-й точки? Нет конкретного языка кодирования - я просто ищу подход.


person tomysshadow    schedule 16.03.2017    source источник


Ответы (1)


Вычислите барицентрические координаты вершин, для которых отсутствуют атрибуты U/V, и используйте эти координаты. экстраполировать отсутствующие атрибуты (U/V или любые другие фактически).

Вот полный вывод и решение для дополнительной вершины грани с позицией P и координатами U/V T:

P1 = (x1, y1, z1), T1 = (u1, v1)
P2 = (x2, y2, z2), T2 = (u2, v2)
P3 = (x3, y3, z3), T3 = (u3, v3)
P  = (x , y , z ), T  = (u , v ) = ?

Точка P на плоскости, поддерживающей треугольник (P1, P2, P3) (и, следовательно, все лицо) имеет барицентрические координаты l1, l2, l3:

P = l1 P1 + l2 P2 + l3 P3

with l1 + l2 + l3 = 1

Это можно переписать как:

P - P1 = ( l1 - 1 ) P1 + l2 P2 + l3 P3
       = -( l2 + l3 ) P1 + l2 P2 + l3 P3
       = l2 ( P2 - P1 ) + l3 ( P3 - P1 )

with l1 = 1 - l2 - l3

Проецирование вектора V = P - P1 на векторы V21 = P2 - P1 и V31 = P3 - P1 дает:

< V, V21 > = l2 < V21, V21 > + l3 < V31, V21 >
< V, V31 > = l2 < V21, V31 > + l3 < V31, V31 >

где < V1, V2 > — скалярное произведение 3D-векторов V1 и V2.

Итак, (l1, l2, l3) можно найти для P, решив линейную систему:

G L = ( < V21, V21 > < V31, V21 > ) ( l2 ) = ( < V, V21 > ) = D
      ( < V21, V31 > < V31, V31 > ) ( l3 )   ( < V, V31 > )

L = ( l2 ) = G^-1 D
    ( l3 )

and l1 = 1 - l2 - l3

Это можно решить явно:

d = < V21, V21 > < V31, V31 > - < V21, V31 >^2

l1 = 1 - l2 - l3
l2 = ( < V31, V31 > < V, V21 > - < V21, V31 > < V, V31 > ) / d
l3 = ( < V21, V21 > < V, V31 > - < V21, V31 > < V, V21 > ) / d

Обратите внимание, что поскольку позиция P дополнительной вершины находится вне треугольника (P1, P2, P3), неравенства l1, l2, l3 >= 0 больше не будут выполняться.

Наконец, вычислите экстраполированные координаты U/V T дополнительной вершины:

T = l1 T1 + l2 T2 + l3 T3
person user3146587    schedule 16.03.2017