2010-08-04 10 views
0

J'ai un objet qui fait un mouvement circulaire dans un espace 3D, le centre ou le cercle est à x: 0, y: 0, z: 0 le rayon est une variable. Je sais où se trouve l'objet sur le cercle (par son angle [appelons ça ar] ou par la distance qu'il a parcourue). le cercle peut être incliné dans les trois directions, j'ai donc trois variables pour les angles, appelons-les ax, ay et az. maintenant j'ai besoin de calculer où exactement l'objet est dans l'espace. J'ai besoin de ses coordonnées x, y et z.Calcul de la position d'un objet se déplaçant dans un mouvement circulaire en 3D

float radius = someValue; 
float ax = someValue; 
float ay = someValue; 
float az = someValue; 
float ar = someValue; //this is representing the angle of the object on circle 

//what i need to know 
object.x = ?; 
object.y = ?; 
object.z = ?; 
+0

J'ai été relu et j'ai mal compris. Est-ce un disque sur lequel le navire voyage sur le bord de la rotation? – Adrian

+0

Que sont exactement ax, ay et az? Comme le centre du cercle est fixe, il n'est pas nécessaire de donner 3 angles; 2 sera suffisant. En d'autres termes, az est déterminé par ax et ay. – user123444555621

Répondre

4

Vous devez fournir plus d'informations pour obtenir la formule exacte. La réponse dépend de l'ordre dans lequel vous appliquez vos rotations, de la direction dans laquelle vous tournez et de l'orientation de départ de votre cercle. En outre, il sera beaucoup plus facile de calculer la position de l'objet en considérant une rotation à la fois. Alors, où est votre objet si toutes les rotations sont à 0?

Supposons que ce soit à (r, 0,0).

Le pseudo-code sera quelque chose comme:

pos0 = (r,0,0) 
pos1 = pos0, rotated around Z-axis by ar (may not be Z-axis!) 
pos2 = pos1, rotated around Z-axis by az 
pos3 = pos2, rotated around Y-axis by ay 
pos4 = pos3, rotated around X-axis by ax 

pos4 sera la position de votre object, si tout est mis en place à droite. Si vous avez du mal à le configurer, essayez de garder ax = ay = az = 0 et ne vous inquiétez que pour ar, jusqu'à ce que vous obteniez ce droit. Ensuite, commencez à définir les autres angles un à la fois et mettez à jour votre formule.

Chaque rotation peut être réalisée avec

x' = x * cos(angle) - y * sin(angle) 
y' = y * cos(angle) + x * sin(angle) 

Ceci est une rotation sur l'axe Z. Pour faire une rotation sur l'axe Y, utilisez z et x au lieu de x et y, etc. Notez également que l'angle est en radians ici. Vous devrez peut-être rendre l'angle négatif pour certaines rotations (selon la direction ar, ax, ay, az).

Vous pouvez également effectuer cette rotation avec une multiplication matricielle, comme l'a dit Marcelo, mais cela peut être exagéré pour votre projet.

+0

je n'ai pas eu ce que vous avez écrit pour travailler, c'est pourquoi je réponds si tard mais c'est correct, je ne sais pas ce que j'ai fait de mal. aussi ce que vous avez écrit EST la manipulation de la matrice, donc ce n'est pas exagéré;) je l'ai simplifié pour mes besoins x = 0; y = 0; z = 0; // coordonnées polaires à coordonnées cartésiennes (qui me donne déjà 2 angles) x1 = r * sin (ax) * cos (ay) y1 = r * sin (ax) * cos (ay) z1 = r * cos (ax) // Matrice de rotation autour du dernier angle y2 = y1 * cos (az) - z1 * sin (az) z2 = z1 * cos (az) + y1 * cos (az) donc mes valeurs sont maintenant x1, y2 et z2 la dernière rotation est inutile (il ne reste plus de caractères pour expliquer pourquoi: D) – x4rf41

Questions connexes