/* Transforme tous les points d'un objet spécifié dans l'espace de visualisation, puis les projettes en perspective sur l'espace écran et les associes aux coordonnées écran. Stocke les résultats dans l'objet. Testé avec Borland C++ 4.02 en modèle par Jim Mischel 12/16/94 */ #include #include "polygon.h"/ void XformAndProjectPoints(double Xform[4][4], struct Object * ObjectToXform) { int i, NumPoints = ObjectToXform->NumVerts; struct Point3 * Points = ObjectToXform->VertexList; struct Point3 * XformedPoints = ObjectToXform->XformedVertexList; struct Point3 * ProjectedPoints = ObjectToXform->ProjectedVertexList; struct Point * ScreenPoints = ObjectToXform->ScreenVertexList; for (i=0; iX = XformedPoints->X / XformedPoints->Z * PROJECTION_RATIO * (SCREEN_WIDTH / 2.0); ProjectedPoints->Y = XformedPoints->Y / XformedPoints->Z * PROJECTION_RATIO * (SCREEN_WIDTH / 2.0); ProjectedPoints->Z = XformedPoints->Z; /* Convertit en coordonnées d'écran. La coordonnée Y devient négative pour passer des Y croissants lorsque l'on monte au Y croissants lorsque l'on descend, comme le veut le remplisseur de polygone. Ajoute la moitié de la largeur et de la hauteur de l'écran pour centrer sur l'écran */ ScreenPoints->X = ((int) floor(ProjectedPoints->X + 0.5)) + SCREEN_WIDTH/2; ScreenPoints->Y = (-((int) floor(ProjectedPoints->Y + 0.5))) + SCREEN_HEIGHT/2; } }