2017-09-11 4 views
1

J'ai actuellement un écran composé de deux zones:Calcul FOV pour un tronc de cône PerspectiveCamera

(Les valeurs sont simplement supposées pour cet exemple particulier et peut bien entendu varier en fonction de l'écran).

L'écran au total est 1080x1432px (WxH) et se compose de deux zones, chacune découpée en utilisant glViewPort. Ceci parce que je veux que la zone (1) ne remplisse pas l'écran lors du zoom.

  1. Zone de jeu. Peut être zoomé. La taille est 1080x1277px (WxH) et situé en haut.
  2. Le HUD (objets Pour votre information d'ici peut être déplacé à la zone (1). Non zoomable. La taille est 1080x154 (LxH).

Les deux ont leurs propres caméras.

Zone (1) la largeur est 15f et la hauteur est plus de 15f (peu importe aussi longtemps qu'il est au moins 15f)

Je veux que la zone (2) soit de largeur 7f et de hauteur (pour plus de commodité). pour régler l'appareil photo en conséquence.J'ai essayé de le faire en calculant le FOV:

float size = 1f; 
float halfHeight = size * 0.5f; 
halfHeight *= (float) 154/(float) 1080; 
float fullHeight = 2 * halfHeight; 
float halfFovRadians = MathUtils.degreesToRadians * camera.fieldOfView * 0.5f; 
float distance = halfHeight/(float) Math.tan(halfFovRadians); 

camera.viewportWidth = 1080; 
camera.viewportHeight = 154; 
camera.position.set(0f, 0, distance); 
camera.lookAt(0, 0, 0); 
camera.update(); 

Et créer un objet:

ModelBuilder builder = new ModelBuilder(); 
builder.begin(); 
builder.node(); 
MeshPartBuilder meshBuilder = builder.part("lattice", GL20.GL_TRIANGLES, 
     VertexAttributes.Usage.Position, 
     new Material(ColorAttribute.createDiffuse(Color.GRAY))); 

BoxShapeBuilder.build(meshBuilder, 0f, 0f, 0f, 7f, 1f, 0f); 
Model model = builder.end(); 
mHudModel = new ModelInstance(model); 

Si je tente manuellement régler la distance à 1f je peux voir encore la boîte, mais si je vais ci-dessous 1.0f la boîte ne s'affiche pas. Et la distance calculée est d'environ 0,76f. J'essaie d'utiliser le même concept que https://xoppa.github.io/blog/a-simple-card-game/ pour calculer le champ de vision. Cela fonctionne bien pour la zone (1).

Puis-je ne pas utiliser l'appareil photo comme celui-ci? Est-ce que je calcule incorrectement le champ de vision? Pourquoi mon objet disparaîtrait-il quand je descendrais en dessous de 1f?

Merci.

+1

Quelle est la distance du plan rapproché du tronc de la caméra? Est-il coupé par le plan proche? – Rabbid76

+0

Ah oui j'ai découvert que le plan proche est 1f (et le plan lointain est 100f). Voilà pourquoi ce n'est pas possible. Quand j'ai changé le plan proche pour être le même que la distance, il semble bien fonctionner et j'obtiens la forme attendue. Est-ce une bonne solution ou devrais-je le faire différemment? – Henrik

+1

Oui, tout ce que vous voulez "voir" dans la scène est également inclus dans la gamme du plan proche au plan lointain (voir ma réponse). – Rabbid76

Répondre

2

La matrice de projection décrit la correspondance entre les points 3D d'une scène et les points 2D de la fenêtre. Il se transforme de l'espace des yeux en espace de clip, et les coordonnées dans l'espace du clip sont transformées en coordonnées de périphérique normalisées (NDC) en divisant par le composant w des coordonnées du clip. Les NDC sont compris entre (-1, -1, -1) et (1,1,1).
Chaque géométrie qui est en dehors du NDC est découpée.

enter image description here

Les objets entre le plan proche et le plan lointain du tronc de la caméra sont mappend à la plage (-1, 1) de la NDC.
(Voir plus How to render depth linearly in modern OpenGL with gl_FragCoord.z in fragment shader?)

Cela signifie que si vous voulez voir objets qui sont plus près de la 1F, vous devez régler le distnce au plan près de moins de 1F.

Note, le plan proche et le plan loin devrait être aussi proche que possible de la scène, pour augmenter la précision de calcul et d'éviter z combats, mais ils doivent inclure tout ce que vous voulez voir de la scène .

+0

Merci. Ce que je ne comprends pas, c'est ce qui se passe quand je règle la distance de la caméra. Si le plan proche est 1f et la distance de la caméra est 10f, cela signifie-t-il que la position de l'œil (caméra) est 11f à partir du plan proche (c'est-à-dire que l'image devient plus claire)? C'est à dire. disons que mon plan proche est 1f et que la distance de la caméra est 0,5f, la caméra n'est-elle pas toujours devant le plan proche? – Henrik

+0

@Henrik Non, la position de la caméra et la position des yeux sont égales. La distance à l'œil et à la caméra sont égales. Le plan proche et le plan lointain définissent la gamme qui est * visible *. Tout hors de cette plage est ignoré (c'est ce qu'on appelle l'espace du clip). – Rabbid76

+0

Oui, je pense que je comprends l'espace de clip. Mais c'est ce que je ne comprends pas: je crée un plan à 0,0,0. Près de = 1 Far = 100. Lorsque je règle la distance de la caméra sur 10, il est possible de voir l'objet. Lorsque je définis la distance à 0,9, il n'est pas possible de voir l'objet. Est-ce que 0,9 n'est pas la distance au plan proche? Cela ne veut-il pas dire que la caméra est toujours devant le plan rapproché? Ou est la caméra dans l'espace clip lorsque je mets à 13? – Henrik