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

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

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

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

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

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

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

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

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

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

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

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 > является точечным произведением трехмерных векторов 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
Другие вопросы по тегам