Bonjour à tous,
Dans le cadre de mon petit projet graphique perso, j'ai besoin de simuler des déplacements en 3D tenant compte d'une certaine accélération. Seulement voilà, j'utilise SFML, et si je souhaite avoir des déplacements "smooth" réalisés via clavier (ou pas) je dois donc passer par des booléens. Rien de complexe dans tout ça, mais je pense que ma manière de faire est loin d'être la plus optimale.
Par exemple, j'aurais tendance à pondre un code comme suivant :
Donc voilà l'idée en fait... Comme ça, on a quelque chose qui peut marcher, mais il est certainement envisageable de faire plus optimal (un code moins lourd à écrire). j'imagine bien une ou deux autres méthodes possibles, mais dans le doute, je préfère m'orienter vers vous, qui avez certainement plus d'expérience que moi en développement & algorithmique et/ou simplement une meilleure idée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 glm::mat4 transform(1.0f); // tenseur identité pour les transformations glm::vec3 speed(.0f, .0f, .0f); // vitesse sur x, y et z glm::vec3 accel(1.0f, 1.0f, -9.81f); // accélération sur x, y et z (je pense que tout le monde comprends que c'est en m.s-²) glm::vec3 decel(.5f, .3f, 2.2f); // décélération bool trans_x; // on veut aller en x positif bool trans_x_inv; // on veut aller vers x négatif bool trans_y; // etc... bool trans_y_inv; bool trans_z; bool trans_z_inv; if(trans_x) { if(speed.x < 15.0f) { speed.x += accel.x; } if(speed.x > 15.0f) { speed.x = 15; } } else if (!trans_x && !trans_x_inv) { if(speed.x > .0f) { speed.x -= decel.x; } if(speed.x < .0f) { speed.x = .0f; } } // on imagine facilement la suite... // et enfin : transform = glm::translate(transform, speed); // et on continue le code nécessaire
Pour résumer, un algorithme qui, en fonction de simples booléens dans les 3 dimension d'un espace euclidien ( x2 pour les inverse aussi), tenant compte d'accélérations et décélérations différentes pour chacun des axes, me fourni en sortie un vecteur vitesse.
Précision complémentaire : oui, si l'objet est déjà en mouvement, le simple fait de stopper tout mouvement (en gros passer tout les booléens à 0) induit une décélération (liée à l'inertie de l'objet).
Merci d'avance pour vos retours ! Si le sujet n'est pas clair ou que vous avez besoin de plus d'infos, n'hésitez pas à me demander.
Partager