I can't see your picture mate.
It's not optimised in any shape or form and a bit sloppy but for what it's worth ...
Graphics3D 640,480,16,1
Global camera
Global plane
Global light
Global track
Global p1.CarType
Global p2.CarType
Global Points=0
Global PP=0
Global Pivot=CreatePivot()
Type PointType
Field x#, y#,z#
End Type
Type CarType
Field Model
Field Target
Field Vx#, Vy#, Vz#
Field Acceleration#
Field Brakes#
Field Traction#
Field Speed#
Field TopSpeed#
Field Wheel[3]
End Type
Dim Point.PointType( 2000 )
Dim TP.PointType( 6, 20000 )
GAMEinit()
TRACKinit()
RACEinit()
While Not KeyDown(1)
GAMEupdate()
Wend
End
;=================================================
;=================================================
;=================================================
Function RACEinit()
PositionEntity P1\Model,TP(3,0 )\x,TP(3,0)\y,TP(3,0)\z
PositionEntity Pivot,TP(3,1)\x, TP(3,1)\y, TP(3,1)\z
PointEntity P1\Model, Pivot
PositionEntity P2\Model,TP(3,0 )\x,TP(3,0)\y,TP(3,0)\z
PositionEntity Pivot,TP(3,1)\x, TP(3,1)\y, TP(3,1)\z
PointEntity P2\Model, Pivot
End Function
;=================================================
;=================================================
;=================================================
Function CARupdate( c.Cartype )
jx# = -JoyX():If Abs(jx) < .25 jx = 0
jb =JoyDown(3)
TurnEntity c\Model, 0, jx * 3.0,0
For w = 0 To 1
RotateEntity c\wheel[w],EntityPitch(c\wheel[w]),jx*45.0,0
Next
c\Speed = LIMIT ( c\Speed + ( jb * c\Acceleration ) - ( ( Not jb ) * c\Brakes ) , 0, c\TopSpeed )
TFormVector 0,0,(1.0 - c\Traction ), c\Model, 0
c\Vx = ( c\Vx * c\Traction ) + ( TFormedX() * c\Speed )
c\Vz = ( c\Vz * c\Traction ) + ( TFormedZ() * c\Speed )
c\Vy = ( c\Vy * c\Traction ) + ( TFormedY() * c\Speed ) - gravity
TranslateEntity c\Model, c\Vx, c\vy , c\Vz
For l = 0 To 3
TurnEntity c\wheel[l],c\Speed * 90.0 / (Pi),0,0
Next
;collisions
unused = LinePick ( EntityX(c\Model,1),EntityY(c\model,1)+5,EntityZ(c\model,1),0,-20,.2 )
picked = PickedEntity()
If picked = Track Or picked = plane
;hug track
TranslateEntity c\Model,0,PickedY()-EntityY(c\Model)+.1,0
nx#=PickedNX():ny#=PickedNY():nz#=PickedNZ()
AlignToVector c\Model,nx,ny,nz,2,.25
EndIf
End Function
;=================================================
;=================================================
;=================================================
Function GAMEupdate()
CARupdate( p1 )
CAMERAupdate()
RenderWorld()
Flip
End Function
;=================================================
;=================================================
;=================================================
Function CAMERAupdate()
tx# = ( EntityX( P1\Target,1 ) - EntityX( Camera ) ) * .25
ty# = ( EntityY( P1\Target,1) - EntityY( Camera) ) *.25
tz# = ( EntityZ( P1\Target,1 ) - EntityZ( Camera ) ) *.25
TranslateEntity Camera, tx, ty, tz
PointEntity Camera, p1\Model,EntityRoll( p1\Model)
End Function
;=================================================
;=================================================
;=================================================
Function WRAP#( q#, b#)
If q>=b Then q=q-b
If q<0 Then q=b+q
Return q
End Function
;=================================================
;=================================================
;=================================================
Function LIMIT#(n#,n1#,n2#)
If n>n2 Then n=n2
If n<n1 Then n=n1
Return n
End Function
;=================================================
;=================================================
;=================================================
Function JOIN (x1,y1,z1,vx,vy,vz,x2,y2,z2)
For t#=.1 To 1 Step .1
TP( 3, pp ) = New PointType
TP(3,pp)\x = x1*(1-t)^3 + 3*vx*(1-t)^2*t + 3*vx*(1-t)*t^2 + x2*t^3
TP(3,pp)\y = limit( y1*(1-t)^3 + 3*vy*(1-t)^2*t + 3*vy*(1-t)*t^2 + y2*t^3 , 0, 10.0 )
TP(3,pp)\z = z1*(1-t)^3 + 3*vz*(1-t)^2*t + 3*vz*(1-t)*t^2 + z2*t^3
pp=pp+1
Next
End Function
;=================================================
;=================================================
;=================================================
Function GAMEinit()
plane = CreatePlane()
EntityColor plane,150,100,75
EntityPickMode plane, 2
EntityOrder plane,1
EntityFX plane,1+16
camera = CreateCamera()
CameraClsColor camera,50,100,200
PositionEntity camera,0,500,0
light = CreateLight()
RotateEntity light,30,-60,0
P1 = MESHcar( 200,200,50 )
P2 = MESHcar( 50,200,200 )
End Function
;=================================================
;=================================================
;=================================================
Function TRACKinit()
;points
Restore LEVELdata
Read points
For l = 0 To points-1
point( l*2 ) = New pointtype
Read point(l*2)\x
Read point(l*2)\y
Read point(l*2)\z
Next
;mid points
For l= 0 To points-1
m = l*2+1
v = ( l+1 ) Mod points
point( m) = New pointtype
point( m)\x = ( point(l*2)\x + point(v*2)\x ) * .5
point( m)\y = ( point(l*2)\y + point(v*2)\y ) * .5
point( m)\z = ( point(l*2)\z + point(v*2)\z ) * .5
Next
points = points * 2
;smooth bezier curves
For l= 0 To points-1 Step 2
k = ( l+1) Mod points
n = ( l + 2 ) Mod points
m = ( l + 3 ) Mod points
JOIN ( point( k )\x , point( k )\y, point( k )\z, point( n )\x, point ( n )\y, point(n)\z, point( m)\x, point(m)\y , point(m)\z )
Next
;tangents
Color 255,255,255
For l = 0 To pp-1
m = ( l-1+pp ) Mod pp
n = ( l + 1 ) Mod pp
dx# = TP(3, l )\x - TP(3,m)\x
dz# = TP(3, l )\z - TP(3,m)\z
d# = Sqr ( dx*dx + dz*dz) * 2.0
ax# = dx/d
az# = dz/d
dx# = TP(3, n )\x - TP(3,l)\x
dz# = TP(3, n )\z - TP(3,l)\z
d# = Sqr ( dx*dx + dz*dz) * 2.0
ax# = ax# + dx/d
az# = az# + dz/d
For q = 0 To 6
dr# = Sgn(q-3)
Select Abs(q-3)
Case 1
Width# = 5.0
Height# = TP(3,l)\y
Case 2
Width# = 6.0
Height# = TP(3,l)\y+.5
Case 3
width# = 10.0
Height# = 0
If TP(3,l)\y = 10.0
Height = TP(3,l)\y-2.5
Width = 7.0
EndIf
End Select
If q<>3
TP(q,l) = New pointtype
TP(q,l)\x = TP(3,l)\x - az * width *dr
TP(q,l)\y = Height
TP(q,l)\z = TP(3,l)\z + ax * width * dr
EndIf
Next
Next
;show tangents
For l = 0 To pp-1
n = ( l + 1 ) Mod pp
For q = 0 To 6
Select q
Case 3 Color 200,50,50
Default Color 50,50,50
End Select
Line TP(q,l)\x+320, 240-TP(q,l)\z, TP(q,n)\x+320, 240 - TP(q,n)\z
Next
Color 50,50,200
Line TP(2,l)\x+320, 240-TP(4,l)\z, TP(2,l)\x+320, 240-TP(4,l)\z
Color 255,255,255
Text TP(3,l)\x + 320, 240-TP(3,l)\z,Str$(l),1,1
Next
Flip
MouseWait
;make 3d mesh
Track = MESHtrack()
End Function
;=================================================
;=================================================
;=================================================
Function MESHtrack()
mesh = CreateMesh()
s = CreateSurface( mesh )
For l = 0 To pp-1
n = ( l + 1 ) Mod pp
d = ( l Mod 2 )
;road
v0 = AddVertex( s, TP(2,n)\x, TP(2,n)\y, TP(2,n)\z )
v1 = AddVertex( s, TP(4,n)\x, TP(4,n)\y, TP(4,n)\z )
v2 = AddVertex( s, TP(4,l)\x, TP(4,l)\y, TP(4,l)\z )
v3 = AddVertex( s, TP(2,l)\x, TP(2,l)\y, TP(2,l)\z )
For v = v0 To v3
Select d
Case 0 r=100:g=100:b=150
Case 1 r=150:g=150:b=200
End Select
VertexColor s,v,r,g,b
Next
AddTriangle s,v2,v1,v0
AddTriangle s,v0,v3,v2
;kerb
v4 = AddVertex( s, TP(0,n)\x, TP(0,n)\y, TP(0,n)\z )
v5 = AddVertex( s, TP(1,n)\x, TP(1,n)\y, TP(1,n)\z )
v6 = AddVertex( s, TP(1,l)\x, TP(1,l)\y, TP(1,l)\z )
v7 = AddVertex( s, TP(0,l)\x, TP(0,l)\y, TP(0,l)\z )
v8 = AddVertex( s, TP(5,n)\x, TP(5,n)\y, TP(5,n)\z )
v9 = AddVertex( s, TP(6,n)\x, TP(6,n)\y, TP(6,n)\z )
v10 = AddVertex( s, TP(6,l)\x, TP(6,l)\y, TP(6,l)\z )
v11 = AddVertex( s, TP(5,l)\x, TP(5,l)\y, TP(5,l)\z )
For v = v4 To v11
Select d
Case 0 r=50:g=150:b=50
Case 1 r=75:g=200:b=75
End Select
VertexColor s,v,r,g,b
Next
AddTriangle s,v6,v5,v4
AddTriangle s,v4,v7,v6
AddTriangle s,v10,v9,v8
AddTriangle s,v8,v11,v10
;grass
v12 = AddVertex( s, TP(1,n)\x, TP(1,n)\y, TP(1,n)\z )
v13 = AddVertex( s, TP(2,n)\x, TP(2,n)\y, TP(2,n)\z )
v14 = AddVertex( s, TP(2,l)\x, TP(2,l)\y, TP(2,l)\z )
v15 = AddVertex( s, TP(1,l)\x, TP(1,l)\y, TP(1,l)\z )
v16 = AddVertex( s, TP(4,n)\x, TP(4,n)\y, TP(4,n)\z )
v17 = AddVertex( s, TP(5,n)\x, TP(5,n)\y, TP(5,n)\z )
v18 = AddVertex( s, TP(5,l)\x, TP(5,l)\y, TP(5,l)\z )
v19 = AddVertex( s, TP(4,l)\x, TP(4,l)\y, TP(4,l)\z )
For v = v12 To v19
Select d
Case 0 r=200:g=50:b=50
Case 1 r=200:g=200:b=200
End Select
VertexColor s,v,r,g,b
Next
AddTriangle s,v14,v13,v12
AddTriangle s,v12,v15,v14
AddTriangle s,v18,v17,v16
AddTriangle s,v16,v19,v18
;underside
If TP(3, n )\y =10 Or TP(3, l )\y=10
v20 = AddVertex( s, TP(0,n)\x, TP(0,n)\y, TP(0,n)\z )
v21 = AddVertex( s, TP(6,n)\x, TP(6,n)\y, TP(6,n)\z )
v22 = AddVertex( s, TP(6,l)\x, TP(6,l)\y, TP(6,l)\z )
v23 = AddVertex( s, TP(0,l)\x, TP(0,l)\y, TP(0,l)\z )
For v = v20 To v23
Select d
Case 0 r=50:g=50:b=200
Case 1 r=50:g=50:b=150
End Select
VertexColor s,v,r,g,b
Next
AddTriangle s, v20,v21,v22
AddTriangle s,v22,v23,v20
EndIf
Next
EntityFX mesh,2
EntityPickMode mesh,2
UpdateNormals mesh
Return mesh
End Function
;=================================================
;=================================================
;=================================================
Function MESHcar.CarType( r,g,b)
c.CarType = New CarType
c\Model = CreateCube()
PositionMesh c\Model,0,1,0
ScaleMesh c\Model,.5,.5,1
UpdateNormals c\Model
EntityColor c\Model,r,g,b
c\Target = CreatePivot( c\Model )
PositionEntity c\Target,0,4,-8
temp = CreateCylinder( 5 )
RotateMesh temp,0,0,90
ScaleMesh temp,.25,.5,.5
EntityColor temp,50,50,50
w=0
For z# = .75 To -1 Step -1.75
For x# = -1 To 1 Step 2
c\Wheel[w] = CopyEntity( temp, c\Model )
UpdateNormals c\Wheel[w]
PositionEntity c\Wheel[w],x,.5,z
w = w + 1
Next
Next
FreeEntity temp
shadow = CreateCube( c\Model )
ScaleEntity shadow,1.25,.01,1.25
EntityColor shadow,50,50,50
EntityAlpha shadow,.5
c\Acceleration = .01
c\Brakes = .005
c\Traction = .95
c\Speed = 0.0
c\TopSpeed = 1.25
c\Vx = 0
c\Vy = 0
c\Vz = 0
Return c
End Function
;=================================================
;=================================================
;=================================================
.LEVELdata
Data 25
Data 32,0,80
Data -32,0,80
Data -64,1,48
Data -96,3,-16
Data -128,0,-16
Data -160,3,48
Data -160,0,112
Data -160,5,176
Data -96,0,176
Data -32,0,208
Data 32,0,208
Data 96,5,176
Data 96,5,144
Data 32,0,144
Data -32,0,144
Data -128,11,144
Data -192,11,144
Data -224,0,112
Data -224,0,16
Data -256,8,-16
Data -256,8,-48
Data -192,3,-112
Data -128,0,-112
Data -64,5,-144
Data 32,7,-112
Data 96,0,16