Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Определение видимости точки в пространстве


Автор: Kero 27.4.2010, 22:18
Привет!
1. Есть точка x y z
2. Есть матрица проекции Matrix3D которая состоит из матрицы камеры, перспективы и трансляции, тоесть матрица готовая к проектированию
3. Это всё работает в сильверлайте поэтому прошу всякие методы с directx не предлагать

Вобщем вопрос:
Имея п.2 и п1. как определить являеться ли точка видимой для камеры?

Автор: Rpahut 28.4.2010, 15:16
Если применить матрицу проекции к точке, получатся координаты проекции точки на экран. Так оно в принципе все и работает. Останется только проверить, попадает ли точка в собственно экран или нет.
Реально ИМХО быстрее посчитать угол между вектором направления камеры и вектором камера->точка.

Автор: Kero 28.4.2010, 16:16
Да. Угол посчитать действительно проще  smile 

Но остаёться непонятным как анализируя угол между векторами направления и точки определить входит ли точка в видимый диапазон или нет.

Автор: Rpahut 29.4.2010, 06:47
Ну...
Если посчитанный угол больше угла обзора камеры, точка не видна.

Автор: Kero 29.4.2010, 09:04
А как посчитать угол обзора камеры? 

Автор: Rpahut 29.4.2010, 13:44
Угол обзора выбирается программистом, параметры камеры/матрицы проекции задаются исходя из желаемого угла обзора. Т.е. угол этот по идее известен заранее. Ну, там может быть два угла обзора - по вертикали и по горизонтали, использовать нужно бо'льший из них, обычно это угол обзора по горизонтали. А еще лучше посчитать угол "по диагонали" - корень_из(угол_по_Х_вквадрате + угол_по_Y_вквадрате).

Не знаю как в силверлайте устанавливаются параметры камеры, но "истина где-то там".

Автор: Kero 2.5.2010, 11:16
Цитата(Rpahut @ 29.4.2010,  13:44)
Угол обзора выбирается программистом, параметры камеры/матрицы проекции задаются исходя из желаемого угла обзора. Т.е. угол этот по идее известен заранее. Ну, там может быть два угла обзора - по вертикали и по горизонтали, использовать нужно бо'льший из них, обычно это угол обзора по горизонтали. А еще лучше посчитать угол "по диагонали" - корень_из(угол_по_Х_вквадрате + угол_по_Y_вквадрате).

Не знаю как в силверлайте устанавливаются параметры камеры, но "истина где-то там".

В сильверлайте никак не устанавливаються...
Мне пришлось писать класс камеры самому.
Как и классы простейших обьектов...

Сделал так как ты порекомендовал:
*А еще лучше посчитать угол "по диагонали" - корень_из(угол_по_Х_вквадрате + угол_по_Y_вквадрате).

Проблема в том что когда точка уходит за верхний или нижний край экрана обьект всё ещё видим некоторое время. Каким образом посчитать горизонтальный и вертикальный углы чтобы более точно определить видимость?

Автор: Rpahut 2.5.2010, 21:27
Точный способ - проецирование точки на экран (см. выше). Можно добавить эту проверку после первой, чтобы применять не к каждой точке.

Вот http://www.geeks3d.com/20090729/howto-perspective-projection-matrix-in-opengl/ код построения матрицы проекции из параметров камеры. Можно вычислить углы из матрицы, но лучше иметь их сразу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)