As far as I'm aware the only way to achieve true quaternion rotations in Blitz3D is to use TurnEntity with the global flag set to true.
Seeing as Blitz3D uses quaternions internally, and MiniB3D does not (it uses eulers instead), I don't think I'll be able to support this in MiniB3D natively without a rewrite, which I don't fancy doing.
However, if you are desperate to get this working in MiniB3D (say, for example you are working on a spaceship game and you need to avoid gimbal lock), then it is easy enough to do yourself.
All you need to do is create a quaternion yourself, apply the necessary multiplication with a 'turn' quaternion then convert it to a matrix which your entity will use.
Here's an example:
Seeing as Blitz3D uses quaternions internally, and MiniB3D does not (it uses eulers instead), I don't think I'll be able to support this in MiniB3D natively without a rewrite, which I don't fancy doing.
However, if you are desperate to get this working in MiniB3D (say, for example you are working on a spaceship game and you need to avoid gimbal lock), then it is easy enough to do yourself.
All you need to do is create a quaternion yourself, apply the necessary multiplication with a 'turn' quaternion then convert it to a matrix which your entity will use.
Here's an example:
Import "../MiniB3D.bmx" ' TurnEntity quaternion example - mimics the effect of Blitz3D's TurnEntity with the global flag set to true Strict Graphics3D 640,480 Local camera:TCamera=CreateCamera() PositionEntity camera,0,0,-5 Local light:TLight=CreateLight() Local cone:TMesh=CreateCone(4) ' create cone Local cone_x#=0,cone_y#=0,cone_z#=0,cone_sx#=1.0,cone_sy#=1.0,cone_sz#=1.0 Local quat:TQuaternion=EulerToQuat(0.0,0.0,0.0) ' create cone quat Local turn_quat:TQuaternion=EulerToQuat(0.0,0.0,0.0) ' create turn quat Local p#=0,y#=0,r#=0 ' pitch, yaw, roll values While Not KeyDown(KEY_ESCAPE) p=0; y=0; r=0 ' reset pitch, yaw, roll values ' Change rotation values depending on the key pressed If KeyDown( KEY_UP )=True Then p=-1 If KeyDown( KEY_DOWN )=True Then p=1 If KeyDown( KEY_LEFT )=True Then y=-1 If KeyDown( KEY_RIGHT )=True Then y=1 If KeyDown( KEY_Z )=True Then r=-1 If KeyDown( KEY_X )=True Then r=1 turn_quat=EulerToQuat(y,r,-p) ' set turn quat quat=MultiplyQuats(quat,turn_quat) ' multiply cone quat with turn quat quat=NormalizeQuat(quat) ' normalise quat ' rotate, scale and translate cone - use this instead of RotateEntity, ScaleEntity, PositionEntity etc TQuaternion.QuatToMat(-quat.w,quat.x,quat.y,-quat.z,cone.mat) ' convert cone quat to cone mat (rotate) cone.mat.Scale(cone_sx#,cone_sy#,cone_sz#) ' scale cone mat cone.mat.grid[3,0]=cone_x#; cone.mat.grid[3,1]=cone_y; cone.mat.grid[3,2]=-cone_z ' translate cone mat RenderWorld Flip Wend ' Leadwerks function Function EulerToQuat:TQuaternion(pitch#,yaw#,roll#) Local cr#=Cos(-roll#/2.0) Local cp#=Cos(pitch#/2.0) Local cy#=Cos(yaw#/2.0) Local sr#=Sin(-roll#/2.0) Local sp#=Sin(pitch#/2.0) Local sy#=Sin(yaw#/2.0) Local cpcy#=cp#*cy# Local spsy#=sp#*sy# Local spcy#=sp#*cy# Local cpsy#=cp#*sy# Local q:TQuaternion=New TQuaternion q.w#=cr#*cpcy#+sr#*spsy# q.x#=sr#*cpcy#-cr#*spsy# q.y#=cr#*spcy#+sr#*cpsy# q.z#=cr#*cpsy#-sr#*spcy# Return q End Function Function MultiplyQuats:TQuaternion(q1:TQuaternion,q2:TQuaternion) Local q:TQuaternion=New TQuaternion q.w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z q.x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y q.y = q1.w*q2.y + q1.y*q2.w + q1.z*q2.x - q1.x*q2.z q.z = q1.w*q2.z + q1.z*q2.w + q1.x*q2.y - q1.y*q2.x Return q End Function Function NormalizeQuat:TQuaternion(q:TQuaternion) Local uv#=Sqr(q.w*q.w+q.x*q.x+q.y*q.y+q.z*q.z) q.w=q.w/uv q.x=q.x/uv q.y=q.y/uv q.z=q.z/uv Return q End Function
