Pregunta

Estoy tratando de implementar el sacrificio de Frustum en mi juego OpenGL 2D. El único tipo de objetos geométricos en mi juego en este momento son los rectángulos, por lo que pensé que esto sería bastante fácil, pero estoy obteniendo resultados inesperados. He configurado una proyección de perspectiva simétrica con un ángulo de campo de visión de 45 grados, y planos cercanos y lejanos a 0.01 y 50 respectivamente. El vector ojo siempre es paralelo al eje Z, la cámara solo puede moverse a lo largo de los ejes X e Y.

Mi idea era obtener el área rectangular del espacio mundial que actualmente es visible para la cámara en la coordenada Z del rectángulo que estoy tratando de seleccionar. Debido a que la cámara está mirando el centro del frustum, calculo la distancia a los bordes de esta área rectangular visible de la siguiente manera:

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

Luego agrego y reduzco esta distancia hacia y desde las coordenadas X e Y de la cámara para obtener el máximo y mínimo visible X e Y, y luego pruebo el rectángulo dado para ver si se encuentra entre estos valores.

Mi pregunta es si estoy en el camino correcto aquí y por qué la fórmula anterior devuelve un valor absurdamente pequeño (algo*10^-37) cuando tengo un objeto en z = 5, que claramente debe ser visible con la cámara en ( 0,0,0)?

¿Fue útil?

Solución

Tomando el problema desde arriba, he revisado su fórmula; vea el boceto para confirmar que lo he entendido correctamente.

enter image description here

Dado que sabemos A y Z y queremos resolver para X, escribí por primera vez:

tan (a) = x/z

reorganizando, obtengo:

X = z tan (a)

Desde z = 5 y a = 22.5 grados ...

X = 5* Tan (22.5 grados)

X = 2.07106781

Entonces, parece que tienes las matemáticas correctas, pero tu código está mal, tal vez tu función de bronceado espera grados en lugar de radianos, o fovangular ¿No se ha establecido? Creo que necesitas depurar y verificar a mano cada valor.


Volviendo al problema más amplio de averiguar qué y no se encuentra dentro de su frustum, puede encontrar que puede usar una prueba diferente para responder la misma pregunta con más elegancia. Muchos codificadores gráficos usan una prueba de "lado del plano". Tenga en cuenta que su frustum de visión es un volumen de espacio limitado por un conjunto de 6 planos (4 para los lados de su ventana gráfica, un plano de recorte cercano y un plano de recorte lejano).

Dado un punto en un plano y un normal para el plano, puede calcular fácilmente la ecuación de un plano, que a su vez hace que sea trivial probar si un punto dado está "dentro" (en la dirección de lo normal) un plano dado. Iterar a través de los 6 aviones y rápidamente gobernará un punto dado dentro o fuera de su volumen de visualización.

Lo realmente bueno de esta prueba es la facilidad con que puede reutilizarla: cualquier polígono convexo simple en el que desee hacer pruebas (por ejemplo, un rectángulo) puede describirse como un conjunto de planos, lo que le permite reutilizar su Prueba de "interno o exterior". Muy general.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top