Post by scalion on Sept 17, 2019 16:18:52 GMT 1
Aie aie il faut que j'y aille mais je suis pressé de tester tout ça.
Ok ca y'est, j'ai fait mes courses, mon ménage, etc..
Yes , ca marche du tonnerre, j'ai fais un tas de tests et c'est juste ... décoiffant ! en même temps j'ai pas de cheveux donc ça va.
Blague à part, c'est juste ce qu'il faut pour gérer un robot virtuel. TOP TOP TOP !! Merci JMM !
Edit du 19/09/2019 :
Du coup je me suis penché sur une source C++ que j'avais été trouver je ne sais plus où sur le web pour faire une rotation en se basant sur un quaternion standard. J'avais pas réussi à la faire fonctionner (en fait je comprenait rien). Je l'avais déjà bidouillé un peu mais je m'y suis retrouvé. J'ai transcrit le code en GFABASIC (je l'ai adapaté au niveau du typage surtout) et ça marche, mais condensé en 1 seule fonction, juste que le quaternion est toujours à 1 en w et est réduit à un triplet XYZ donc c'est un peu différent du point de vue matriciel. A l'aide de ta démo j'ai fait un test comparatif et ça donne exactement les même résultats. Pas mal non ?
Function RotatePointAround3DAxis(ByRef Ip As XYZ, ByRef RV As XYZ, Theta#) As XYZ
' Translated from a C++ source of awhere in the web
Static Double costheta, sintheta
Static Q As XYZ
costheta = Cos(Theta)
sintheta = Sin(Theta)
Q.x = (costheta + (1 - costheta) * RV.x * RV.x) * Ip.x
Q.x += ((1 - costheta) * RV.x * RV.y - RV.z * sintheta) * Ip.y
Q.x += ((1 - costheta) * RV.x * RV.z + RV.y * sintheta) * Ip.z
Q.y = ((1 - costheta) * RV.x * RV.y + RV.z * sintheta) * Ip.x
Q.y += (costheta + (1 - costheta) * RV.y * RV.y) * Ip.y
Q.y += ((1 - costheta) * RV.y * RV.z - RV.x * sintheta) * Ip.z
Q.z = ((1 - costheta) * RV.x * RV.z - RV.y * sintheta) * Ip.x
Q.z += ((1 - costheta) * RV.y * RV.z + RV.x * sintheta) * Ip.y
Q.z += (costheta + (1 - costheta) * RV.z * RV.z) * Ip.z
Return Q
EndFunc