DynamicObjectCar01.bas
Example: DynamicObjectCar01.bas
Example of setting up a DynamicObjectCar.
#include once "InitGL.bi"
#define TRUEAXISDEBUG ' "optional" enable debug rendering and report any problems in file "debug.txt"
#include once "TrueAxis.bi"
sub _TrueAxisInit_ constructor
InitGL()
PhysicsCreateInstance()
end sub
sub _TrueAxisExit_ destructor
PhysicsDestroyInstance()
end sub
function CreateOpenGLWheel() as integer
const as single M_PI = atn(1)*4
const as integer SEGMENTS = 15
const as single US = (M_PI*2) / SEGMENTS
const as single VS = M_PI / SEGMENTS
const NPOINTS = (SEGMENTS + 1) * (SEGMENTS + 1)
static as integer wheel
dim A(2) as single
dim B(2) as single
dim P(NPOINTS*3-1) as single
dim UW as single
for i as integer=0 to SEGMENTS
P(i*2+0)=cos(UW)*0.5 ' x
P(i*2+1)=sin(UW)*0.5 ' z
UW=UW+US
next
if wheel then return wheel
wheel=glGenLists(1)
glNewList (wheel, GL_COMPILE)
glRotatef(90,0,0,1)
glBegin(GL_TRIANGLE_FAN)
glColor3f(0,0,0):glNormal3f(0,1,0):glVertex3f(0,0.5,0) ' center
for i as integer=SEGMENTS to 0 step-1
if (i and 4) then
glColor3f(0,0,0)
else
glColor3f(0.5,0.5,0.5)
end if
glVertex3f(P(i*2+0),0.5,P(i*2+1))
next
glEnd()
glBegin(GL_TRIANGLE_FAN)
glColor3f(0,0,0):glNormal3f(0,-1,0):glVertex3f(0,-0.5,0) ' center
for i as integer=0 to SEGMENTS
if (i and 4) then
glColor3f(0,0,0)
else
glColor3f(0.5,0.5,0.5)
end if
glVertex3f(P(i*2+0),-0.5,P(i*2+1))
next
glEnd()
glBegin(GL_TRIANGLE_STRIP)
glColor3f(0,0,0)
for i as integer=0 to SEGMENTS
dim as integer j=i+1 :j=j mod SEGMENTS
glVertex3f(P(i*2+0),-0.5,P(i*2+1))
glVertex3f(P(i*2+0), 0.5,P(i*2+1))
next
glEnd()
glEndList()
return wheel
End function
const as single fWheelSize = 0.6
const as single fWheelWidth = 0.3
const as single bWheelSize = 0.6
const as single bWheelWidth = 0.4
function CreateSimpleCar(carwidth as single=2,carheight as single=1.2,carlength as single=4) as DynamicObjectCar ptr
' create a car from CarTemplate
dim as CarTemplate ptr CarDesc = CarTemplateCreateNew()
CarTemplateBeginInitialise(CarDesc)
' add car CollisionObject (a simple box in this case)
dim as CollisionObjectConvex ptr Convex = CollisionObjectConvexCreateNew()
CollisionObjectConvexInitialiseAsABox Convex,0,CarHeight/4,0,CarWidth,CarHeight,CarLength
CarTemplateAddCollisionObjectConvex CarDesc,Convex
' we no longer need the collision box here.
CollisionObjectConvexRelease Convex
' add wheels
' steering front wheels
const as single fWheelTop = 0
const as single fWheelBottom = -0.7
dim as single fWheelXPos = (CarWidth -fWheelWidth/2)/2
dim as single fWheelZPos = (CarLength-fWheelSize )/2
' rear wheels
const as single bWheelTop = 0
const as single bWheelBottom = -0.7
dim as single bWheelXPos = (CarWidth -fWheelWidth/2)/2
dim as single bWheelZPos = -(CarLength-fWheelSize )/2
' front steering wheels
CarTemplateWheelSetRadius fWheelSize/2 ' radius
CarTemplateWheelSetSteeringFlag 1
CarTemplateWheelSetSuspensionTop fWheelXPos,fWheelTop ,fWheelZPos
CarTemplateWheelSetSuspensionBottom fWheelXPos,fWheelBottom,fWheelZPos
CarTemplateAddWheel CarDesc
CarTemplateWheelSetSuspensionTop -fWheelXPos,fWheelTop, fWheelZPos
CarTemplateWheelSetSuspensionBottom -fWheelXPos,fWheelBottom,fWheelZPos
CarTemplateAddWheel CarDesc
' back driving wheels
CarTemplateWheelSetRadius bWheelSize/2 ' radius
CarTemplateWheelSetSteeringFlag 0
CarTemplateWheelSetDrivingFlag 1
if 1 then ' 6 wheel vehicle
for i as integer=1 to 1
CarTemplateWheelSetSuspensionTop bWheelXPos,bWheelTop ,bWheelZPos+(bWheelSize+0.1)*i
CarTemplateWheelSetSuspensionBottom bWheelXPos,bWheelBottom,bWheelZPos+(bWheelSize+0.1)*i
CarTemplateAddWheel CarDesc
CarTemplateWheelSetSuspensionTop -bWheelXPos,bWheelTop ,bWheelZPos+(bWheelSize+0.1)*i
CarTemplateWheelSetSuspensionBottom -bWheelXPos,bWheelBottom,bWheelZPos+(bWheelSize+0.1)*i
CarTemplateAddWheel CarDesc
next
end if
' Rear wheels
CarTemplateWheelSetSuspensionTop bWheelXPos,bWheelTop ,bWheelZPos
CarTemplateWheelSetSuspensionBottom bWheelXPos,bWheelBottom,bWheelZPos
CarTemplateAddWheel CarDesc
CarTemplateWheelSetSuspensionTop -bWheelXPos,bWheelTop ,bWheelZPos
CarTemplateWheelSetSuspensionBottom -bWheelXPos,bWheelBottom,bWheelZPos
CarTemplateAddWheel CarDesc
CarTemplateEndInitialise CarDesc
' create a DynamicObjectCar from our CarTemplate
dim as DynamicObjectCar ptr NewCar = DynamicObjectCarCreateNew()
DynamicObjectCarInitialise NewCar,CarDesc
' we no longer need a reference to the CarTemplate here.
CarTemplateRelease CarDesc
return NewCar
end function
'
' main
'
' create a car
dim as DynamicObjectCar ptr car = CreateSimpleCar()
DynamicObjectSetCenterOffset car,0,-0.75,0
DynamicObjectSetPosition Car,-15,2,0
' add the car to the physics simulation
PhysicsAddDynamicObject Car
' create a static ground XZ plane (25 m x 25 m)
PhysicsAddStaticGround(25)
' car controls
dim as single Steer=.25,Accel=0.5,Brake,HandBrake,TractionControl=1
dim as integer bSteeringHelp,nGear=2 ' -1=auto shift 0=reverse 1=neutral 2=first gear 3=second 4=third ...
dim as integer WheelList = CreateOpenGLWheel()
dim as single x,y,z
' render and simualtion loop
dim as integer frames
while inkey=""
' update car controls
DynamicObjectCarUpdateControls Car,Steer,Accel,Brake,HandBrake,bSteeringHelp,TractionControl,nGear
' one step in simulation
PhysicsUpdate(1.0/75.0)
if frames mod 3 then
WindowTitle "gfx frame " & frames\3
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
glLoadIdentity
DynamicObjectGetPosition Car,x,y,z
LookAT 0,15,45, x,y,z, 0,1,0
' render all objects (only in debug mode)
PhysicsRender()
'PhysicsRenderBoundingBoxes()
' render the wheels
glPushMatrix()
DynamicObjectMultOpenGLMatrix(car)
for i as integer=0 to DynamicObjectCarGetNumWheels(car)-1
glPushMatrix()
DynamicObjectCarWheelMultLocalOpenGLMatrix(car,i)
' front or rear wheels
if i<2 then
glScalef(fWheelWidth,fWheelSize,fWheelSize)
else
glScalef(bWheelWidth,bWheelSize,bWheelSize)
end if
glCallList(WheelList)
glPopMatrix()
next
glPopMatrix()
flip
end if
Sleep(10)
frames+=1
wend
Copyright © 2015
Created with the Freeware Edition of HelpNDoc: Easily create Help documents