Определить четвертый набор координат 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