I will post my new turn entity functions I have somewhere, they use quaternions for rotation :)
Import sidesign.minib3d'"..\minib3d.bmx" 'include the
minib3d system
' TurnEntity quaternion example - mimics the effect of Blitz3D's TurnEntity with the global
flag set to false
Strict
Graphics3D 640,480, 32
Local camera:TCamera=CreateCamera()
PositionEntity camera,0,0,-5
Local light:TLight=CreateLight()
Local cone:TMesh=CreateCone(4) ' create cone
While Not KeyDown( KEY_ESCAPE )
If KeyDown( KEY_UP )=True Then EdzUpTurnEntity( Cone, -1, 0, 0, True )
If KeyDown( KEY_DOWN )=True Then EdzUpTurnEntity( Cone, 1, 0, 0, True )
If KeyDown( KEY_LEFT )=True Then EdzUpTurnEntity( Cone, 0, -1, 0, True )
If KeyDown( KEY_RIGHT )=True Then EdzUpTurnEntity( Cone, 0, 1, 0, True )
If KeyDown( KEY_Z )=True Then EdzUpTurnEntity( Cone, 0, 0, -1, True )
If KeyDown( KEY_X )=True Then EdzUpTurnEntity( Cone, 0, 0, 1, True )
RenderWorld
Flip
Wend
End
Function EdzUpTurnEntity( Ent:TEntity, X:Float, Y:Float, Z:Float, Glob:Int = False )
' Local P:Float = 0.0
' Local Y:Float = 0.0
' Local R:Float = 0.0
Local Pitch:Float = 0.0
Local Yaw:Float = 0.0
Local Roll:Float = 0.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
If Glob=False
Quat = EulerToQuat( EntityPitch( Ent, True ), EntityYaw( Ent, True ), EntityRoll( Ent, True ) ) 'Set Ent Quat
Turn_Quat = EulerToQuat( X, Y, Z ) 'Set turn quat
Quat = MultiplyQuats( Quat, Turn_Quat ) 'Multiply Entity quat with turn quat
Quat = NormalizeQuat( Quat ) 'normalise quat
QuatToEuler2( Quat.x, Quat.y, Quat.z, Quat.w, Pitch, Yaw, Roll ) 'Entity quat to euler
RotateEntity Ent, Pitch, Yaw, Roll
Else
RotateEntity Ent, EntityPitch( Ent )+X, EntityYaw( Ent )+Y, EntityRoll( Ent )+Z
EndIf
End Function
' 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
' Leadwerks function
Const QuatToEulerAccuracy#=0.001
Function QuatToEuler2(x#,y#,z#,w#,pitch# Var,yaw# Var,roll# Var)
Local sint#=(2.0*w*y)-(2.0*x*z)
Local cost_temp#=1.0-(sint#*sint#)
Local cost#
If Abs(cost_temp#)>QuatToEulerAccuracy
cost#=Sqr(cost_temp#)
Else
cost#=0.0
EndIf
Local sinv#,cosv#,sinf#,cosf#
If Abs(cost#)>QuatToEulerAccuracy
sinv#=((2.0*y*z)+(2.0*w*x))/cost#
cosv#=(1.0-(2.0*x*x)-(2.0*y*y))/cost#
sinf#=((2.0*x*y)+(2.0*w*z))/cost#
cosf#=(1.0-(2.0*y*y)-(2.0*z*z))/cost#
Else
sinv#=(2.0*w*x)-(2.0*y*z)
cosv#=1.0-(2.0*x*x)-(2.0*z*z)
sinf#=0.0
cosf#=1.0
EndIf
pitch#=ATan2(sint#,cost#)
yaw#=ATan2(sinf#,cosf#)
roll#=-ATan2(sinv#,cosv#)
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
This works for me, will be testing it further as soon as I have login sorted and Server selection
|