2012-12-07 1 views
1

En supposant que j'ai un objet 3D. Je n'ai pas d'informations détaillées sur la forme de l'objet, la seule information que j'ai est les plages des coordonnées 3 axes (les coordonnées x min/max etc.). Étant donné la «direction» de la caméra (donc de quel angle la caméra regarde-t-elle l'objet), comment puis-je calculer à quelle distance la caméra doit être pour voir tout l'objet sur un écran d'une certaine taille?Distance de la caméra pour un objet 3D

Donc, fondamentalement, j'ai les entrées suivantes:

  • limites de l'objet
  • caméra "direction"
  • Taille de l'écran

et que vous voulez calculer la distance de la caméra.

Comment puis-je résoudre ce problème? J'ai trouvé beaucoup d'informations sur la façon de projeter un point 3D sur un plan 2D en connaissant la position de la caméra en coordonnées 3D, mais j'ai échoué à adapter les formules de manière à correspondre à mes entrées/sorties.

entrées exemple serait:

  • x: (0 à 100), y: (0-100), z: (0-100)
  • La caméra regarde l'objet comme si elle a été tourné de 45 ° autour de l'axe Z et 45 ° autour de l'axe X
  • l'écran est 600x600 taille

Merci à l'avance!

Répondre

1

Je vais supposer une projection orthogonale dans la réponse suivante, mais l'extension à la projection perspective devrait être assez facile. Pour les objets de petite taille, la projection orthogonale serait correcte (puisque nous avons l'habitude de ne pas voir les effets de perspective sur eux).

Pour chaque point i laissez x[i], y[i], z[i] être les coordonnées d'origine dans l'espace objets.

Laissez x'[i], y'[i], z'[i] le point tourné dans l'espace de la caméra (ce qui peut être calculée en appliquant votre transformation de rotation à chaque point - Je pense que cette partie sera facile pour vous).

La projection orthogonale sera:

X[i] = f*x'[i] + Cx 
Y[i] = f*y'[i] + Cy 

f est un certain nombre, que nous calculerons qui traite de la mise à l'échelle, et Cx et Cy sont au centre de l'image. Cela pourrait être rendu plus compliqué pour permettre, par ex. projection perspective, rapports d'aspect non-unité. Voir par exemple ma réponse à cette autre question: ((3D points projected to form an image)) pour quelque chose comme ceci traitant de la projection de perspective.

Puisque nous résoudrons pour f, nous réorganisons:

f = (X[i] - Cx)/x'[i] 
f = (Y[i] - Cy)/y'[i] 

nous MaxX être le plus grand point X souhaitable en coordonnées de pixels, MaxY le plus grand Y coordonnées de pixels et MinX et MinY le plus petit (nous prenons le centre du pixel).

Par exemple.

MinX=0.5 
MaxX=599.5 
MinY=0.5 
MaxY=599.5 

Nous voulons choisir un f juste assez petit pour que les plus extrêmes x'[i] ou y'[i] cartes de points sur l'un de ces pixels.

NOTE: Je suppose que l'objet est déjà centré: si ce n'est pas alors nous devons aussi calculer un bon Cx et Cy aussi (et un ajustement plus serré à l'image peut être réalisée comme ça).

Calculer les plus grands et les plus petits points de pivotés dans chacune des directions X et Y (min_i(x[i]) signifie que la valeur de x[i] le plus petit sur toutes les valeurs possibles de i):

minx = min_i(x[i]) 
maxx = max_i(x[i]) 
miny = min_i(y[i]) 
maxy = max_i(y[i]) 

Maintenant Sølve pour la distance focale sera nécessaire pour chacun des pixels extrêmes pour mapper sur chacun de ces points extrêmes:

f_1 = (MinX - Cx)/minx 
f_2 = (MaxX - Cx)/maxx 
f_3 = (MinY - Cy)/miny 
f_4 = (MaxY - Cy)/maxy 

Et nous choisissez le plus petit de ceux-ci afin de vous assurer que l'objet entier s'adapte à l'écran.

Exemple

Si nous supposons que est à

minx = -1.2 

le point le plus vers la gauche (rotation de poste) Le point le plus vers la droite:

maxx = 1.5 

Le point le plus haut (note que je suppose que les pixels coordiantes s'alignent avec les coordonnées spatiales):

miny = -1.3 

le point le plus de downards (note que je suppose les Coordiantes de l'alignement des pixels avec des coordonnées spatiales):

maxy = 1.3 

Nous utilisons votre exemple d'une image 600x600.

Pour chacun d'entre eux nous résolvons pour f:

f_1 = (0.5 - 300)/-1.2 = 249.6 
f_2 = (599.5 - 300)/1.5 = 199.7 
f_3 = (0.5 - 300)/-1.3 = 230.4 
f_4 = (599.5 - 300)/1.3 = 230.4 

Maintenant, nous choisissons le plus petit f et donc nous obtenons:

f=199.7 

Et la projection orthogonale serait:

X[i] = 199.7*x'[i] + 300 
Y[i] = 199.7*y'[i] + 300 

Un rappel: Vous pouvez le rendre plus sophistiqué de plusieurs façons, en ajoutant g en projection de perspective, permettant un centre d'image différent, une mise à l'échelle, etc. Cette approche est conçue pour être la manière la plus simple de commencer.

Questions connexes