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
|