Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 22/02/2012 dans toutes les zones

  1. Salut, Je vais essayer de faire "didactique". L'utilisation des matrices de transformation et du calcul vectoriel permet de ramener les problèmes de fonctions linéaires (rotation, échelle, translation) à des calculs sur les nombres (coordonnées). Les matrices de transformation sont de dimension 2x2 ou 3x3 en 2d (coordonnées (x y)) et 3x3 ou 4x4 en 3d (coordonnées (x y z)) selon qu'elles intègrent ou non les translations. Restons en 3d, les matrices 4x4 sont utilisées avec (vla-TransformBy obj (vlax-tmatrix ...)) pour appliquer une transformation à un objet. Une matrice de transformation 4x4 à la forme suivante (R = rotation, S = echelle, T = translation) R00Sx R01 R02 T0 R10 R11Sy R12 T1 R20 R21 R22Sz T2 0 0 0 1 La matrice 3x3 qui décrit les mêmes transformations (sans la translation) est juste privée de la dernière colonne et la dernière rangée (qui est toujours 0 0 0 1 et sert à ce que la matrice soit "carrée") Pour appliquer des transformations à des points (plus exactement à des vecteurs) il est plus pratique d'utiliser les matrices 3x3 pour les rotations et les échelles et (mapcar '+ ...) pour les translations. Pour appliquer une rotation à un vecteur, on utilise la fonction mxv avec une matrice 3x3 décrivant la rotation : (mxv mat vec) Il ne faut pas perdre de vue que la transformation est effectuée sur un vecteur. Soit une matrice de rotation mat et un point p1, (mxv mat p1) retourne les coordonnées du point p1 ayant subit la rotation avec (0 0 0) comme point de base. Si on veut lui faire subir la rotation autour d'un point p2, il faut d'abord calculer le vecteur de p2 à p1, faire la rotation sur ce vecteur puis ajouter le résultat à p2 : (mapcar '+ p2 (mxv mat (mapcar '- p1 p2))) Faire la même opération avec une matrice 4x4 est plus compliqué. Il faut construire la matrice (à partir de la même matrice 3x3) en intégrant la translation et la dernière ligne. La translation correspond au vecteur du point de base ayant subi la rotation au point de base. De plus, comme la matrice est de dimension 4, il faut ajouter 1.0 à la liste des coordonnées de p1 pour permettre les calculs, et il faudra supprimer le dernier élément du résultat qui aura la forme : (x y z 1.0). Ce qui donne : (reverse (cdr (reverse (mxv (append (mapcar '(lambda (r o) (append r (list o)) ) mat (mapcar '- p2 (mxv mat p2)) ) (list '(0.0 0.0 0.0 1.0)) ) (append p1 '(1.0)) ) ) ) ) Construction de matrices Matrice de rotation (angle = a) par rapport à l'axe Z (la rotation sur l'axe Z est une rotation 2d, on voit bien qu'on pourrait utiliser une matrice 2x2) : (list (list (cos a) (- (sin a)) 0.0) (list (sin a) (cos a) 0.0) '(0.0 0.0 1.0) ) Rotation sur l'axe X : (list '(1.0 0.0 0.0) (list 0.0 (cos a) (- (sin a))) (list 0.0 (sin a) (cos a)) ) Rotation sur l'axe Y : (list (list (cos a) 0.0 (sin a)) '(0.0 1.0 0.0) (list (- (sin a)) 0.0 (cos a)) ) Changement d'échelle : (list (list Xscale 0.0 0.0) (list 0.0 Yscale 0.0) (list 0.0 0.0 Zscale) ) Ces matrices peuvent être combinées entre elles avec la fonction mxm. Attention, cette fonction n'est pas symétrique : (mxm mat1 mat2) est différent de (mxm mat2 mat1). En effet, ce n'est pas la même chose de faire une rotation sur l'axe X puis une rotation sur l'axe Y et de faire d'abord la rotation sur Y puis sur X.
    1 point
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité