DynamicObjectCar01.bas

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