Форум: "Прочее";
Текущий архив: 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.038 c