Animer Position selon angle d'orientation d'une Fusée

vico92vico92 Membre
14:21 modifié dans API UIKit #1
Bon, là  je commence à  déprimer, ça fait 2 jours que je potasse les vecteurs et j'arrive pas à  m'en sortir :'( .
Intuitivement, je comprend l'utilité du cos et du sin d'un angle pour traduire l'évolution de x et de y, mais concrètement j'arrive pas à  l'appliquer à  ma fichue fusée... Ma fusée tourne bien comme je le veux grâce à  l'accelerometre, j'ai animé son anchorPoint aussi pour des raisons esthétiques, il reste à  animer son center en fonction de l'angle de l'image.

J'ai lu ce tuto qui est pourtant très bien:
http://trailsinthesand.com/exploring-iphone-graphics-part-2/
mais j'arrive pas à  l'appliquer à  mon ImageView (dans le tuto il utilise un NSObject rond).

et celui-ci est très bien aussi, pour ceux que ça intéresse:
http://www.sacredsoftware.net/tutorials/Vectors/Vectors.xhtml

Comme moi j'ai l'impression de  :(renaud): dans un violon, peut-être pourrez-vous m'aider, mon code actuel est grossomodo :

<br />(NSTimer dans autre fonction, ayant pour @selector(gameLoop))<br /><br />-(void) gameLoop {<br /><br />(...)<br />//The Image anchor point translates from right to left<br />	float anchorPointX;<br />	anchorPointX = (acceleration.y+1)/2;<br />	rocket.layer.anchorPoint = CGPointMake (anchorPointX, 0.3);<br /><br /><br />// Rocket rotates as the user tilt the accelerometer<br />	rocket.transform = CGAffineTransformRotate(rocket.transform, degreesToRadians(accelerationY*15));<br /><br />//Rocket moves to the direction given by the Image rotation angle<br />	float rocketCenterX = sin(degreesToRadians(accelerationY*15));<br />	float rocketCenterY = cos(degreesToRadians(accelerationY*15));<br />	rocket.center = CGPointMake(rocket.center.x+rocketCenterX, rocket.center.y+rocketCenterY);<br /><br />// n&#39;est plus utilisée pour le moment:<br />//&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  rocketVelocity = CGPointMake(kRocketSpeedX, kRocketSpeedY);<br />// (kRocketSpeedX et kRocketSpeedY sont des float définies en début de code)<br /><br />(...)<br />}<br />


Y'a surement un truc énorme qui cloche et que mes petits yeux de noob ne voient pas ^^


Réponses

  • Philippe49Philippe49 Membre
    14:21 modifié #2
    Sous Mac, changer l'anchorPoint du layer change en même temps la position de la view, à  voir si c'est pareil sous iPhone et .. si ce n'est pas ce qui te posent des ennuis.

  • vico92vico92 Membre
    14:21 modifié #3
    oui, ça change effectivement la position aussi, mais le resultat est tellement éloigné de ce que j'attends que je doute de la responsabilité de l'anchorPoint là -dedans.

    Toi, elle te paraà®t bonne l'utilisation du sin et du cos dans mon code ?
  • Philippe49Philippe49 Membre
    14:21 modifié #4
    Sépare les problèmes fait marcher d'abord un mouvement avec le center, ensuite combine avec la rotation, et enfin l'anchor point

    <br />	float rocketCenterX = sin(degreesToRadians(accelerationY*15));<br />	float rocketCenterY = cos(degreesToRadians(accelerationY*15));<br />	rocket.center = CGPointMake(rocket.center.x+rocketCenterX, rocket.center.y+rocketCenterY);<br />
    

    En première ligne ce doit être accelerationX au lieu d'accelerationY
    On met CGFloat, pas float (détail)
    Avec cela, ta rocket se déplace de manière infinitésimale : moins de 1 pixel en x et en y, il n'y a pas de vitesse, et sans doute souvent pas de déplacement.
  • Philippe49Philippe49 Membre
    14:21 modifié #5
    Si tu veux que ta rocket se déplace par exemple de 10 unités dans un angle a en degrés, tu mets
    rocketX=10*cos(degreesToradians(a));
    rocketY=10*sin(degreesToradians(a));

    Attention, l'angle est à  prendre en suivant la disposition de l'écran
    a=0 c'est un déplacement vers la droite
    a=90 (M_PI/2. en radians) vers le bas
    a=45 (M_PI/4. en radians) vers le bas à  droite
    a=-45 (-M_PI/4. en radians) vers le haut à  droite
    a=135 (3.*M_PI/4. en radians) vers le bas à  gauche
    ...
  • vico92vico92 Membre
    14:21 modifié #6
    dans 1241365846:

    Si tu veux que ta rocket se déplace par exemple de 10 unités dans un angle a en degrés, tu mets
    rocketX=10*cos(degreesToradians(a));
    rocketY=10*sin(degreesToradians(a));

    Attention, l'angle est à  prendre en suivant la disposition de l'écran
    a=0 c'est un déplacement vers la droite
    a=90 (M_PI/2. en radians) vers le bas
    a=45 (M_PI/4. en radians) vers le bas à  droite
    a=-45 (-M_PI/4. en radians) vers le haut à  droite
    a=135 (3.*M_PI/4. en radians) vers le bas à  gauche
    ...



    ah t'es génial Phil, il faut mettre la constante de vitesse DEVANT le cos, pas dans l'angle que reçoit le cos, mdrrrr... Merci Philippe, je vais tester ça tout de suite.
    Bon, et comme j'étais en train d'écrire une réponse depuis 20 min, je la colle qd-même, hé hé :

    dans 1241363255:

    Sépare les problèmes fait marcher d'abord un mouvement avec le center, ensuite combine avec la rotation, et enfin l'anchor point

    D'abord merci pour ta réponse, par contre il faut que j'apporte une précision sur mon projet:
    Je n'utilise pas l'accéleromètre pour faire se déplacer l'objet tel une bille sur une table, mais pour orienter un objet qui avance en permanence. Je n'utilise que l'axe Y de l'accelerometre pour tourner l'objet dans un sens ou dans l'autre.
    C'est pourquoi j'ai choisi la logique inverse de center, rotation,anchorPoint. Je commence par faire tourner l'objet, et son angle détaermine la direction du déplacement.

    Maintenant, ai-je raison de renvoyer l'accelerationY dans la valeur (angle) de sin(angle) ?
    (Pourtant j'utilise bien l'accelerationY * 15 pour faire tourner l'objet...donc je dirais oui)

    dans 1241363255:

    En première ligne ce doit être accelerationX au lieu d'accelerationY

    Non pour la raison indiquée plus haut ^^

    dans 1241363255:

    Avec cela, ta rocket se déplace de manière infinitésimale : moins de 1 pixel en x et en y, il n'y a pas de vitesse, et sans doute souvent pas de déplacement.

    Ah oui, t'as raison, c clair qu'elle risquait pas de bouger avec des valeurs si faibles. (Je viens de tester avec * 800, c'est incontrôlable mais ça réagit au-moins)

    Il faudrait que je trouve une explication claire et simple de tout ça...//EDIT: plus la peine  :p
Connectez-vous ou Inscrivez-vous pour répondre.