2010-09-09 22 views
2

J'utilise XNA mais peu importe pour cet exemple. Alors disons que j'ai un sprite. J'applique ensuite une matrice d'échelle avant tout. La matrice de mise à l'échelle est-elle mise à l'échelle de l'axe local de l'image-objet ou simplement déplacée vers le bas? En d'autres termes, est-ce que j'applique une matrice d'échelle de 0.5f dans l'espace du monde à mon sprite à l'origine du monde en redimensionnant l'axe local du sprite ou juste tous les points qui composent ce sprite de moitié?Comment voir les matrices de mise à l'échelle d'un point de vue géométrique

Le même genre s'applique à une traduction, puis à une mise à l'échelle. Dans ma tête, j'imagine une matrice de traduction de 30,30 en déplaçant l'origine locale de l'image-objet à 30,30 et, par conséquent, l'axe local de l'image-objet à 30,30. Ensuite, la mise à l'échelle de 0.5f redimensionnerait l'axe local, mais je ne vois pas pourquoi l'origine de l'image-objet serait maintenant de 15,15. Cette confusion aggrave le fait que vous effectuez une translation de 1 vers la droite sur l'axe des x dans le monde, vous vous déplacez maintenant en fonction de l'échelle que vous avez appliquée (donc vous ne bougeriez que 0,5 dans le monde). Cela m'amène à croire que l'échelle est appliquée à l'axe propre de l'objet. Btw, si vous parlez de l'origine de vos suivis, pourriez-vous indiquer de quelle origine vous parlez?

Merci

Répondre

1

Normalement, une image-objet est défini par ses sommets (points). L'application d'une matrice de mise à l'échelle à une image-objet transforme les sommets (points) de l'image-objet. Une matrice d'échelle suppose toujours (0, 0) l'origine de la transformation d'échelle. Donc, si vous mettez à l'échelle un sprite centré sur (30, 30), tous les points s'étireront à partir du point (0, 0). Si cela vous aide, imaginez le sprite comme un petit point sur un cercle autour du point (0, 0) avec l'échelle de ce cercle entier. Si vous souhaitez mettre à l'échelle une image-objet en (30, 30) depuis le centre de l'image-objet, vous devez d'abord translater le centre de l'image-objet à (0, 0), puis la redéfinir à (30 , 30) après que la balance a été effectuée.

Donc ce serait:

Translate(-30, -30) 
    Scale(0.5) 
    Translate(30, 30) 
+0

Je pense que je l'obtiens maintenant si j'y pense d'une certaine manière. Au début, mes axes local et mondial sont les mêmes, donc une traduction dans la direction x de 1 est une traduction de 1 puisque l'espace mondial et l'espace local sont de la même échelle. L'application d'une échelle de 0.5f réduit essentiellement la largeur en pixels de mon espace local, ainsi les points sont rétrécis et le résultat des coordonnées du monde est une coordonnée qui est coupée en deux. Maintenant, si je devais traduire ce sprite, il se produit une translation le long de l'axe redimensionné de l'espace local et nous pouvons identifier les coordonnées du monde. – Ilya

+1

La dernière phrase ne sonne pas bien. Dans votre question, vous parlez de traduire puis de mettre à l'échelle le sprite. Ici vous parlez de mise à l'échelle puis de traduction. Ce sont deux opérations très différentes. Si vous mettez à l'échelle (0.5) puis traduisez (30, 30), vous vous retrouvez avec un sprite de la moitié de la taille au point (30, 30). Si vous traduisez (30, 30) puis redimensionnez (0.5), vous obtenez un sprite de la moitié de la taille au point (15, 15). Le point est que l'échelle fonctionne toujours à partir du point (0, 0). Si le centre de l'image-objet n'est pas à (0, 0) lorsque vous faites l'échelle, il s'agira d'une échelle décentrée. – Empyrean

0

Pour développer la réponse de Empyrean, les mondes 3D ont généralement au moins quatre systèmes de coordonnées, chacune avec sa propre origine locale:

  • Espace objet
  • Espace du monde
  • Espace caméra
  • Afficher l'espace (2D!)

avec trois transformations:

  • objet World
  • mondiale à la caméra
  • appareil photo Afficher

Vous pouvez créer de nouveaux systèmes de coordonnées, par exemple, 'Space Model', avec la transformation 'Model to Object'.Avec cela, vous obtenez une série d'étapes:

Modèle -> échelle -> Objet objet -> rotate -> traduire -> Monde Monde -> tourner -> translate -> Caméra Caméra -> perspective ->

Dans OpenGL, vous devez pousser les matrices dans l'ordre inverse indiqué ci-dessus, de sorte que la transformation Modèle-> Objet soit la dernière à être poussée, et OpenGL doit rendre l'objet correctement. Je suppose que XNA/DirectX a un système similaire. En devenant plus complexe, l'espace objet peut avoir une hiérarchie de translations, d'échelles et de rotations dans un arbre pour produire un système squelettique qui peut ensuite être utilisé pour déformer le maillage du modèle. Ceci est généralement appelé skinning. Donc, pour répondre à la question, selon la transformation à laquelle vous appliquez une transformation de rotation, par exemple, vous obtiendrez des résultats différents. Dans la transformation Model-> Object, le modèle tourne autour de l'origine de l'objet. Dans la transformation Objet-> Monde, l'objet tournera autour de l'origine du monde.