Спроецировать полигон на плоскость

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Спроецировать полигон на плоскость

Сообщение d3drm » 18.12.2006 (Пн) 4:19

Задача такая, есть полигон (для простоты, к примеру, всего 3 вершины). Вершины могут иметь любые координаты. Задача спроецировать полигон на плоскость, первендикулярную нормали полигона. Накажите меня, пожалуйста, за мое невежество формулами и алгоритами ))
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 18.12.2006 (Пн) 9:19

Если плоскость перпендикулярна нормали к полигону, то полигон проецируется сам в себя. Его только нужно переместить в направлении вектора нормали до совпадения с плоскостью.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.12.2006 (Пн) 14:43

Я либо не понял что ты сейчас хотел сказать, либо в первом посте плохо объяснил.

Есть треугольник с трехмерными координатами. Можно узнать плоскость в которой он лежит. Так вот, нужно найти двумерные координаты этого треугольника на проецируемой плоскости (точку отсчета на плоскости можно задать произвольно).

В общем из 3Д координат надо таким образом получить 2Д координаты.
ХЎ

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 18.12.2006 (Пн) 15:03

в первом посте

спроецировать полигон на плоскость, первендикулярную нормали полигона.


в этом случае плоскость треугольника и плоскость проекции паралельны - и треугольник действительно проецируется сам в себя

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

как - незнаю, ибо тоже в формулах не силён :)

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.12.2006 (Пн) 15:12

nekeda, не мути воду. То, что плоскости паралельны следует из условия, которое я сам и задал, не путай всех пожалуйста.
ХЎ

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 18.12.2006 (Пн) 15:37

d3drm
я не мучу воду. :? ты сказал что не понял, что хотел сказать Майкл, я пытаюсь разобратся и переформулировать.
Задача спроецировать полигон на плоскость

Ты задаёшь условием задачи, что плоскости паралельны, но при таком условии данной задачи нет вообще.
В общем из 3Д координат надо таким образом получить 2Д координаты.

А это совсем другая задача. Точно формулы не помню, но смысл в том, чтобы развернуть плоскость так, чтобы Z координаты точек стали равны и просто их убрать.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.12.2006 (Пн) 15:40

nekeda писал(а):Ты задаёшь условием задачи, что плоскости паралельны, но при таком условии данной задачи нет вообще


НУ ПОЧЕМУ??? Есть 3Д координаты, надо получить 2Д, СПРОЕЦИРОВАННЫЕ на паралельную плоскость, или на туже самую, что роли не играет, почему НЕТ ЗАДАЧИ???
ХЎ

nekeda
Постоялец
Постоялец
 
Сообщения: 710
Зарегистрирован: 10.04.2005 (Вс) 23:20

Сообщение nekeda » 18.12.2006 (Пн) 15:46

Хм.. наверное, я не правильно понимаю слово "проецировать". Прошу прощения, в таком случае.)

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 18.12.2006 (Пн) 16:08

Фух, ну да ладно =)

Тема остается актуальной...
ХЎ

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 19.12.2006 (Вт) 9:39

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

Вектора новога базиса(UVN):
N = N(к плоскости)
V = (любой вектор на плоскости)
U = [VxN](cross)

матрица перехода:

| Ux Vx Nx 0 |
| Uy Vy Ny 0 |
| Uz Vz Nz 0 |
| -(P dot U) -(P dot v) -(P dot n) 1|


где P - вектор начало нового базиса, произвольная точка плоскости.
Собственно переход: Puvn = Pxyz*Mtransform
Вот так-то :) Надеюсь правильно понял задачу.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 19.12.2006 (Вт) 10:28

d3drm
Так бы и сказал, что нужно корректно покрыть текстурой произвольный треугольник (я угадал?). Когда-то такая тема была, я даже демку выкладывал, найти только ту тему не могу. Вот еще раз:

Tarantul
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 13.12.2004 (Пн) 16:39
Откуда: IUnknown

Сообщение Tarantul » 19.12.2006 (Вт) 11:12

Раз уж на то пошло, то вот еще пример текстурирования:

Код: Выделить всё
Sub AddTriangleEx(V1 As VECTOR, V2 As VECTOR, V3 As VECTOR, ByVal Tex As Long)

Dim VT(1 To 3) As Vertex
Dim SideOne As VECTOR, SideTwo As VECTOR
Dim t As Single

SideOne = VSub(V2, V1)
SideTwo = VSub(V3, V1)
   
t = Dot(SideOne, SideTwo) / (VLen(SideTwo)^2)
   
VT(1).Location = V1: VT(1).tu = 0: VT(1).tv = 1
VT(2).Location = V2: VT(2).tu = t: VT(2).tv = 0
VT(3).Location = V3: VT(3).tu = 1: VT(3).tv = 1

AddTriangle VT(1), VT(2), VT(3), Tex

End Sub


Типа передаються координаты трех вершин(по часовой стрелке!), в результате прощитываються координаты текстуры и добавляется треугольник :) Если надо с без ростягивания, а с координатами больше 1 - глянь мою дему в наших проектах.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 19.12.2006 (Вт) 18:35

Mikle, примерно угадал, но не треугольника, а произвольного многоугольника. Идея такова, что надо имеющуюся фигуру заключить в описанный квадрат (спроецировав на плоскость). Координаты тектстуры квадрата = (0,0)-(1,1), т.е. помещается на него одна текстура. Далее смотрим где у нас лежат точки нашего многоугольника и соответственно ставим этим точкам координаты.

Надеюсь понятно объяснил...
ХЎ

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 19.12.2006 (Вт) 18:37

Собствено если мне кто-нибудь скажет как повернуть треугольник, чтобы он был паралелен любой из плоскостей координат (XY, YZ, XZ) - я этим удовлетворюсь =)
ХЎ


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList