| 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
 
 
 |