hein (bis bis) ?
les coordonnées homogènes sont elles aussi des coordonnées cartésiennes : elles sont exprimés suivant le repère que tout le monde connaît ( (x, y), (x, y, z), bref avec les axes perpendiculaires les uns aux autres), par opposition (par ex) aux coordonnées sphériques ou cylindriques.
pour les coordonnées homogènes, le quatrième terme est effectivement toujours 1 tant que tu fais de l'algèbre linéaire (cad des transformations réversibles, comme la translation, la rotation, le scaling, le mirror, etc).
donc ton point est toujours de la forme (x, y, z, 1). tu peux donc faire une classe Matrix44 (pour des transformations homogènes) qui prend en paramètre pour l'opérateur multiplication un Point3 (x, y, z) et qui retourne un autre Point3. tu peux ainsi exprimer n'importe quel point(x, y, z) dans n'importe quel repère linéaire (et ici, exprimer n'importe quel point de ton objet dans le repère world ou caméra).
pour la projection, tu as raison : c'est ici qu'on utilise vraiment les coordonnées homogènes (ou w sert enfin à qq chose ) tu peux te faire une ptite fonction Project() qui prend en paramètre un Point3, une Matrix44, et qui retourne un Point4 (les coordonnées écran) :
Code :
- Point4 Project(Point3 p, Matrix44 m)
- {
- Point4 h;
- h.x = p.x*m[0][0] + p.y*m[1][0] + p.z*m[2][0] + m[3][0];
- h.y = p.x*m[0][1] + p.y*m[1][1] + p.z*m[2][1] + m[3][1];
- h.z = p.x*m[0][2] + p.y*m[1][2] + p.z*m[2][2] + m[3][2];
- h.w = p.x*m[0][3] + p.y*m[1][3] + p.z*m[2][3] + m[3][3];
- h.w = 1.0f / h.w;
- h.x *= h.w;
- h.y *= h.w;
- h.z *= h.w;
- return h;
- }
|
en passant à cette fonction un point d'un objet dans son repère local, ainsi que sa matrice localToScreen, tu obtiendras ses coordonnées écran. ne la copie colle pas brut de pomme, peut être utilises tu l'autre sens pour la multiplication des matrices. les quatre premières lignes peuvent être résumées à h = p * m si tu fais un opérateur qui retourne un Point4 dans ta classe Matrix44.
pour tes sphères, tu peux faire une hiérarchie de sphères ayant toutes un parent commun, histoire d'avoir (0, 0, 0) pour le centre sinon tu bidouilles avant de faire ton calcul (pas bô ). enfin, fais déjà marcher ton truc, ensuite je t'encouragerais à faire un système bien souple avec un jolie hiérarchie et des jolies classes Point3, Point4, etc ... tu peux mater la sdk de max pour voir les headers de leurs classes, y'a des sources dans directx, également plein de trucs sur le net.
si ça peut paraître chiant et compliqué au début, une fois que tu as des classes bien clean et que tu peux exprimer tes points dans n'importe quel repère, ça devient tout de suite compréhensible.
ah, et la surface de la sphère n'est égale à la surface du disque seulement lorsque la sphère est située juste devant la caméra ( position sphère = (0, 0, z) dans le repère caméra), à cause de la déformation dûe à la perspective. et encore il faut que la sphère ne soit pas trop proche c'est juste vrai pour les vues isométriques, où, justement, il n'y a pas de 'projection', on gicle juste une coordonnée). enfin ça c'était juste histoire d'être précis