2011-01-31 3 views
1

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

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

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

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

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

+0

Вы хотите сказать, что 3D? –

+0

Да, технически у меня есть только 2d прямоугольники в 3D-перспективе, так что бы вы не хотели называть это :) Причина, по которой мне нужна перспектива, заключается в том, что я хочу иметь возможность увеличения и уменьшения масштаба, у меня есть мир с ориентация камеры сверху вниз – Jacob

+0

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

ответ

3

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

enter image description here

Учитывая, что мы знаем, А и Z и хотим решить для X, я сначала написал:

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

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

X = Z тангенс (а)

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

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

X = 2,07106781

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


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

Учитывая точку на плоскости и нормаль для плоскости, вы можете легко вычислить уравнение плоскости, которое, в свою очередь, makes it trivial to test whether a given point is "inside" (in the direction of the normal) a given plane. Итерации через все 6 самолетов, и вы быстро управляете данной точкой в ​​или из объема просмотра.

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

+0

Спасибо за ваш ответ, это действительно то, что я имел в виду. Я также выяснил, в чем проблема: это было что-то с двойным указателем на fovAngle, который не работал должным образом в моем конкретном коде ... Один вопрос о вашем способе отбраковки усечения: я прав, подозревая, что этот более общий подход медленнее для простых прямоугольников, чем описанный мной метод? – Jacob

+0

Рад, что вы нашли ошибку, звучит как разочаровывающая. Да, метод самолетов, несомненно, будет медленнее. Это может спасти вас в процессе развития на определенном этапе, но с вашей конкретной ситуацией это может быть излишним. –

+0

Говоря о скорости, если вы так или иначе пишете 2D-игру и действительно хотите разобраться в производительности, не используйте перспективу. Если вместо этого вы используете орфографическую проекцию, ваш тест на «прямоугольник внутри экрана» будет проще, 0

Смежные вопросы