TGC Codebase Backup



Sample quaternion by delorme

24th Apr 2004 1:42
Summary

Just a sample of rotation with the quaternion.



Description

Only a sample for the rotation with the quaternion. Advantage with the quaternion the have no gimbal-lock.
for the use: only leftkey, rightkey and upkey.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    
sync on : sync rate 0
set display mode 1280,1024,32
color backdrop rgb(0,0,200)
SET CAMERA RANGE 0,30,100000

AXEX=10 : AXEY=11 : AXEZ=12

make object box AXEZ, 5, 5, 4000 : color object AXEZ,rgb(0,0,255) : ghost object on AXEZ, 0
make object box AXEY, 5, 5, 4000 : rotate object AXEY,90,0,0 : color object AXEY,rgb(255,0,0) : ghost object on AXEY, 0
make object box AXEX, 5, 5, 4000 : rotate object AXEX,0,90,0 : color object AXEX,rgb(0,255,255) : ghost object on AXEX, 0

x as float : y as float : z as float : w as float : a as float
quatx as float : quaty as float : quatz as float : quatw as float
angle as float

angle=1.00
quatw = cos(angle/2)
quatx = sin(angle/2)
quaty = sin(angle/2)
quatz = sin(angle/2)

w = 0.0
x = 200
y = 100
z = 25

P = 1 : sphere = 110
quat = 7 : quatopp = 8
axez = 10 : axey = 20 : axex = 30
VectorResult = 9
result = make vector4(P)
result = make vector4(quat)
result = make vector4(quatopp)
result = make vector4(VectorResult)
result = make vector3(axex)
result = make vector3(axey)
result = make vector3(axez)
make object sphere sphere,60
position object sphere,x,y,z
color object sphere,rgb(255,0,0)

global dim ResultQuaternion#(4)

set vector4 P,x,y,z,w
rem rotation sur x
set vector3 axex,1.0,0.0,0.0
rem rotation sur y
set vector3 axey,0.0,1.0,0.0
rem rotation sur z
set vector3 axez,0.0,0.0,1.0
position object sphere,x vector4(P),y vector4(P),z vector4(P)

position camera 400,1000,-1500
point camera 0,0,0

do
   rem =============== test quaternion ====================
   if leftkey()
      set vector4 quat,x vector3(axex) * quatx *1.0,y vector3(axex) * quaty *1.0,z vector3(axex) * quatz *1.0,quatw *1.0
      set vector4 quatopp,-x vector3(axex) * quatx *1.0,-y vector3(axex) * quaty *1.0,-z vector3(axex) * quatz *1.0,quatw *1.0

      MultiplicationVecteur4( quat, P)
      set vector4 VectorResult,ResultQuaternion#(0),ResultQuaternion#(1),ResultQuaternion#(2),ResultQuaternion#(3)
      MultiplicationVecteur4( VectorResult, quatopp)
      set vector4 P,ResultQuaternion#(0),ResultQuaternion#(1),ResultQuaternion#(2),ResultQuaternion#(3)
   endif
   if rightkey()
      set vector4 quat,x vector3(axey) * quatx *1.0,y vector3(axey) * quaty *1.0,z vector3(axey) * quatz *1.0,quatw *1.0
      set vector4 quatopp,-x vector3(axey) * quatx *1.0,-y vector3(axey) * quaty *1.0,-z vector3(axey) * quatz *1.0,quatw *1.0

      MultiplicationVecteur4( quat, P)
      set vector4 VectorResult,ResultQuaternion#(0),ResultQuaternion#(1),ResultQuaternion#(2),ResultQuaternion#(3)
      MultiplicationVecteur4( VectorResult, quatopp)
      set vector4 P,ResultQuaternion#(0),ResultQuaternion#(1),ResultQuaternion#(2),ResultQuaternion#(3)
   endif
   if upkey()
      set vector4 quat,x vector3(axez) * quatx *1.0,y vector3(axez) * quaty *1.0,z vector3(axez) * quatz *1.0,quatw *1.0
      set vector4 quatopp,-x vector3(axez) * quatx *1.0,-y vector3(axez) * quaty *1.0,-z vector3(axez) * quatz *1.0,quatw *1.0

      MultiplicationVecteur4( quat, P)
      set vector4 VectorResult,ResultQuaternion#(0),ResultQuaternion#(1),ResultQuaternion#(2),ResultQuaternion#(3)
      MultiplicationVecteur4( VectorResult, quatopp)
      set vector4 P,ResultQuaternion#(0),ResultQuaternion#(1),ResultQuaternion#(2),ResultQuaternion#(3)
   endif

   position object sphere,x vector4(P),y vector4(P),z vector4(P)

   set cursor 0,0
   print screen fps()
   text 0,75,"sphere x        :"+str$(x vector4(P))
   text 0,90,"sphere y        :"+str$(y vector4(P))
   text 0,105,"sphere z        :"+str$(z vector4(P))
   text 0,120,"sphere w        :"+str$(w vector4(P))

   sync
   rem Fin de boucle
loop


function MultiplicationVecteur4( Vector1, Vector2)

   XX as float : YY as float : ZZ as float : WW as float

   WW = W VECTOR4(Vector1)*W VECTOR4(Vector2)-X VECTOR4(Vector1)*X VECTOR4(Vector2)-Y VECTOR4(Vector1)*Y VECTOR4(Vector2)-Z VECTOR4(Vector1)*Z VECTOR4(Vector2)
   XX = W VECTOR4(Vector1)*X VECTOR4(Vector2)+W VECTOR4(Vector2)*X VECTOR4(Vector1)+Y VECTOR4(Vector1)*Z VECTOR4(Vector2)-Z VECTOR4(Vector1)*Y VECTOR4(Vector2)
   YY = W VECTOR4(Vector1)*Y VECTOR4(Vector2)+W VECTOR4(Vector2)*Y VECTOR4(Vector1)+Z VECTOR4(Vector1)*X VECTOR4(Vector2)-X VECTOR4(Vector1)*Z VECTOR4(Vector2)
   ZZ = W VECTOR4(Vector1)*Z VECTOR4(Vector2)+W VECTOR4(Vector2)*Z VECTOR4(Vector1)+X VECTOR4(Vector1)*Y VECTOR4(Vector2)-Y VECTOR4(Vector1)*X VECTOR4(Vector2)

   ResultQuaternion#(0)=XX
   ResultQuaternion#(1)=YY
   ResultQuaternion#(2)=ZZ
   ResultQuaternion#(3)=WW

endfunction