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 ...
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