CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

problème de math (3d)

News jeu

Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop

Voir
neg282
neg282
Niveau 7
02 novembre 2012 à 22:30:23

Bon voilà le coeur du problème :
Je cherche à faire une rotation d'un objet3d sur un axe indéfini, sachant que les rotations de mon objet sont enregistrées sous la forme (rotX,rotY,rotZ) avec un rotate order XYZ.
Pour faire la rotation facilement, j'utilise une matrice de transformation, mais après comment faire pour récupérer les valeurs de mes rotations x y et z ?

godrik
godrik
Niveau 30
02 novembre 2012 à 23:15:16

J'ai pas bien compris ton probleme. tu as newCoordinate = transformationMatrix*oldCoordinate. Donc tu lis directement les coordonnees dans le vecteur de sortie.

neg282
neg282
Niveau 7
03 novembre 2012 à 02:15:50

Je vais formuler d'une autre facon :

class Objet3d
{
Vecteur3d position;
Vecteur3d rotation;

void rotate(Vecteur axis,float angle)
{
// c'est là que je bloque
}
}

Le problème est de calculer les rotation sur les axes x y et z (qui sont stokées dans Vecteur3d rotation), à partir d'une rotation sur un axe quelconque.
Je suppose que ca doit pas être simple, vu que le rotate order a son importance. Pour le moment, j'ai trouvé ça, mais ca marche pas super (d'ailleur ca me parrait un peu trop facile) :

Matrix rot = Matrix.CreateFromAxisAngle(axis, angle);
rotation.X = atan(rot.M23 / rot.M33);
rotation.Y = asin(-rot.M13);
rotation.Z = atan(rot.M12 / rot.M11);

godrik
godrik
Niveau 30
03 novembre 2012 à 07:16:26

Une fois que tu as la matrice c'est juste un matrix multiply. Sinon a quoi ca sert de calculer la matrice? D'ailleurs typiquement tu fais plusieurs operation successive pour pouvoir multiplier les matrices entre elles et faire moins de matrix/vector multiply.

tbop2
tbop2
Niveau 10
03 novembre 2012 à 10:16:41

+1 Godrik.... à moins que j'eusse moi aussi mal compris le problème.

neg282
neg282
Niveau 7
03 novembre 2012 à 13:18:46

Je dois pas être super doué pour formuler un problème. Je vais essayer de le reformuler.

J'ai un objet3d à qui j'attribut un Vecteur3d pour les rotations x y et z (note : le rotate order est xyz).
Ensuite, je dois faire une fonction pour faire tourner cet objet autour d'un axe quelconque (note : cette fonction DOIT me retourner un Vecteur3d et non pas une matrice. J'ai d'autre trucs à faire subir à mes rotations avant de dessiner le tout).

Par exemple:
J'ai envie de faire une rotation de 0.5 radians autour de l'axe (5,1,-3).
Comment je peux décomposer cette rotation en 3 rotation d'axe (1,0,0) , (0,1,0) et (0,0,1) ?

godrik
godrik
Niveau 30
04 novembre 2012 à 06:00:36

J'ai pas bien compris le but de ta questoin.
la fonction matrix.createfromaxisangle te renvoie la matrice de transformation qui va bien pour tourner autour d'un axe quelconque d'un angle quelconque. Une fois que tu as cette matrice, tu multipli ton vector de coordone par la matrice et tu obtiens tes coordonnees apres rotation en sortie.

Tu n'as pas besoin de faire la decomposition toi meme.

Aldebran
Aldebran
Niveau 10
04 novembre 2012 à 14:25:03

Si j'ai bien compris, tu stockes l'orientation de tes objets sous la forme d'angles d'Euler. Et tu voudrais obtenir les nouveaux angles d'Euler après une rotation d'angle et d'axe donné ?

La matrice obtenue via CreateFromAxisAngle retourne une matrice de rotation autour de l'axe donné pour l'angle donné. Appliquer cette matrice à ton vecteur rotation n'est pas très utile dans le sens où la rotation du vecteur qui contient les angles d'Euler n'a aucune réelle signification (à moins que j'ai oublié quelque chose).

D'une manière générale, stocker l'orientation d'un objet sous la forme d'angles d'Euler n'est pas une très bonne idée. Les quaternions sont autrement plus maniables et cela simplifierait grandement ton problème.

Si tu souhaites vraiment utiliser les angles d'Euler, alors la solution est de récupérer les vecteurs de la base de l'espace local de ton objet, avec ceux-ci tu construit la matrice de rotation qui correspond à l'orientation de ton objet et tu appliques la matrice 3x3 obtenue par CreateFromAxisAngle à cette matrice de rotation. Tu obtiens alors une nouvelle matrice correspondant à la nouvelle orientation de ton objet, tu peux en extraire les vecteurs de base de ton nouvel espace local et en déduire les angle d'Euler. C'est une façon de faire assez pénible, le mieux c'est encore d'utiliser des quaternions.

NB : Ces souvenirs ne sont pas tout frais et je peux me tromper largement.

neg282
neg282
Niveau 7
06 novembre 2012 à 15:07:41

haaa... tu as compris mon problème Aldebran ! En fait il semble que ce que je veux faire soit assez galère (je m'en doutais en un peu), du coup je pense que je vais stocker mes rotation dans une matrice.
Merci en tout cas.

Aldebran
Aldebran
Niveau 10
07 novembre 2012 à 20:35:39

"En fait il semble que ce que je veux faire soit assez galère (je m'en doutais en un peu), du coup je pense que je vais stocker mes rotation dans une matrice. "

En effet, c'est pas forcément très intuitif. Stocker ta rotation dans une matrice devrait être largement plus maniable qu'avec les angles d'Euler :)
Par contre, le must à mon avis ça reste les quaternions : je sais pas si tu as le background mathématique pour savoir les utiliser, mais n'hésites pas à prendre un peu de temps pour découvrir comment ça marche. C'est ce qu'il y a de plus utilisé aujourd'hui.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware