Проблема выбраковки усеченного прямоугольника - PullRequest
1 голос
/ 31 января 2011

Я пытаюсь применить усечку в моей игре OpenGL 2d.Единственным видом геометрических объектов в моей игре на данный момент являются прямоугольники, поэтому я подумал, что это будет довольно легко, но я получаю неожиданные результаты.Я настроил симметричную перспективную проекцию с углом поля зрения 45 градусов, а ближней и дальней плоскостями - 0,01 и 50 соответственно.Вектор глаза всегда параллелен оси z, камера может двигаться только вдоль осей x и y.

Моя идея заключалась в том, чтобы получить прямоугольную область мирового пространства, которая в данный момент видна камере вкоордината z прямоугольника, который я пытаюсь отбраковать.Поскольку камера смотрит в центр усеченного конуса, я вычисляю расстояние до краев этой видимой прямоугольной области следующим образом:

GLfloat maxDistance = givenRectangle.z * tanf(0.5 * (fovAngle * M_PI/180) );

Затем добавляю и вычитаю это расстояние к x и y и обратнокоординаты камеры, чтобы получить максимальные и минимальные видимые значения x и y, а затем проверить заданный прямоугольник, чтобы определить, находится ли он между этими значениями.

Мой вопрос: нахожусь ли я на правильном пути и почемуПриведенная выше формула возвращает абсурдно малое значение (что-то * 10 ^ -37), когда у меня есть объект с z = 5, который должен четко просматриваться камерой при (0,0,0)?

1 Ответ

3 голосов
/ 04 марта 2011

Взяв задачу сверху, я проверил вашу формулу - см. Эскиз, чтобы подтвердить, что я вас правильно понял.

enter image description here

Учитывая, что мы знаем A и Z и хотим найти для X, я сначала написал:

загар (A) = X / Z

переставляя, я получаю:

X = Z tan (A)

Так как Z = 5 и A = 22,5 градуса ...

X = 5 * загар (22,5 градуса)

X = 2,07106781

Итак, кажется, что вы правильно поняли математические данные, но ваш код неверен - может быть, ваша функция загара ожидает градусы, а не радианы, или fovAngle не был установлен? Я думаю, вам нужно отладить и вручную проверить каждое значение.


Возвращаясь к более широкой проблеме выяснения того, что лежит и не лежит внутри вашего усеченного конуса, вы можете обнаружить, что вы можете использовать другой тест для более элегантного ответа на тот же вопрос. Многие графические кодеры используют тест "side-of-plane". Учтите, что ваш усеченный обзор - это объем пространства, ограниченный набором из 6 плоскостей (4 для сторон вашего окна просмотра, ближней плоскости отсечения и дальней плоскости отсечения).

Учитывая точку на плоскости и нормаль для плоскости, вы можете довольно легко вычислить уравнение плоскости, что, в свою очередь, делает тривиальным проверить, находится ли данная точка "внутри" (в направлении нормального) данной плоскости . Выполните итерацию по всем 6 плоскостям, и вы быстро управляете заданной точкой в ​​объеме просмотра.

По-настоящему изящная вещь в этом тесте заключается в том, насколько легко вы можете использовать его повторно: любой простой выпуклый многоугольник, на котором вы хотите провести тесты (например, прямоугольник), можно описать как набор плоскостей, что -используй свой тест "изнутри или снаружи". Очень общее.

...