6DoF Demo

Blitz3D Forums/Blitz3D Programming/6DoF Demo

Well I figured since I couldn't get the quat rotations working then I'd try to use some built in commands. Come to find out it was exactly what I was looking for. My first big hurdle was being able to define a thrust vector (along the z-axis) and being able to apply thrust to it no matter what orientation the aircraft was at. I had a feeling TFormNormal looked promising...and it was just what the doctor ordered.

Here's my labor. Thrust applied to the z-axis (0,0,1) no matter what orientation the object is at. It's a first step towards making a decent flight sim. Test it out. I know it's not much but at least I'm getting there. With this accomplishment, I'm kicking Tandem Fighters up to 2% complete!

From here on out it should get easier...well...let me get another beer.

;6DoF Demo
;by Chroma

Graphics3D 800,600,32,2
SetBuffer BackBuffer()

camera = CreateCamera()
PositionEntity camera,0,15,-15
light = CreateLight()

;Replace with your airplane
cube = CreateCube()
RotateEntity cube,0,0,0
PointEntity camera,cube

;Vectors
vOri.Vec3 = New Vec3	;Orientation
vFor.Vec3 = New Vec3	;Total Forces acting on the object
vAcc.Vec3 = New Vec3	;Acceleration (a=f/m)
vVel.Vec3 = New Vec3	;Velocity
vPos.Vec3 = New Vec3	;Position

;Object mass
Local mass# = 10

;Gravity
g# = 9.8

;Initial thrust
Local thrust# = 10.0

;Main Loop
While Not KeyHit(1)
Cls

;Crude Controls
If KeyDown(200) TurnEntity cube,1,0,0
If KeyDown(208) TurnEntity cube,-1,0,0
If KeyDown(203) TurnEntity cube,0,0,1
If KeyDown(205) TurnEntity cube,0,0,-1

;Reset Forces to Zero
Vec3_Set( vFor )

;Set Thrust Vector Forward
TFormNormal 0,0,1,cube,0

;Get Transformed Thrust Vector
Vec3_Set( vOri, TFormedX#(), TFormedY#(), TFormedZ#() )

;Apply Thrust
Vec3_MulScalar(vFor, vOri, Thrust)

;Gravity
;vFor\y = vFor\y - g * mass

;Apply Physics
Vec3_DivScalar(vAcc, vFor, mass)
Vec3_Add(vVel,vVel,vAcc,0.016)
Vec3_Add(vPos,vPos,vVel,0.016)
PositionEntity cube,vPos\x,vPos\y,vPos\z

UpdateWorld
RenderWorld

;Debug
Text 5,5,"XRot: "  + vOri\x
Text 5,25,"YRot: " + vOri\y
Text 5,45,"ZRot: " + vOri\z

Flip
Wend
EndGraphics
End


;Bare Vector Guts
Type Vec3
	Field x#,y#,z#
End Type

Function Vec3_Set(a.Vec3, x#=0, y#=0, z#=0)
	a\x = x
	a\y = y
	a\z = z
End Function

Function Vec3_Add(res.Vec3, a.Vec3, b.Vec3, time# = 1.0)
	res\x = a\x + b\x * time
	res\y = a\y + b\y * time
	res\z = a\z + b\z * time
End Function

Function Vec3_Mul(res.Vec3, a.Vec3, b.Vec3)
	res\x = a\x * b\x
	res\y = a\y * b\y
	res\z = a\z * b\z
End Function

Function Vec3_MulScalar(res.Vec3, a.Vec3, scalar#)
	res\x = a\x * scalar
	res\y = a\y * scalar
	res\z = a\z * scalar
End Function

Function Vec3_DivScalar(res.Vec3, a.Vec3, scalar#)
	res\x = a\x / scalar
	res\y = a\y / scalar
	res\z = a\z / scalar
End Function