Animer Position selon angle d'orientation d'une Fusée
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 :
Y'a surement un truc énorme qui cloche et que mes petits yeux de noob ne voient pas ^^
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'est plus utilisée pour le moment:<br />// 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 ^^
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Toi, elle te paraà®t bonne l'utilisation du sin et du cos dans mon code ?
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.
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é :
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)
Non pour la raison indiquée plus haut ^^
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