Blitz3D Quaternions
Blitz3D Forums/Blitz3D Programming/Blitz3D Quaternions
| ||
I am having trouble converting eulers into quaternions for use in .b3d files. I am using the code from Mark Sibly's MS3D .b3d exporter, but it does not produce correct results:Procedure EulerAsQuat(pitch.f,yaw.f,roll.f) sp.f=Sine(pitch/2.0) cp.f=Cosine(pitch/2.0) sy.f=Sine(yaw/2.0) cy.f=Cosine(yaw/2.0) sr.f=Sine(roll/2.0) cr.f=Cosine(roll/2.0) vectorw.f=cr*cp*cy+sr*sp*sy vectorx.f=sr*cp*cy-cr*sp*sy vectory.f=cr*sp*cy+sr*cp*sy vectorz.f=-(cr*cp*sy-sr*sp*cy) EndProcedure |
| ||
From what I can figure out,bearing in mind it is late ^^ tryvectorw.f =cy*cp*cr - sy*sp*sr vectorx.f =cy*cp*sr + sy*sp*cr vectory.f =sy*cp*cr + cy*sp*sr vectorz.f =cy*sp*cr - sy*cp*sr |
| ||
That did not work. I am checking the euler I put into the function, and the euler Blitz3D calculates is NOT the same. My exporter says 0.0,90.0,-90.0 --> Blitz3D says 0.0,-90.0,90.0 When I rotate the object in Blitz3D to 0.0,90.0,-90.0, the same angles my editor says, it has the exact same orientation. So the problem is definitely the translation of the euler to the quaternion and back. |
| ||
Halo, if it's any help an entitys current Quat is at: w#= peekmemfloat(ent+48) x#= peekmemfloat(ent+52) y#= peekmemfloat(ent+56) z#= peekmemfloat(ent+60) I've not got a working function for euler>quat as when certain values exceed +/- 90 degrees, the quat is completely negative. |
| ||
Thanks for that. I wrote a program that shows that the EulerAsQuat function in the MS3D exporter does not convert a Euler to the same Quaternion Blitz3D does: ![]() |
| ||
. |
| ||
. |
| ||
I uploaded the source code and required userlib: http://www.leadwerks.com/post/quatprob.zip |
| ||
I got it working, using this code. This is THE RIGHT WAY to convert a euler into a Blitz3D quaternion!:Procedure EulerAsQuat(pitch.f,yaw.f,roll.f) sp.f=Sine(yaw/2) cp.f=Cosine(yaw/2) sy.f=Sine(roll/2) cy.f=Cosine(roll/2) sr.f=Sine(pitch/2) cr.f=Cosine(pitch/2) vectorw.f=(cr*cp*cy-sr*sp*sy) vectorx.f=-(sr*cp*cy-cr*sp*sy) vectory.f=(cr*sp*cy+sr*cp*sy) vectorz.f=-(sr*sp*cy+cr*cp*sy) EndProcedure |
| ||
Great work! After half an hour I could see that a Blitz quaternions are unique and different to the way the rest of the planet does them lol! -.- [edit] think its a typo in the blitz3d sourcecode? or does Mark just love to be different ;) |
| ||
Still, now that you can convert a euler to a Blitz3D quaternion, you can use it with the geometry code Mark posted. |
| ||
cool :P |