Déplacer la caméra pour s'adapter à la scène 3D

je suis à la recherche d'un algorithme pour ajuster une zone de limite à l'intérieur d'un viewport (dans mon cas une scène DirectX). Je connais les algorithmes pour centrer une sphère dans une caméra orthographique, mais j'aurais besoin de la même chose pour une boîte et une caméra en perspective. Je ne peux pas simplement changer la FOV parce que cette application a FOV comme une variable modifiable par l'utilisateur, il doit donc déplacer la caméra.

j'ai la plupart des données:

  • j'ai le vecteur de la appareil photo
  • j'ai le point du centre de la boîte englobante
  • j'ai le vecteur look-at (direction et distance) du point de la caméra au centre de la boîte
  • j'ai projeté les points sur un plan perpendiculaire à la caméra et j'ai récupéré les coefficients décrivant combien les coords max/min X et Y sont à l'intérieur ou à l'extérieur du plan d'observation.

Problèmes que j'ai:

  • le centre de la boîte limite n'est pas nécessairement au centre du viewport (c'est-à-dire qu'il se limite rectangle après projection).
  • puisque le champ de vision "biffe" la projection (voir http://en.wikipedia.org/wiki/File:Perspective-foreshortening.svg) Je ne peux pas simplement utiliser les coefficients comme facteur d'échelle pour déplacer la caméra parce qu'elle va dépasser/sous-dépasser la position désirée de la caméra

Comment puis-je trouver la position de la caméra pour qu'elle remplisse le viewport en pixel parfait possible (exception: si le rapport d'aspect est loin de 1,0, il suffit de remplir l'un des axes de l'écran)?

j'ai essayé d'autres choses:

  • en utilisant une sphère et une tangente pour trouver un facteur d'échelle pour déplacer la caméra. Cela ne fonctionne pas bien, parce que, il ne prend pas en compte la projection de perspective, et d'autre part les sphères sont de mauvais volumes limitants pour mon usage parce que j'ai beaucoup de plat et de long géométrie.
  • Itérer les appels à la fonction pour obtenir une erreur de plus en plus petite dans la position de la caméra. Cela a fonctionné un peu, mais je peux parfois rencontrer des cas de bordures bizarres où la position de la caméra dépasse trop et le facteur d'erreur augmente. En outre, en faisant cela je n'ai pas recenter le modèle basé sur la position du rectangle limite. Je n'ai pas pu trouver un moyen solide et robuste pour le faire de manière fiable.

Aider s'il vous plaît!

21
demandé sur LachlanG 2010-05-19 18:21:32

6 réponses

il y a beaucoup de positions possibles de caméra et d'orientations où la boîte de délimitation pourrait s'insérer à l'intérieur de la vue frustum. Mais n'importe quelle procédure choisirait une position et une orientation spécifiques de la caméra.

Si vous envisager de délimitation des sphères, une solution pourrait être d'

  • premier changement d'orientation pour regarder le centre de la sphère limite
  • puis reculer suffisamment (angle de visée négatif) pour que la sphère limite puisse s'insérer à l'intérieur frustum

boîtes englobantes vous pouvez envisager une première étape pour positionner la caméra perpendiculairement au centre du plus grand (ou du plus petit, peu importe ce que vous préférez) visage cube.

Je n'ai aucune expérience avec DirectX, mais déplacer et changer la direction de la caméra pour centrer un certain point devrait être facile. La partie difficile est de faire le calcul de décider jusqu'où se déplacer pour voir le objet.

Math

si vous connaissez la taille limite s de l'objet en coordonnées du monde (nous ne sommes pas intéressés par les pixels ou les coordonnées de la caméra, car ils dépendent de votre distance) de l'orientation de la caméra, vous pouvez calculer la distance requise