Okay, my quat code worked right off the bat. Run this in Blitz3D and you will see it produces identical results:
Now added additional matrix rotation methods based on quaternions:
Graphics3D 640,480,32,2 Dim mat#(3,3) SeedRnd MilliSecs() e=CreatePivot() x#=Rnd(-180,180) y#=Rnd(-180,180) z#=Rnd(-180,180) RotateEntity e,x,y,z RotateMatrix x,y,z displaymatrix e WaitKey End Function DisplayMatrix(e) Print "Blitz3D:" Print GetMatElement(e,0,0)+", "+GetMatElement(e,0,1)+", "+GetMatElement(e,0,2) Print GetMatElement(e,1,0)+", "+GetMatElement(e,1,1)+", "+GetMatElement(e,1,2) Print GetMatElement(e,2,0)+", "+GetMatElement(e,2,1)+", "+GetMatElement(e,2,2) Print GetMatElement(e,3,0)+", "+GetMatElement(e,3,1)+", "+GetMatElement(e,3,2) Print "" Print "My matrix:" Print mat(0,0)+", "+mat(0,1)+", "+mat(0,2) Print mat(1,0)+", "+mat(1,1)+", "+mat(1,2) Print mat(2,0)+", "+mat(2,1)+", "+mat(2,2) Print mat(3,0)+", "+mat(3,1)+", "+mat(3,2) End Function Function RotateMatrix(x#,y#,z#) EulerAsQuat x,y,z RotateMatrix4 VECTOR_X,VECTOR_Y,VECTOR_Z,VECTOR_W End Function Function PositionMatrix(x#,y#,z#) mat(3,0)=x mat(3,1)=y mat(3,2)=z End Function Function RotateMatrix4(x#,y#,z#,w#) mat(0,0)=(1.0-2.0*x*x-2.0*z*z) mat(1,0)=-(2.0*z*y-2.0*w*x) mat(2,0)=-(2.0*x*y+2.0*w*z) mat(0,1)=-(2.0*z*y+2.0*w*x) mat(1,1)=(1.0-2.0*y*y-2.0*x*x) mat(2,1)=-(2.0*w*y-2.0*x*z) mat(0,2)=2.0*w*z-2.0*x*y mat(1,2)=2.0*x*z+2.0*w*y mat(2,2)=1.0-2.0*z*z-2.0*y*y End Function Global VECTOR_X# Global VECTOR_Y# Global VECTOR_Z# Global VECTOR_W# Function EulerAsQuat(pitch#,yaw#,roll#) cr#=Cos(-roll#/2.0) cp#=Cos(pitch#/2.0) cy#=Cos(yaw#/2.0) sr#=Sin(-roll#/2.0) sp#=Sin(pitch#/2.0) sy#=Sin(yaw#/2.0) cpcy#=cp#*cy# spsy#=sp#*sy# spcy#=sp#*cy# cpsy#=cp#*sy# VECTOR_w#=cr#*cpcy#+sr#*spsy# VECTOR_x#=sr#*cpcy#-cr#*spsy# VECTOR_y#=cr#*spcy#+sr#*cpsy# VECTOR_z#=cr#*cpsy#-sr#*spcy# End Function
Now added additional matrix rotation methods based on quaternions:
'Uses Quaternion instead of Eulers Method TForm4(px#,py#,pz#,qx#,qy#,qz#,w#,sx#,sy#,sz#) ' identity grid[0,3]=0.0 grid[1,3]=0.0 grid[2,3]=0.0 grid[3,3]=1.0 ' translate grid[3,0] = px# grid[3,1] = py# grid[3,2] = pz# ' rotate + scale grid[0,0]=(1.0-2.0*qx*qx-2.0*qz*qz)*sx grid[1,0]=-(2.0*qz*qy-2.0*w*qx)*sx grid[2,0]=-(2.0*qx*qy+2.0*w*qz)*sx grid[0,1]=-(2.0*qz*qy+2.0*w*qx)*sy grid[1,1]=(1.0-2.0*qy*qy-2.0*qx*qx)*sy grid[2,1]=-(2.0*w*qy-2.0*qx*qz)*sy grid[0,2]=(2.0*w*qz-2.0*qx*qy)*sz grid[1,2]=(2.0*qx*qz+2.0*w*qy)*sz grid[2,2]=(1.0-2.0*qz*qz-2.0*qy*qy)*sz End Method Method Rotate4(qx#,qy#,qz#,w#) grid[0,0]=(1.0-2.0*qx*qx-2.0*qz*qz) grid[1,0]=-(2.0*qz*qy-2.0*w*qx) grid[2,0]=-(2.0*qx*qy+2.0*w*qz) grid[0,1]=-(2.0*qz*qy+2.0*w*qx) grid[1,1]=(1.0-2.0*qy*qy-2.0*qx*qx) grid[2,1]=-(2.0*w*qy-2.0*qx*qz) grid[0,2]=2.0*w*qz-2.0*qx*qy grid[1,2]=2.0*qx*qz+2.0*w*qy grid[2,2]=1.0-2.0*qz*qz-2.0*qy*qy EndMethod