[PB 5.31] NodeAnimation rotation (bug?)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

[PB 5.31] NodeAnimation rotation (bug?)

Message par kelebrindae »

Bonjour,

Je suis en train de jouer avec les Splines et les NodeAnimations, et c'est une fonctionnalité plutôt sympa...
...Sauf que je n'arrive pas à faire marcher les rotations. :(

Dans l'exemple ci-dessous, j'ai juste deux "nodes", sans déplacement, pour faire tourner un cube sur lui-même de 180° (avec le flag "LinearRotation" de base). Là, je m'attendrais à ce que le cube tourne progressivement jusqu'à atteindre 180° à la fin de l'animation.
Or, ce n'est pas du tout le cas: le cube tourne de 20°, revient à zéro, puis repart jusqu'à 160° avant de passer brusquement à -180° sur la fin. 8O

J'aurais tendance à me dire que je n'ai pas compris comment ça marche, mais comme le code fonctionne normalement si la rotation demandée reste inférieure ou égale à 179°, je soupçonne également un problème dans la commande PB elle-même (genre: "180° est considéré comme identique à 0°")... :?

Pouvez-vous me dire ce que vous en pensez avant que je poste le rapport de bug dans le forum anglais, s'il vous plaît?

Code : Tout sélectionner

;- Init
InitEngine3D()
InitSprite()
InitKeyboard()

;- Window & screen
OpenWindow(0,0,0,800,600,"NodeAnimation Rotation")
OpenWindowedScreen(WindowID(0),0,0,800,600,0, 0, 0,#PB_Screen_SmartSynchronization)

;- Camera
CreateCamera(0,0,0,100,100)
MoveCamera(0,0,0,10)

;- Node and cube creation
CreateNode(0)
cubeEntity = CreateEntity(#PB_Any,MeshID(CreateCube(#PB_Any,1)),#PB_Material_None)
AttachNodeObject(0,EntityID(cubeEntity))

;- Animation: 2 nodes
duration = 5000
NodeAnimation = CreateNodeAnimation(#PB_Any, NodeID(0), duration, #PB_NodeAnimation_Spline, #PB_NodeAnimation_LinearRotation) 
CreateNodeAnimationKeyFrame(NodeAnimation, 0,  0,   0,    0); key 0
CreateNodeAnimationKeyFrame(NodeAnimation, duration,    0, 0,  0); key 1

;- Set rotation for the 2nd node
SetNodeAnimationKeyFrameRotation(NodeAnimation,1,0,0,180)

;- Main loop
StartNodeAnimation(NodeAnimation,#PB_NodeAnimation_Once)
Repeat  
  AddNodeAnimationTime(NodeAnimation, TimeSinceLastFrame)
  
  ;- Display animation progression and rotation
  totalTime + TimeSinceLastFrame
  Debug "Node animation = " + LSet(StrF(100 * totalTime / duration,2),7) + "% : roll = " + StrF(NodeRoll(0),2)
  
  TimeSinceLastFrame = RenderWorld()
  FlipBuffers()
  
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape) Or NodeAnimationStatus(NodeAnimation) = #PB_NodeAnimation_Stopped
Exemple de rotation obtenue:

Code : Tout sélectionner

Node animation = 0.00   % : roll = 0.00
Node animation = 1.00   % : roll = 0.00
Node animation = 1.50   % : roll = 2.60
Node animation = 3.10   % : roll = 3.83
Node animation = 4.80   % : roll = 7.45
Node animation = 6.40   % : roll = 10.78
Node animation = 8.10   % : roll = 13.46
Node animation = 9.80   % : roll = 15.85
Node animation = 11.40  % : roll = 17.80
Node animation = 13.10  % : roll = 19.25
Node animation = 14.80  % : roll = 20.40
Node animation = 16.50  % : roll = 21.19
Node animation = 18.10  % : roll = 21.64
Node animation = 19.80  % : roll = 21.77
Node animation = 21.50  % : roll = 21.63
Node animation = 23.10  % : roll = 21.23
Node animation = 24.80  % : roll = 20.64
Node animation = 26.50  % : roll = 19.80
Node animation = 28.10  % : roll = 18.78
Node animation = 29.80  % : roll = 17.67
Node animation = 31.50  % : roll = 16.36
Node animation = 33.20  % : roll = 14.95
Node animation = 34.80  % : roll = 13.45
Node animation = 36.50  % : roll = 12.00
Node animation = 38.20  % : roll = 10.42
Node animation = 39.80  % : roll = 8.84
Node animation = 41.50  % : roll = 7.38
Node animation = 43.20  % : roll = 5.87
Node animation = 44.90  % : roll = 4.44
Node animation = 46.50  % : roll = 3.11
Node animation = 48.20  % : roll = 1.98
Node animation = 49.80  % : roll = 0.92
Node animation = 51.50  % : roll = 0.09
Node animation = 53.20  % : roll = -0.59
Node animation = 54.90  % : roll = -1.04
Node animation = 56.50  % : roll = -1.23
Node animation = 58.20  % : roll = -1.16
Node animation = 59.90  % : roll = -0.77
Node animation = 61.50  % : roll = -0.05
Node animation = 63.20  % : roll = 0.95
Node animation = 64.90  % : roll = 2.40
Node animation = 66.60  % : roll = 4.26
Node animation = 68.20  % : roll = 6.57
Node animation = 69.90  % : roll = 9.16
Node animation = 71.60  % : roll = 12.39
Node animation = 73.30  % : roll = 16.15
Node animation = 74.90  % : roll = 20.44
Node animation = 76.60  % : roll = 25.01
Node animation = 78.30  % : roll = 30.44
Node animation = 79.90  % : roll = 36.50
Node animation = 81.60  % : roll = 42.79
Node animation = 83.30  % : roll = 50.13
Node animation = 84.90  % : roll = 58.17
Node animation = 86.60  % : roll = 66.40
Node animation = 88.30  % : roll = 75.88
Node animation = 89.90  % : roll = 86.14
Node animation = 91.60  % : roll = 161.69
Node animation = 93.30  % : roll = -140.83
Node animation = 95.00  % : roll = -148.91
Node animation = 96.60  % : roll = -156.94
Node animation = 98.30  % : roll = -164.42
Node animation = 100.00 % : roll = -172.28
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par Ollivier »

Bonjour Kelebrindae

cela doit faire six ans qu'on n'a pas communiqué! Donc content de te passer un petit bonjour.

J'ai essayé ton problème. J'ai aussi une anomalie. J'espère que d'autres pourront faire le test aussi pour aider au déboguage (ou bien trouver où est-ce qu'on se plante, qui sait?)

A noter que j'ai testé aussi "NodeAnimation.pb" pour comprendre l'utilité de ce dispositif. Ce

"NodeAnimation2.pb" plante chez moi mais c'est un bug propre à mon matériel.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par Mesa »

Même chose sur xp32b.

Ça ressemble bien à un bug.

M.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par kernadec »

bonjour kelebrindae
peut être une piste
je dépasse les 180, attention aux radars 8O
simplement en retirant le paramètre : #PB_NodeAnimation_Once, comme c'est la cas dans les exemples pb

ps: " NodeAnimation2.pb " fonctionne pas chez moi sur XP SP3 32bits il rencontre la même erreur d' adresse RenderWorld()
Cordialement

Code : Tout sélectionner

StartNodeAnimation(NodeAnimation)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par comtois »

Il est fort probable que ce soit un bug, mais je ne sais pas comment le corriger, je n'ai pas le niveau en math :oops:

je convertis le pitch, yaw et roll en quaternion (ogre utilise les quaternions pour les rotations) comme ceci

Code : Tout sélectionner

  Quaternion quat = Quaternion(Degree(yaw), Vector3::UNIT_Y) * Quaternion(Degree(pitch), Vector3::UNIT_X) * Quaternion(Degree(roll), Vector3::UNIT_Z); 
Il y a peut-être un traitement particulier à effectuer quand un angle vaut 180° ?

Si quelqu'un trouve une solution je veux bien l'adopter.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par Ollivier »

Bonjour Comtois,

je ne comprends pas bien ton code:

1) la fonction Quaternion() elle te permet de convertir un couple {axe; angle} en 3 quaternions?
en donnant vraiment ça : (?)

Code : Tout sélectionner

        x           y           z           (w)
q1      sin a/2     0           0           cos a/2
q2      0           sin a/2     0           cos a/2
q3      0           0           sin a/2     cos a/2
(normalisés)

(ex)

Code : Tout sélectionner

a/2
s = sin(a)
i = axe\x * s
j = axe\y * s
k = axe\z * s
q1\x = i: q1\y = 0: q1\z = 0
q2\x = 0: q2\y = j: q2\z = 0
q3\x = 0: q3\y = 0: q3\z = k
c = cos(a)
q1\w = c
q2\w = c
q3\w = c
c * c
norm = sqr(i * i + c)
q1\w / norm
q1\x / norm
norm = sqr(j * j + c)
q2\w / norm
q2\y / norm
norm = sqr(k * k + c)
q3\w / norm
q3\z / norm
2) les signes "*" (multiplier) ça multiplie vraiment les quaternions?
sur ce modèle-là : (?)
(ii = jj = kk = ijk = -1; ij = k etc... )
(pour chacune des 2 multiplications, 15 additions de 16 produits, dont 12 sont nuls, à répartir selon ce tableau) (ici c'est xyzw, parce que des fois on a des tableaux wxyz, ce qui est aussi porteur de confusions)

Code : Tout sélectionner

        i       j       k       1
i       -1      k       -j      i
j       -k      -1      -i      j
k       j       -i      -1      k
1       i       j       k       1
Si c'est oui partout, alors peut-être que c'est l'ordre des multiplications qui te joue des tours.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par Mesa »

Je suis de l'avis d'ollivier, les quaternions ne sont pas commutatifs :
http://fr.wikipedia.org/wiki/Quaternion ... ivit.C3.A9

L'ordre xyz est donc important.

M.
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par kelebrindae »

@Ollivier: Bonjour à toi aussi! J'avais failli poster un commentaire sur ton code "jaillé", que je trouvais plutôt classe, et puis j'ai renoncé faute de pertinence du dit-commentaire. Et puis c'est vrai que j'ai moins de temps pour coder ces derniers temps, alors j'ai moins de choses (intéressantes) à dire...

@Tous: Merci pour votre réactivité! Le problème ne semble pas si simple, mais avec la bande de férus de maths qui traînent sur le forum, je suis plutôt confiant sur le fait que ça va être vite résolu. :)

@Comtois: Du coup, ça vaut le coup que je poste le bug sur le forum anglais, ou bien (puisque tu es au courant) ça suffit comme ça?
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par comtois »

Ollivier a écrit :Bonjour Comtois,

je ne comprends pas bien ton code:

1) la fonction Quaternion() elle te permet de convertir un couple {axe; angle} en 3 quaternions?
Oui la fonction Quaternion permet de construire un quaternion à partir d'un angle/axe.

la multiplication d'un quaternion dans ogre se fait ainsi : (avec x,y,z et w pour le quaternion créé précédemment)

Code : Tout sélectionner

    Quaternion Quaternion::operator* (const Quaternion& rkQ) const
    {
        // NOTE:  Multiplication is not generally commutative, so in most
        // cases p*q != q*p.

        return Quaternion
        (
            w * rkQ.w - x * rkQ.x - y * rkQ.y - z * rkQ.z,
            w * rkQ.x + x * rkQ.w + y * rkQ.z - z * rkQ.y,
            w * rkQ.y + y * rkQ.w + z * rkQ.x - x * rkQ.z,
            w * rkQ.z + z * rkQ.w + x * rkQ.y - y * rkQ.x
        );
    }
Dernière modification par comtois le lun. 08/déc./2014 19:27, modifié 1 fois.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par comtois »

Mesa a écrit :Je suis de l'avis d'ollivier, les quaternions ne sont pas commutatifs :
http://fr.wikipedia.org/wiki/Quaternion ... ivit.C3.A9

L'ordre xyz est donc important.

M.
Oui l'ordre est important. C'est pour ça que j'utilise l'ordre généralement conseillé sur le forum d'ogre. Et je l'ai vu aussi dans cette classe
Extrait du code

Code : Tout sélectionner

mCachedQuaternion = Quaternion(mYaw, Vector3::UNIT_Y) * Quaternion(mPitch, Vector3::UNIT_X) * Quaternion(mRoll, Vector3::UNIT_Z); 
Par contre il me semble avoir lu quelque part qu'il fallait tester si on avait un angle à 180° et traiter le truc différemment, je ne sais plus où j'ai lu ça, et en ce moment je n'ai pas trop le temps j'ai un boulot de fou, le soir c'est relâche.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par comtois »

kelebrindae a écrit :@Comtois: Du coup, ça vaut le coup que je poste le bug sur le forum anglais, ou bien (puisque tu es au courant) ça suffit comme ça?
Oui ça vaut le coup car les rapports de bugs sont centralisés sur le forum anglais.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par Ollivier »

Bon bon tout à l'air bien Comtois... Dans ce cas, est-ce que tu peux détecter quand on demande un angle de 180 degrés sur Z ? Si oui, tu fais en sorte que ces 180 degrés là soient annulés (0 degrés à la place), et tu additionnes 180 degrés de plus (ou de moins on s'en fout) pour chacun des deux autres axes qui ne posent pas de problème. Voilà...
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par kelebrindae »

Bug posté sur le forum anglais. Merci de ton implication, Comtois!

Remarque (au cas où ma description du bug ne serait pas très claire): Ce n'est pas juste la valeur "180" qui pose problème; le bug se produit dès qu'on dépasse -180° ou 180°.

Ceci dit, puisque l'éventail des valeurs qui marchent fait bien 360°, est-ce qu'une sorte de "wrapValue" en interne ne pourrait pas corriger le problème? (ex: "190°" serait converti en "-170°", "-270°" en "90°", etc..) Mais je ne suis pas sûr que ça s'intégrerait très bien avec l'interpolation, ça... :?
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par Ollivier »

Je me permets cette modeste remarque de méthodologie:

"Etre à 180 degrés" et "dépasser les 180 degrés", ce n'est pas le même "bug".

Et je crois que pour chacun de ces deux problèmes distincts, il y a deux solutions qui, désormais sont expliqués ici, en attente de confirmation...
wkoinnen
Messages : 4
Inscription : jeu. 11/déc./2014 3:08

Re: [PB 5.31] NodeAnimation rotation (bug?)

Message par wkoinnen »

Je pense aussi que c'est deux problèmes differents. Mais les solutions, je ne sais pas :cry: etui ipad mini 3 housse ipad mini 3
Répondre