Как преобразовать 3D-точку на плоскости в координаты UV?

У меня есть 3d точка, определенная [x0, y0, z0].

Эта точка принадлежит плоскости, заданной [a, b, c, d].

normal = [a, b, c] и ax + by + cz + d = 0

Как преобразовать или сопоставить трехмерную точку с парой координат (u,v)?

Это должно быть что-то очень простое, но я не могу понять.


person tigrou    schedule 06.09.2013    source источник
comment
Вы говорите об общих (u, v) координатах? Или вы пытаетесь сопоставить точку в мировом пространстве с текстурными координатами, определенными на треугольнике?   -  person sbabbi    schedule 06.09.2013
comment
я хочу текстурировать самолет   -  person tigrou    schedule 06.09.2013


Ответы (2)


Прежде всего, вам нужно вычислить векторы u и v. u и v должны быть ортогональны нормали к вашей плоскости и ортогональны друг другу. Не существует единственного способа их определения, но удобный и быстрый способ может выглядеть примерно так:

n = [a, b, c] 
u = normalize([b, -a, 0]) // Assuming that a != 0 and b != 0, otherwise use c.
v  = cross(n, u) // If n was normalized, v is already normalized. Otherwise normalize it.

Теперь подойдет простое скалярное произведение:

u_coord = dot(u,[x0 y0 z0])
v_coord = dot(v,[x0 y0 z0])

Обратите внимание, что это предполагает, что начало координат u-v является мировым началом (0,0,0).

Это будет работать, даже если ваш вектор [x0 y0 z0] не лежит точно на плоскости. Если это так, он просто спроецирует его на плоскость.

person sbabbi    schedule 06.09.2013
comment
Один вопрос: что вы делаете с вектором t, и когда вычисляется v_coord, откуда взялся вектор v? - person tigrou; 08.09.2013
comment
@tigrou, извините, неправильно написал v вместо t. Отредактировано - person sbabbi; 08.09.2013
comment
Я попробовал эту замену v и t перед тем, как оставить комментарий, но это не сработало, но настоящая причина заключалась в том, что n был неверным в моей программе. Я исправил это, и это сработало. Спасибо - person tigrou; 08.09.2013

Предположим, вы хотите найти координаты любой точки на плоскости с точки зрения координат (u, v)...

Если точка [x0,y0,z0] лежит в плоскости, то мы знаем, что

dot([a,b,c],[x0,y0,z0]) = -d

Где точка — скалярное произведение двух векторов. Это просто переписывание уравнения плоскости.

Хитрость заключается в том, чтобы найти два вектора, которые охватывают плоское подпространство. Для этого выберем случайный вектор длины 3. Назовем его V0. Я назову вектор плоской нормали

N = [a,b,c]

Затем используйте векторное произведение вектора нормали N на V0.

V1 = cross(N,V0)

Этот вектор будет ортогонален вектору нормали, если только нам не очень повезло и N и V0 оказались коллинеарными. В этом случае просто выберите другой случайный вектор V0. Мы можем сказать, были ли два вектора коллинеарными, потому что тогда V1 будет вектором [0 0 0].

Итак, если V1 не является нулевым вектором, то разделите каждый элемент на норму V1. Норма вектора — это просто квадратный корень из суммы квадратов элементов.

V1 = V1/norm(V1)

Затем мы выбираем второй вектор V2, который ортогонален как N, так и V1. Опять же, векторное перекрестное произведение делает это тривиально. Нормализуйте этот вектор, чтобы он также имел единичную длину. (Поскольку теперь мы знаем, что V1 — вектор с единичной нормой, мы могли бы просто разделить на норму (N).)

V2 = cross(N,V1)
V2 = V2/norm(V2)

ЛЮБУЮ точку на плоскости теперь можно тривиально описать как функцию (u, v), как:

[x0,y0,z0] + u*V1 + v*V2

Например, когда (u,v) = (0,0), ясно, что мы получаем обратно [x0,y0,z0], поэтому мы можем думать об этой точке как о «начале» в координатах (u,v).

Точно так же мы можем делать такие вещи, как восстановление u и v из любой точки [x, y, z], которая, как известно, лежит на плоскости, или мы можем найти нормальную проекцию для точки, которая не находится на плоскости, спроецированной в эту плоскость. самолет.

person Community    schedule 06.09.2013