Я пытаюсь реализовать отсечение усеченного конуса в моей игре 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)?