Народ помогите
Проблема такова:
необходимо определить видимость треугольника.
насколько я знаю на основе камеры формируется 4 плоскости верхняя, нижняя и тд.
потом к каждой плоскости берем "dot product" a*x + b*y + c*z + d*1 с точкой
и на основе результата смотрим попал не попал.
но я не понял как получить эти 4 плоскости с каких параметров ???
понятно что из проекции но как...чето не получается...
был бы очень благодарен за описание или доку или ссылку на доку
Здравствуйте Archer, Вы писали:
A>Народ помогите A>Проблема такова: A>необходимо определить видимость треугольника. A>насколько я знаю на основе камеры формируется 4 плоскости верхняя, нижняя и тд. A>потом к каждой плоскости берем "dot product" a*x + b*y + c*z + d*1 с точкой A>и на основе результата смотрим попал не попал. A>но я не понял как получить эти 4 плоскости с каких параметров ??? A>понятно что из проекции но как...чето не получается... A>был бы очень благодарен за описание или доку или ссылку на доку
С треугольником всё просто.
Достаточно определить видимость трёх точек — его вершин.
Видимость точки определять умеешь?
Четыре плоскости?
например верхняя
Проводим плоскость через три точки
1. Глаз наблюдателя.
2. Верхний левый угол экрана.
3. Верхний правый верхний угол экрана.
Потом смотрим по какую сторону этой плоскости
лежит твоя точка — внутри видимой области или вне?
И так 4 раза.
Если все 4 раза ответ — "внутри", то видна.
Re[2]: Определение видимости треугольника
От:
Аноним
Дата:
14.03.02 15:01
Оценка:
Рек>С треугольником всё просто. Рек>Достаточно определить видимость трёх точек — его вершин.
Рек>Видимость точки определять умеешь?
Рек>Четыре плоскости?
Рек>например верхняя Рек> Рек>Проводим плоскость через три точки Рек>1. Глаз наблюдателя. Рек>2. Верхний левый угол экрана. Рек>3. Верхний правый верхний угол экрана.
Рек>Потом смотрим по какую сторону этой плоскости Рек>лежит твоя точка — внутри видимой области или вне?
Рек>И так 4 раза. Рек>Если все 4 раза ответ — "внутри", то видна.
Мне только точка и нужна.... главное что я не понял
это как найти координаты верхнего левого угола и нижнего угла экрана
мне бы получить x y z этих точек вот. Обьясните как для тупого плиз.
Здравствуйте Аноним, Вы писали:
Рек>>С треугольником всё просто. Рек>>Достаточно определить видимость трёх точек — его вершин.
Рек>>Видимость точки определять умеешь?
Рек>>Четыре плоскости?
Рек>>например верхняя Рек>> Рек>>Проводим плоскость через три точки Рек>>1. Глаз наблюдателя. Рек>>2. Верхний левый угол экрана. Рек>>3. Верхний правый верхний угол экрана.
Рек>>Потом смотрим по какую сторону этой плоскости Рек>>лежит твоя точка — внутри видимой области или вне?
Рек>>И так 4 раза. Рек>>Если все 4 раза ответ — "внутри", то видна.
А>Мне только точка и нужна.... главное что я не понял А>это как найти координаты верхнего левого угола и нижнего угла экрана А>мне бы получить x y z этих точек вот. Обьясните как для тупого плиз.
Что ты знаешь про камеру?
Re[4]: Определение видимости треугольника
От:
Аноним
Дата:
15.03.02 10:51
Оценка:
Здравствуйте Рек,
Рек>Что ты знаешь про камеру?
Откуда смотрю и куда
ну и настройки проекции
Re[5]: Определение видимости треугольника
От:
Аноним
Дата:
15.03.02 17:32
Оценка:
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Рек,
Рек>>Что ты знаешь про камеру?
А>Откуда смотрю и куда А>ну и настройки проекции
Понял:ты знаешь положение камеры.
Ещё надо знать: (если проекция центральная)
1. фокусное расстояние F (расстояние от экрана до точки, в котрой сходятся лучи пректирования),
2. размеры экрана (H и W).
Всё в одних и тех же единицах (метрах, например).
Тогда вот, например, координаты правой верхней точки в системе координат камеры.
x = sqrt(F*F + W*W),
y = sqrt(F*F + H*H)
Теорема Пифагора всего лишь.
Теперь пересчитай эту точку в мировую систему координат и всё.
Положение камеры тебе извесно, поэтому этот пересчет не вызовет трудностей.
Рек>>>Что ты знаешь про камеру?
А>>Откуда смотрю и куда А>>ну и настройки проекции
А>Понял:ты знаешь положение камеры. А>Ещё надо знать: (если проекция центральная) А>1. фокусное расстояние F (расстояние от экрана до точки, в котрой сходятся лучи пректирования), А>2. размеры экрана (H и W). А>Всё в одних и тех же единицах (метрах, например).
А>Тогда вот, например, координаты правой верхней точки А>в системе координат камеры. А>
А>x = sqrt(F*F + W*W),
А>y = sqrt(F*F + H*H)
А>
А>Теорема Пифагора всего лишь.
А>Теперь пересчитай эту точку в мировую систему координат и всё. А>Положение камеры тебе извесно, поэтому этот пересчет не вызовет трудностей.
я кое что пересрошу :
как найти F я непонял ,проеция задается как l,r,t,b и по z 1-1000
и для перевода из системы координат камеры в мировую надо умножить на матрицу вида
я правильно понял?
спасибо за обьяснения извени что надоедаю...просто очень надо.
Здравствуйте Рек, Вы писали:
Рек>Здравствуйте Archer, Вы писали:
A>>Народ помогите A>>Проблема такова: A>>необходимо определить видимость треугольника. A>>насколько я знаю на основе камеры формируется 4 плоскости верхняя, нижняя и тд. A>>потом к каждой плоскости берем "dot product" a*x + b*y + c*z + d*1 с точкой A>>и на основе результата смотрим попал не попал. A>>но я не понял как получить эти 4 плоскости с каких параметров ??? A>>понятно что из проекции но как...чето не получается... A>>был бы очень благодарен за описание или доку или ссылку на доку
Рек>С треугольником всё просто. Рек>Достаточно определить видимость трёх точек — его вершин.
Ввёл в заблуждение. Ошибся. Обманул. Лопухнулся. Сморозил.
Отчубучил. Вспылил. Был не прав.
Очень грубая ошибка.
Приношу извинения.
Знать видимость трёх точек конечно недостаточно для определения видимости треугольника.
Это вобщем очевидно.
Возьмём например отрезок. Если его концы не видны, то это ещё не значит, что он не виден.
Тоже с треугольником.
Re[3]: Определение видимости треугольника
От:
Аноним
Дата:
18.03.02 11:30
Оценка:
Здравствуйте Рек
да мне вобщето видимость точки только надо...
у тебя нет ссылок на доки на эту тему...или название книжицы или исходник какой-то пример...может в dx sdk или на nvidia ?
потому что я так и не понял как эти точки плоскостей получить :(
хотяб где описано как(не считая graphic gems :) )
спасибо.
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Рек А>да мне вобщето видимость точки только надо... А>у тебя нет ссылок на доки на эту тему...или название книжицы или исходник какой-то пример...может в dx sdk или на nvidia ? А>потому что я так и не понял как эти точки плоскостей получить :( А>хотяб где описано как(не считая graphic gems :) ) А>спасибо.
вот пирамида видимости
вершина — это текущее положение камеры, образно говоря глаз наблюдателя
угол между верхней и нижней плоскостью это угол вертикального обзора
угол между левой и правой плоскостью это угол горизонтального обзора
пирамида симметрична относительно оси камеры т.е. угол между линией вдоль которой вы смотрите и верхней плоскостью и угол между линией вдоль которой вы смотрите и нижней плоскостью равны. Аналогично для левой и правой.
Углы обзова задаются в матрице проекции (Projection Matrix)
[ ]
[ w 0 0 0 ]
[ ]
[ 0 h 0 0 ]
[ ]
[ 0 0 Q 1 ]
[ ]
[ 0 0 -Q*Zn 0 ]
[ ]
w = ctg(ViewAngleHorizontal/2)
h = ctg(ViewAngleVertical/2)
Q = Zf/(Zf-Zn)
Zf == наибольшее расстояние до видимого объекта (Z-координата задней плоскости)
Zn == наименьшее расстояние до видимого объекта (Z-координата передней плоскости)
Если есть уравнение плоскости вида a*x+b*y+z*c+d=0 то
если подставить в него координаты точки получится
1) число больше нуля если точка выше/правее/переднее плоскости
2) 0 если точка на плоскости
3) число меньше нуля если точка ниже/левее/заднее (слово забавное получилось) плоскости
Если же речь о треугольнике то надо посмотреть скалярное произведение нормали к треугольнику и вектора из камеры в треугольник (скажем в центр или любую его точку) и если оно больше нуля треугольник к вам видимой стороной а дальше проверить все его точки на видимость и если ХОТЬ ОДНА видима рисовать
Практически второй пункт (с точками) нередко выполняет драйвер и лучше не делать одну работу дважды (врят ли это можно назвать оптимизацией)
Здравствуйте adontz, Вы писали:
A>Если есть уравнение плоскости вида a*x+b*y+z*c+d=0 то
A>если подставить в него координаты точки получится
вобщем главная проблема это как найти уровнение плоскости поидее из трех точек...одна — это глаз наблюдателя а как расчитать координаты других
двух...тоесть понятно что это верхняя и нижняя точки передней или задней грани, но как расчитать их координаты...наверно в мировой системе координат
Вот в чем дело
Здравствуйте Archer, Вы писали:
A>Здравствуйте adontz, Вы писали:
A>>Если есть уравнение плоскости вида a*x+b*y+z*c+d=0 то
A>>если подставить в него координаты точки получится
A>вобщем главная проблема это как найти уровнение плоскости поидее из трех точек...одна — это глаз наблюдателя а как расчитать координаты других A>двух...тоесть понятно что это верхняя и нижняя точки передней или задней грани, но как расчитать их координаты...наверно в мировой системе координат A>Вот в чем дело
Уравнения в системе координат камеры будет иметь вид
y*cos(VertViewAngle/2)+z*sin(VertViewAngle) = 0 верхняя
y*cos(VertViewAngle/2)-z*sin(VertViewAngle) = 0 нижняя
x*cos(HorzViewAngle/2)+z*sin(HorzViewAngle) = 0 правая
x*cos(HorzViewAngle/2)-z*sin(HorzViewAngle) = 0 левая
А дальше обычные 3D преобразования через матрицы
PS это всё для знающих геометрию и алгебру 11 класса не проблема !