Sample quaternion by delorme24th 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. 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 |