CoreAnimation : les calques

TchouboudouTchouboudou Membre
18:52 modifié dans API AppKit #1
Bonjour les gens...

ça y est, Léopard est là , et j'ai pas pu attendre avant d'installer les developer tools. J'ai regardé les exemples de CoreAnimation et la doc.
Cependant, il y a deux choses (une pourtant simple) que je n'ai pas bien compris.

La première, c'est la disposition des calques : bounds, anchorPoint et position. J'ai eu beau tester, j'ai pas réussi à  placer un calque au milieu d'un calque parent.

La seconde, c'est les transformations. Alors là , c'est le flou total... Surtout au niveau des matrices...

Voili, voilou, si quelqu'un a déjà  certaine connaissances en la matière, je l'attend avec impatience :D

Merci d'avance,
Tchouboudou

Réponses

  • AliGatorAliGator Membre, Modérateur
    octobre 2007 modifié #2
    J'ai pas encore eu le plaisir de faire mumuse avec CoreAnimation, mais d'habitude les matrices de transformations affines sont assez simples : tu  pars d'un vecteur (matrice colonne) [x y 1] et tu le multiplies par ta matrice de transformation 3x3 (dont la dernière ligne est forcément [0 0 1]) et ça te donne le vecteur (matrice colonne) résultat [x' y' 1] :
    [x&#39;] = [aa ab Tx]&nbsp;  [x]<br />|y&#39;| = |ba bb Ty| = |y|<br />[1 ] = [ 0&nbsp; 0&nbsp; 1]&nbsp;  [1]
    

    Autrement dit :
    x&#39; = aa*x + ab*y + Tx<br />y&#39; = ba*x + bb*y + Ty<br />
    

    Ce qui te permet de composer le x' du vecteur d'arrivée à  partir à  la fois du x et du y du vecteur de départ, et de lui appliquer aussi une translation avec Tx. Et pareil pour y'.

    Typiquement, pour appliquer une transformation affine correspondant à  une rotation d'un angle R + une translation de (Tx,Ty) correspond donc à  la matrice :
    [cos(R)&nbsp; -sin(R)&nbsp; Tx]<br />|sin(R)&nbsp;  cos(R)&nbsp; Ty|<br />[&nbsp; 0&nbsp; &nbsp; &nbsp; &nbsp; 0&nbsp; &nbsp;  1 ]
    
    Ce qui correspond aux équations :
    x&#39; = x*cos(R) - y*sin(R) + Tx<br />y&#39; = x*sin(R) + y*cos(R) + Ty
    


    Voilà . Après je ne sais pas comment ça s'applique à  CoreAnimation, comment sont foutues les matrices, etc, mais je ne serais pas étonné qu'il y ait des outils dans Cocoa pour créer des matrices directement en lui donnant un angle et/ou une translation, et construire des matrices de transformation facilement...

    --- EDIT

    NB : En fait c'est ce que fait d'habitude NSAffineTransform, en masquant la gestion de la matrice de transformation derrière des méthodes aux noms sympas, genre rotateByDegrees, etc. Le appendTransform équivaut exactement à  faire une multiplication de la matrice de transformation actuelle par une autre, le prependTransform multiplie dans l'autre sens, etc. Ce qui fait que pour l'utilisateur tout est transparent et il n'a pas à  connaà®tre la logique du calcul matriciel...

    Après n'ayant jamais fouillé dans CoreAnimation, il y a peut-être des outils plus adaptés pour CoreAnim directement, mais sinon sache qu'il est possible de créer une NSAffineTransform, assez facilement donc puisque tu précises les transformations que tu veux explicitement grace aux méthodes de cette classe Cocoa... et de récupérer la NSAffineTransformStruct (méthode [tt]transformStruct[/tt]) qui contient les coefficients de la matrice de transformation. Ca t'évitera de les calculer à  la main... s'il n'y a pas un moyen plus élégant fourni par CoreAnim.
  • 18:52 modifié #3
    dans 1193645324:
    La première, c'est la disposition des calques : bounds, anchorPoint et position. J'ai eu beau tester, j'ai pas réussi à  placer un calque au milieu d'un calque parent.


    ça fonctionne exactement comme les NSView. Si tu n'as pas compris la différence entre bounds et frame je t'invite à  consulter la doc "View Programming Guide for Cocoa - le lien est dans le cadre qui est en haut de la doc de NSView.

    Il ont ajouté anchorPoint et position mais tu peux très bien te débrouiller sans.
Connectez-vous ou Inscrivez-vous pour répondre.