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
Où 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.