Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];

Вниз

поворот плоскости перпендикулярно точке.   Найти похожие ветки 

 
@!!ex ©   (2007-10-17 20:55) [0]

Дано:
3Д пространство.
Две точки(p1,p2) задающие положение прямоугольника.
Ессть ширина(width) прямоугольника. (ДЛины нет, поскольку она равная расстоянию между точками).
Есть еще одна точка(view). Положение наблюдателя.
Через две точки строится прямоугольник. точки лежат на середине противоположных граней прямоугольника.
Задача в том, чтобы зная три точки и ширину построить в пространстве прямоугольник так, чтобы нормаль опущенная из точки view на поверхность прямоугольника попадала на ось p1p2.

помогите решить. НИкак не могу понять как это сделать. Ничего полезного не гуглится...


 
@!!ex ©   (2007-10-17 20:56) [1]

упс. картинку забыл. сейчас.


 
@!!ex ©   (2007-10-17 21:04) [2]

http:\\img222.imageshack.us/my.php?image=cilynderbillboardoe0.gif


 
Александр Иванов ©   (2007-10-17 21:12) [3]

А в чем проблема?
Задача, на мой взгляд сводится в нахождении уравнения плоскости, перпендикулярной прямой, и проходящей через заданную точку.
Находим центр отрезка, уравнение прямой, проходящей через найденную точку и "положение наблюдателя" и находим уравнение плоскости.


 
@!!ex ©   (2007-10-17 21:30) [4]

У меня очень сложные формулы получаются...
Сначало сложное нахождение плоскости, потом нахождение каждой точки на этой плоскости...
Да если это считать в кадре даже для 100 прямоугольников, уже нагрузка получаеться знатная...
А хочеться то побыстрее чтоб работало...


 
@!!ex ©   (2007-10-17 23:13) [5]

Нашел элементарный способ с точки зрения реализации.
Строим прямоугольник вертикально вверх в начале координат. Это элементарно делается.
Дальше тупо матрице трансформации перемещаем и вращаем его так, чтобы точки лежащие на гранях совпали с заданными точками. Матрица легко получается(ведь углы мы можем вычислить). После чего считаем угол между нормалью и вектором идущем к точки. и тупо поворачиваем прямоугольник на полученный угол. Еще не проверял, но на бумаге вроде все получаеться.
Интересно, каким способом обычно делают цилиндрические спрайты....


 
MBo ©   (2007-10-18 06:11) [6]

точки P1 и P2 задают параметрическую прямую P1* + (P2-P1)*t
находим на ней точку P c параметром t таким, что VP _|_ P1 (через скалярное произведение)
PX = UnitVector(VP x P1P) (векторное произведение)
D(третья вершина прямоугольника) = P1 + Width * PX


 
MBo ©   (2007-10-18 08:00) [7]

да, проще найти параметр так
t=P1P2 * P1V/(P1P2)^2


 
Думкин ©   (2007-10-18 08:13) [8]

D(третья вершина прямоугольника) = P1 + Width * PX
Первая вершина: P1 + Width /2 * PX
Вторая вершина: P1 - Width /2 * PX
Третья вершина: P2 - Width /2 * PX
Четвертая вершина: P2 + Width /2 * PX


 
MBo ©   (2007-10-18 08:28) [9]

>Думкин ©   (18.10.07 08:13) [8]
а, я вот это упустил:
>точки лежат на середине противоположных граней прямоугольника


 
oldman ©   (2007-10-18 10:33) [10]


> @!!ex ©   (17.10.07 20:55)  


Может я что-то недопонял?

Две точки есть. Строим отрезок.
Из точки view проводим на этот отрезок перпендикуляр.
А дальше строим прямоугольник "простыми перпендикулярами" к имеющейся фигуре, т.е. стороны прямоугольника, на которых лежат точки, должны быть перпендикулярны и отрезку и нормали. Так как точки = середины, достроить еще проще.

Осталось вспомнить условия (уравнения) перпендикулярности.


 
@!!ex ©   (2007-10-18 11:21) [11]

Получилось что-то типа:
t=P1P2 * P1V/(P1P2)^2
P=P1 + (P2-P1)*t
PX=UnitVector(VP x P1P)
Первая вершина: P1 + Width /2 * PX
Вторая вершина: P1 - Width /2 * PX
Третья вершина: P2 - Width /2 * PX
Четвертая вершина: P2 + Width /2 * PX

ТОлько я не понял, что такое UnitVector?
И что за запись: P1* + (P2-P1)*t
Идет * и сразу +


 
Думкин ©   (2007-10-18 11:58) [12]

> @!!ex ©   (18.10.07 11:21) [11]

1. Приведение вектора к единичному. Сам деленный на свой модуль.
2. описка. звездочку убрать.


 
@!!ex ©   (2007-10-18 12:02) [13]

> [12] Думкин ©   (18.10.07 11:58)

Аааа. Нормализация. Понял.


 
@!!ex ©   (2007-10-18 12:10) [14]

Еще несколько моментов не понял.
t=P1P2 * P1V/(P1P2)^2                    //Тут нне понятно. Как можно возводить векторв в степень? Как делить вектора на вектор?
P=P1 + (P2-P1)*t                         //Тут все понятно
PX=UnitVector(VP x P1P)                  //Тут все понятно
Первая вершина: P1 + Width /2 * PX       //Тут все понятно
Вторая вершина: P1 - Width /2 * PX       //Тут все понятно
Третья вершина: P2 - Width /2 * PX       //Тут все понятно
Четвертая вершина: P2 + Width /2 * PX    //Тут все понятно


 
Думкин ©   (2007-10-18 12:28) [15]

> Тут нне понятно


Исходи из:

точки P1 и P2 задают параметрическую прямую P1* + (P2-P1)*t
находим на ней точку P c параметром t таким, что VP _|_ P1 (через скалярное произведение)


Распиши условие перпендекулярности. Увидишь где вектора, где скаляры.


 
MBo ©   (2007-10-18 13:21) [16]

>t=P1P2 * P1V/(P1P2)^2                    //Тут нне понятно. Как можно возводить векторв в степень? Как делить вектора на вектор?

скалярное произведение векторов делить на квадрат модуля одного из них

Это по сути - нахождение параметра для проекции точки на прямую


 
MBo ©   (2007-10-18 13:24) [17]

вот тут в разделе Параметризованная прямая есть подхъодящая картинка:
http://algolist.ru/maths/geom/distance/pointline.php


 
@!!ex ©   (2007-10-18 15:57) [18]

тоесть чтото типа:
t:=dotProduct(P1P2,P1V)/sqr(VectorLength(P1P2));
?


 
@!!ex ©   (2007-10-18 17:04) [19]

Вот тако получилось, правда работоспособность еще не проверял.

 t:=DotVector(SubVector(Point1,Point2),SubVector(View,Point1))/sqr(DistancePoints(Point1,Point2));
 P:=AddVector(Point1,ScaleVector(SubVector(Point2,Point1),t));
 PX:=ScaleVector(NormalizeVector(CrossVector(SubVector(View,P),SubVector(Point1,P ))),Width);

 P1:=AddVector(Point1,PX);
 P2:=SubVector(Point1,PX);
 P3:=SubVector(Point2,PX);
 P4:=AddVector(Point2,PX);


Где
Point1,Point2 - точки спрайта.
View - Позиция наблюдателя.


 
@!!ex ©   (2007-10-18 17:15) [20]

Не работает.... :\\\\\


 
@!!ex ©   (2007-10-18 17:24) [21]

Я тупой. Все что смог оттестить - работает.
Спасибо большое товарищи!!
А может объяснити мне смысл действий этих?
понять пытаюсь, но не особо получаеться. :(


 
@!!ex ©   (2007-10-18 17:26) [22]

Супер, я вообще в шоке, замечательно получилось!!! :D



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.11.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.046 c
15-1192101300
Knight
2007-10-11 15:15
2007.11.18
Как исправить html-страницу в которой почти вся кириллица кодами?


15-1192196677
parrot
2007-10-12 17:44
2007.11.18
просто абассака (~2 мб)


2-1193297234
em240
2007-10-25 11:27
2007.11.18
CheckListBox+IndexOfObject


2-1193221250
DevilDevil
2007-10-24 14:20
2007.11.18
вопрос по TPopupMenu. Прямоугольная область.


2-1193398035
Alex_C
2007-10-26 15:27
2007.11.18
Как в своей форме перехватить открытие диалога выбора файла?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский