Active Forums > QB64 Discussion
Car : Physics Test
Ashish:
Hi Everyone! :)
Here's is simple demo of Car running on a uneven road with real-time physics
in the background giving at natural effect.
Controls -
'a' & 'd' to move left & right
Space to apply brakes
'h' to toggle on/off headlights
**Code is updated to according to suggestions**
--- Code: QB64: ---'####################' Cars By Ashish'####################' Just for fun! :)'@KingOfCoders _TITLE "Cars" TYPE vec2 x AS SINGLE y AS SINGLEEND TYPE TYPE wheels pos AS vec2 'position vel AS vec2 'velocity acc AS vec2 'acceleration ang AS _FLOAT 'angle radius AS SINGLE 'wheel radius pos2 AS vec2END TYPE TYPE headlights pos AS vec2 switched AS _BYTE 'power as singleEND TYPE TYPE bodyFrames baseFrame AS vec2 steepFrame AS vec2 baseFrame2 AS vec2 steepFrame2 AS vec2END TYPE TYPE cars backWheel AS wheels frontWheel AS wheels headlight AS headlights body AS bodyFramesEND TYPE RANDOMIZE TIMER SCREEN _NEWIMAGE(800, 400, 32) 'noise function related variablesDIM SHARED perlin_octaves AS SINGLE, perlin_amp_falloff AS SINGLE DIM SHARED Car AS cars, white&, roadMap(800) AS vec2 FOR i = 0 TO 800 roadMap(i).x = i roadMap(i).y = noise(xoff, yoff, 0) * 40 + 363 xoff = xoff + .001 yoff = yoff + .01NEXT white& = _RGB(255, 255, 255)v = RNDCar.backWheel.pos.x = 50Car.backWheel.pos.y = 350Car.backWheel.ang = vCar.backWheel.radius = 13 Car.frontWheel.pos.x = 130Car.frontWheel.pos.y = 350Car.frontWheel.ang = vCar.frontWheel.radius = 13 Car.headlight.switched = -1 initCar Car DO drawCar Car drawMap roadMap() IF _KEYDOWN(ASC("d")) THEN Car.backWheel.acc.x = Car.backWheel.acc.x + .05 Car.frontWheel.acc.x = Car.frontWheel.acc.x + .05 END IF IF _KEYDOWN(ASC("a")) THEN Car.backWheel.acc.x = Car.backWheel.acc.x - .05 Car.frontWheel.acc.x = Car.frontWheel.acc.x - .05 END IF IF _KEYDOWN(ASC(" ")) THEN IF Car.backWheel.vel.x > 0 THEN Car.backWheel.vel.x = Car.backWheel.vel.x - .09 IF Car.backWheel.vel.x < 0 THEN Car.backWheel.vel.x = Car.backWheel.vel.x + .09 IF Car.frontWheel.vel.x > 0 THEN Car.frontWheel.vel.x = Car.frontWheel.vel.x - .09 IF Car.frontWheel.vel.x < 0 THEN Car.frontWheel.vel.x = Car.frontWheel.vel.x + .09 END IF IF _KEYHIT = (ASC("h")) THEN IF Car.headlight.switched THEN Car.headlight.switched = 0 ELSE Car.headlight.switched = -1 END IF updateCar Car _LIMIT 40 _DISPLAY CLS , 1 Car.backWheel.acc.x = 0 Car.frontWheel.acc.x = 0 IF Car.frontWheel.pos.x > 0 AND Car.frontWheel.pos.x < 800 AND Car.backWheel.pos.x > 0 AND Car.backWheel.pos.x < 800 THEN Car.frontWheel.pos.x = roadMap(Car.frontWheel.pos2.x).x Car.frontWheel.pos.y = roadMap(Car.frontWheel.pos2.x).y - 13 Car.backWheel.pos.x = roadMap(Car.backWheel.pos2.x).x Car.backWheel.pos.y = roadMap(Car.backWheel.pos2.x).y - 13 END IFLOOP SUB drawMap (mapData() AS vec2)FOR i = 0 TO UBOUND(mapData) - 1 LINE (mapData(i).x, mapData(i).y)-(mapData(i + 1).x, mapData(i + 1).y), white&NEXTEND SUB SUB initCar (obj AS cars)obj.headlight.pos.x = obj.frontWheel.pos.x + 25obj.headlight.pos.y = obj.frontWheel.pos.y - 25END SUB SUB drawCar (obj AS cars)'we will draw body frames first, then, lights, followed by wheels. LINE (obj.backWheel.pos.x - 30, obj.backWheel.pos.y - 40)-(obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y - 40), white& 'up baseLINE (obj.backWheel.pos.x + obj.backWheel.radius, obj.backWheel.pos.y)-(obj.frontWheel.pos.x - obj.frontWheel.radius, obj.frontWheel.pos.y), white& 'down base '.....and some more..... little lines to cover down base.....LINE (obj.backWheel.pos.x - obj.backWheel.radius, obj.backWheel.pos.y)-(obj.backWheel.pos.x - 30, obj.backWheel.pos.y), white&LINE (obj.frontWheel.pos.x + obj.backWheel.radius, obj.frontWheel.pos.y)-(obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y), white& 'left & right of baseLINE (obj.backWheel.pos.x - 30, obj.backWheel.pos.y)-(obj.backWheel.pos.x - 30, obj.backWheel.pos.y - 40), white&LINE (obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y)-(obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y - 40), white& 'steeps LINE (obj.backWheel.pos.x - 30, obj.backWheel.pos.y - 40)-(obj.backWheel.pos.x + 5, obj.backWheel.pos.y - 70), white&LINE (obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y - 40)-(obj.frontWheel.pos.x - 5, obj.frontWheel.pos.y - 70), white& 'roofLINE (obj.backWheel.pos.x + 5, obj.backWheel.pos.y - 70)-(obj.frontWheel.pos.x - 5, obj.frontWheel.pos.y - 70), white& 'divider, to form window glasses'line (obj.backWheel.pos.y - 70)-(obj.) 'lights, x = cos0*r + xx, cos0 = x - xx / rIF obj.headlight.switched THEN FOR i = 1 TO 150 h = map(i, 1, 150, 3, 30) a = map(i, 1, 100, 200, 0) LINE (obj.headlight.pos.x + i, obj.headlight.pos.y - h)-(obj.headlight.pos.x + i, obj.headlight.pos.y + h), _RGBA(255, 255, 255, a) NEXTEND IF'tyresCIRCLE (obj.backWheel.pos.x, obj.backWheel.pos.y), obj.backWheel.radius, white&CIRCLE (obj.frontWheel.pos.x, obj.frontWheel.pos.y), obj.frontWheel.radius, white& LINE (COS(obj.backWheel.ang) * obj.backWheel.radius + obj.backWheel.pos.x, SIN(obj.backWheel.ang) * obj.backWheel.radius + obj.backWheel.pos.y)-(COS(obj.backWheel.ang + _PI) * obj.backWheel.radius + obj.backWheel.pos.x, SIN(obj.backWheel.ang + _PI) * obj.backWheel.radius + obj.backWheel.pos.y), white&LINE (COS(obj.frontWheel.ang) * obj.frontWheel.radius + obj.frontWheel.pos.x, SIN(obj.frontWheel.ang) * obj.frontWheel.radius + obj.frontWheel.pos.y)-(COS(obj.frontWheel.ang + _PI) * obj.frontWheel.radius + obj.frontWheel.pos.x, SIN(obj.frontWheel.ang + _PI) * obj.frontWheel.radius + obj.frontWheel.pos.y), white& END SUB SUB updateCar (obj AS cars)obj.backWheel.pos.x = obj.backWheel.pos.x + obj.backWheel.vel.xobj.backWheel.pos.y = obj.backWheel.pos.y + obj.backWheel.vel.y IF obj.backWheel.vel.x > 0 THEN obj.backWheel.vel.x = obj.backWheel.vel.x - .01IF obj.backWheel.vel.x < 0 THEN obj.backWheel.vel.x = obj.backWheel.vel.x + .01 obj.frontWheel.pos.x = obj.frontWheel.pos.x + obj.frontWheel.vel.xobj.frontWheel.pos.y = obj.frontWheel.pos.y + obj.frontWheel.vel.y IF obj.frontWheel.vel.x > 0 THEN obj.frontWheel.vel.x = obj.frontWheel.vel.x - .01IF obj.frontWheel.vel.x < 0 THEN obj.frontWheel.vel.x = obj.frontWheel.vel.x + .01 obj.backWheel.vel.x = obj.backWheel.vel.x + obj.backWheel.acc.xobj.backWheel.vel.y = obj.backWheel.vel.y + obj.backWheel.acc.y obj.frontWheel.vel.x = obj.frontWheel.vel.x + obj.frontWheel.acc.xobj.frontWheel.vel.y = obj.frontWheel.vel.y + obj.frontWheel.acc.y IF ABS(obj.backWheel.vel.x) > 0 THEN IF obj.backWheel.vel.x <> 0 THEN obj.backWheel.ang = obj.backWheel.pos.x / obj.backWheel.radiusEND IF IF ABS(obj.frontWheel.vel.x) > 0 THEN IF obj.frontWheel.vel.x <> 0 THEN obj.frontWheel.ang = obj.frontWheel.pos.x / Car.frontWheel.radiusEND IFobj.headlight.pos.x = obj.frontWheel.pos.x + 25obj.headlight.pos.y = obj.frontWheel.pos.y - 25 obj.backWheel.pos2.x = INT(obj.backWheel.pos.x)obj.backWheel.pos2.y = INT(obj.backWheel.pos.y) obj.frontWheel.pos2.x = INT(obj.frontWheel.pos.x)obj.frontWheel.pos2.y = INT(obj.frontWheel.pos.y)END SUB FUNCTION map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!END FUNCTION FUNCTION dist! (x1!, y1!, x2!, y2!)dist! = SQR((x2! - x1!) ^ 2 + (y2! - y1!) ^ 2)END FUNCTION FUNCTION noise! (x AS SINGLE, y AS SINGLE, z AS SINGLE)STATIC p5NoiseSetup AS _BYTESTATIC perlin() AS SINGLESTATIC PERLIN_YWRAPB AS SINGLE, PERLIN_YWRAP AS SINGLESTATIC PERLIN_ZWRAPB AS SINGLE, PERLIN_ZWRAP AS SINGLESTATIC PERLIN_SIZE AS SINGLE IF NOT p5NoiseSetup THEN p5NoiseSetup = -1 PERLIN_YWRAPB = 4 PERLIN_YWRAP = INT(1 * (2 ^ PERLIN_YWRAPB)) PERLIN_ZWRAPB = 8 PERLIN_ZWRAP = INT(1 * (2 ^ PERLIN_ZWRAPB)) PERLIN_SIZE = 4095 perlin_octaves = 4 perlin_amp_falloff = 0.5 REDIM perlin(PERLIN_SIZE + 1) AS SINGLE DIM i AS SINGLE FOR i = 0 TO PERLIN_SIZE + 1 perlin(i) = RND NEXTEND IF x = ABS(x)y = ABS(y)z = ABS(z) DIM xi AS SINGLE, yi AS SINGLE, zi AS SINGLExi = INT(x)yi = INT(y)zi = INT(z) DIM xf AS SINGLE, yf AS SINGLE, zf AS SINGLExf = x - xiyf = y - yizf = z - zi DIM r AS SINGLE, ampl AS SINGLE, o AS SINGLEr = 0ampl = .5 FOR o = 1 TO perlin_octaves DIM of AS SINGLE, rxf AS SINGLE DIM ryf AS SINGLE, n1 AS SINGLE, n2 AS SINGLE, n3 AS SINGLE of = xi + INT(yi * (2 ^ PERLIN_YWRAPB)) + INT(zi * (2 ^ PERLIN_ZWRAPB)) rxf = 0.5 * (1.0 - COS(xf * _PI)) ryf = 0.5 * (1.0 - COS(yf * _PI)) n1 = perlin(of AND PERLIN_SIZE) n1 = n1 + rxf * (perlin((of + 1) AND PERLIN_SIZE) - n1) n2 = perlin((of + PERLIN_YWRAP) AND PERLIN_SIZE) n2 = n2 + rxf * (perlin((of + PERLIN_YWRAP + 1) AND PERLIN_SIZE) - n2) n1 = n1 + ryf * (n2 - n1) of = of + PERLIN_ZWRAP n2 = perlin(of AND PERLIN_SIZE) n2 = n2 + rxf * (perlin((of + 1) AND PERLIN_SIZE) - n2) n3 = perlin((of + PERLIN_YWRAP) AND PERLIN_SIZE) n3 = n3 + rxf * (perlin((of + PERLIN_YWRAP + 1) AND PERLIN_SIZE) - n3) n2 = n2 + ryf * (n3 - n2) n1 = n1 + (0.5 * (1.0 - COS(zf * _PI))) * (n2 - n1) r = r + n1 * ampl ampl = ampl * perlin_amp_falloff xi = INT(xi * (2 ^ 1)) xf = xf * 2 yi = INT(yi * (2 ^ 1)) yf = yf * 2 zi = INT(zi * (2 ^ 1)) zf = zf * 2 IF xf >= 1.0 THEN xi = xi + 1: xf = xf - 1 IF yf >= 1.0 THEN yi = yi + 1: yf = yf - 1 IF zf >= 1.0 THEN zi = zi + 1: zf = zf - 1NEXTnoise! = rEND FUNCTION SUB noiseDetail (lod!, falloff!)IF lod! > 0 THEN perlin_octaves = lod!IF falloff! > 0 THEN perlin_amp_falloff = falloff!END SUB
I hope you'll enjoy it.
STxAxTIC:
Hello Ashish -
I like it. Thanks for posting! I noticed that maaaaybe the wheels have a little slip to them, and at low speeds below .8 they do some funny things. I see why you did that on purpose - no worries.
If (and for the moment, only if) the "noise" of the road is not *too* steep and crazy - kindof like the settings you are demonstrating, I might suggest calculating the rotation angle of each wheel not with velocity, but with position. I modified the code for the front wheel only to demonstrate this - you can see that it doesn't want to slip like that back one does.
To generalize the method for all kinds of curves that go upside down and stuff, that can be done too.
Anyway, compare the front and back wheels:
--- Code: QB64: ---'####################' Cars By Ashish'####################' Just for fun! :)'@KingOfCoders _TITLE "Cars" TYPE vec2 x AS SINGLE y AS SINGLEEND TYPE TYPE wheels pos AS vec2 'position vel AS vec2 'velocity acc AS vec2 'acceleration ang AS _FLOAT 'angle radius AS SINGLE 'wheel radius pos2 AS vec2END TYPE TYPE headlights pos AS vec2 switched AS _BYTE 'power as singleEND TYPE TYPE bodyFrames baseFrame AS vec2 steepFrame AS vec2 baseFrame2 AS vec2 steepFrame2 AS vec2END TYPE TYPE cars backWheel AS wheels frontWheel AS wheels headlight AS headlights body AS bodyFramesEND TYPE RANDOMIZE TIMER SCREEN _NEWIMAGE(800, 400, 32) 'noise function related variablesDIM SHARED perlin_octaves AS SINGLE, perlin_amp_falloff AS SINGLE DIM SHARED Car AS cars, white&, roadMap(800) AS vec2 FOR i = 0 TO 800 roadMap(i).x = i roadMap(i).y = noise(xoff, yoff, 0) * 40 + 363 xoff = xoff + .001 yoff = yoff + .01NEXT white& = _RGB(255, 255, 255)v = RNDCar.backWheel.pos.x = 50Car.backWheel.pos.y = 350Car.backWheel.ang = vCar.backWheel.radius = 13 Car.frontWheel.pos.x = 130Car.frontWheel.pos.y = 350Car.frontWheel.ang = vCar.frontWheel.radius = 13 Car.headlight.switched = -1 initCar Car DO drawCar Car drawMap roadMap() IF _KEYDOWN(ASC("d")) THEN Car.backWheel.acc.x = Car.backWheel.acc.x + .05 Car.frontWheel.acc.x = Car.frontWheel.acc.x + .05 END IF IF _KEYDOWN(ASC("a")) THEN Car.backWheel.acc.x = Car.backWheel.acc.x - .05 Car.frontWheel.acc.x = Car.frontWheel.acc.x - .05 END IF IF _KEYDOWN(ASC(" ")) THEN IF Car.backWheel.vel.x > 0 THEN Car.backWheel.vel.x = Car.backWheel.vel.x - .09 IF Car.backWheel.vel.x < 0 THEN Car.backWheel.vel.x = Car.backWheel.vel.x + .09 IF Car.frontWheel.vel.x > 0 THEN Car.frontWheel.vel.x = Car.frontWheel.vel.x - .09 IF Car.frontWheel.vel.x < 0 THEN Car.frontWheel.vel.x = Car.frontWheel.vel.x + .09 END IF IF _KEYDOWN(ASC("h")) THEN IF Car.headlight.switched THEN Car.headlight.switched = 0 ELSE Car.headlight.switched = -1 END IF updateCar Car _LIMIT 40 _DISPLAY CLS , 1 Car.backWheel.acc.x = 0 Car.frontWheel.acc.x = 0 IF Car.frontWheel.pos.x < 800 AND Car.backWheel.pos.x > 0 THEN Car.backWheel.pos.x = roadMap(Car.backWheel.pos2.x).x Car.backWheel.pos.y = roadMap(Car.backWheel.pos2.x).y - 13 Car.frontWheel.pos.x = roadMap(Car.frontWheel.pos2.x).x Car.frontWheel.pos.y = roadMap(Car.frontWheel.pos2.x).y - 13 END IFLOOP SUB drawMap (mapData() AS vec2)FOR i = 0 TO UBOUND(mapData) - 1 LINE (mapData(i).x, mapData(i).y)-(mapData(i + 1).x, mapData(i + 1).y), white&NEXTEND SUB SUB initCar (obj AS cars)obj.headlight.pos.x = obj.frontWheel.pos.x + 25obj.headlight.pos.y = obj.frontWheel.pos.y - 25END SUB SUB drawCar (obj AS cars)'we will draw body frames first, then, lights, followed by wheels. LINE (obj.backWheel.pos.x - 30, obj.backWheel.pos.y - 40)-(obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y - 40), white& 'up baseLINE (obj.backWheel.pos.x + obj.backWheel.radius, obj.backWheel.pos.y)-(obj.frontWheel.pos.x - obj.frontWheel.radius, obj.frontWheel.pos.y), white& 'down base '.....and some more..... little lines to cover down base.....LINE (obj.backWheel.pos.x - obj.backWheel.radius, obj.backWheel.pos.y)-(obj.backWheel.pos.x - 30, obj.backWheel.pos.y), white&LINE (obj.frontWheel.pos.x + obj.backWheel.radius, obj.frontWheel.pos.y)-(obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y), white& 'left & right of baseLINE (obj.backWheel.pos.x - 30, obj.backWheel.pos.y)-(obj.backWheel.pos.x - 30, obj.backWheel.pos.y - 40), white&LINE (obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y)-(obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y - 40), white& 'steeps LINE (obj.backWheel.pos.x - 30, obj.backWheel.pos.y - 40)-(obj.backWheel.pos.x + 5, obj.backWheel.pos.y - 70), white&LINE (obj.frontWheel.pos.x + 25, obj.frontWheel.pos.y - 40)-(obj.frontWheel.pos.x - 5, obj.frontWheel.pos.y - 70), white& 'roofLINE (obj.backWheel.pos.x + 5, obj.backWheel.pos.y - 70)-(obj.frontWheel.pos.x - 5, obj.frontWheel.pos.y - 70), white& 'divider, to form window glasses'line (obj.backWheel.pos.y - 70)-(obj.) 'lights, x = cos0*r + xx, cos0 = x - xx / rIF obj.headlight.switched THEN FOR i = 1 TO 150 h = map(i, 1, 150, 3, 30) a = map(i, 1, 100, 200, 0) LINE (obj.headlight.pos.x + i, obj.headlight.pos.y - h)-(obj.headlight.pos.x + i, obj.headlight.pos.y + h), _RGBA(255, 255, 255, a) NEXTEND IF'tyresCIRCLE (obj.backWheel.pos.x, obj.backWheel.pos.y), obj.backWheel.radius, white&CIRCLE (obj.frontWheel.pos.x, obj.frontWheel.pos.y), obj.frontWheel.radius, white& LINE (COS(obj.backWheel.ang) * obj.backWheel.radius + obj.backWheel.pos.x, SIN(obj.backWheel.ang) * obj.backWheel.radius + obj.backWheel.pos.y)-(COS(obj.backWheel.ang + _PI) * obj.backWheel.radius + obj.backWheel.pos.x, SIN(obj.backWheel.ang + _PI) * obj.backWheel.radius + obj.backWheel.pos.y), white&LINE (COS(obj.frontWheel.ang) * obj.frontWheel.radius + obj.frontWheel.pos.x, SIN(obj.frontWheel.ang) * obj.frontWheel.radius + obj.frontWheel.pos.y)-(COS(obj.frontWheel.ang + _PI) * obj.frontWheel.radius + obj.frontWheel.pos.x, SIN(obj.frontWheel.ang + _PI) * obj.frontWheel.radius + obj.frontWheel.pos.y), white& END SUB SUB updateCar (obj AS cars)obj.backWheel.pos.x = obj.backWheel.pos.x + obj.backWheel.vel.xobj.backWheel.pos.y = obj.backWheel.pos.y + obj.backWheel.vel.y IF obj.backWheel.vel.x > 0 THEN obj.backWheel.vel.x = obj.backWheel.vel.x - .01IF obj.backWheel.vel.x < 0 THEN obj.backWheel.vel.x = obj.backWheel.vel.x + .01 obj.frontWheel.pos.x = obj.frontWheel.pos.x + obj.frontWheel.vel.xobj.frontWheel.pos.y = obj.frontWheel.pos.y + obj.frontWheel.vel.y IF obj.frontWheel.vel.x > 0 THEN obj.frontWheel.vel.x = obj.frontWheel.vel.x - .01IF obj.frontWheel.vel.x < 0 THEN obj.frontWheel.vel.x = obj.frontWheel.vel.x + .01 obj.backWheel.vel.x = obj.backWheel.vel.x + obj.backWheel.acc.xobj.backWheel.vel.y = obj.backWheel.vel.y + obj.backWheel.acc.y obj.frontWheel.vel.x = obj.frontWheel.vel.x + obj.frontWheel.acc.xobj.frontWheel.vel.y = obj.frontWheel.vel.y + obj.frontWheel.acc.y IF ABS(obj.backWheel.vel.x) > .8 THEN IF obj.backWheel.vel.x <> 0 THEN obj.backWheel.ang = obj.backWheel.ang + obj.backWheel.vel.x * 0.077END IF IF ABS(obj.frontWheel.vel.x) > 0 THEN IF obj.frontWheel.vel.x <> 0 THEN obj.frontWheel.ang = obj.frontWheel.pos.x / Car.frontWheel.radiusEND IFobj.headlight.pos.x = obj.frontWheel.pos.x + 25obj.headlight.pos.y = obj.frontWheel.pos.y - 25 obj.backWheel.pos2.x = INT(obj.backWheel.pos.x)obj.backWheel.pos2.y = INT(obj.backWheel.pos.y) obj.frontWheel.pos2.x = INT(obj.frontWheel.pos.x)obj.frontWheel.pos2.y = INT(obj.frontWheel.pos.y)END SUB FUNCTION map! (value!, minRange!, maxRange!, newMinRange!, newMaxRange!)map! = ((value! - minRange!) / (maxRange! - minRange!)) * (newMaxRange! - newMinRange!) + newMinRange!END FUNCTION FUNCTION dist! (x1!, y1!, x2!, y2!)dist! = SQR((x2! - x1!) ^ 2 + (y2! - y1!) ^ 2)END FUNCTION FUNCTION noise! (x AS SINGLE, y AS SINGLE, z AS SINGLE)STATIC p5NoiseSetup AS _BYTESTATIC perlin() AS SINGLESTATIC PERLIN_YWRAPB AS SINGLE, PERLIN_YWRAP AS SINGLESTATIC PERLIN_ZWRAPB AS SINGLE, PERLIN_ZWRAP AS SINGLESTATIC PERLIN_SIZE AS SINGLE IF NOT p5NoiseSetup THEN p5NoiseSetup = -1 PERLIN_YWRAPB = 4 PERLIN_YWRAP = INT(1 * (2 ^ PERLIN_YWRAPB)) PERLIN_ZWRAPB = 8 PERLIN_ZWRAP = INT(1 * (2 ^ PERLIN_ZWRAPB)) PERLIN_SIZE = 4095 perlin_octaves = 4 perlin_amp_falloff = 0.5 REDIM perlin(PERLIN_SIZE + 1) AS SINGLE DIM i AS SINGLE FOR i = 0 TO PERLIN_SIZE + 1 perlin(i) = RND NEXTEND IF x = ABS(x)y = ABS(y)z = ABS(z) DIM xi AS SINGLE, yi AS SINGLE, zi AS SINGLExi = INT(x)yi = INT(y)zi = INT(z) DIM xf AS SINGLE, yf AS SINGLE, zf AS SINGLExf = x - xiyf = y - yizf = z - zi DIM r AS SINGLE, ampl AS SINGLE, o AS SINGLEr = 0ampl = .5 FOR o = 1 TO perlin_octaves DIM of AS SINGLE, rxf AS SINGLE DIM ryf AS SINGLE, n1 AS SINGLE, n2 AS SINGLE, n3 AS SINGLE of = xi + INT(yi * (2 ^ PERLIN_YWRAPB)) + INT(zi * (2 ^ PERLIN_ZWRAPB)) rxf = 0.5 * (1.0 - COS(xf * _PI)) ryf = 0.5 * (1.0 - COS(yf * _PI)) n1 = perlin(of AND PERLIN_SIZE) n1 = n1 + rxf * (perlin((of + 1) AND PERLIN_SIZE) - n1) n2 = perlin((of + PERLIN_YWRAP) AND PERLIN_SIZE) n2 = n2 + rxf * (perlin((of + PERLIN_YWRAP + 1) AND PERLIN_SIZE) - n2) n1 = n1 + ryf * (n2 - n1) of = of + PERLIN_ZWRAP n2 = perlin(of AND PERLIN_SIZE) n2 = n2 + rxf * (perlin((of + 1) AND PERLIN_SIZE) - n2) n3 = perlin((of + PERLIN_YWRAP) AND PERLIN_SIZE) n3 = n3 + rxf * (perlin((of + PERLIN_YWRAP + 1) AND PERLIN_SIZE) - n3) n2 = n2 + ryf * (n3 - n2) n1 = n1 + (0.5 * (1.0 - COS(zf * _PI))) * (n2 - n1) r = r + n1 * ampl ampl = ampl * perlin_amp_falloff xi = INT(xi * (2 ^ 1)) xf = xf * 2 yi = INT(yi * (2 ^ 1)) yf = yf * 2 zi = INT(zi * (2 ^ 1)) zf = zf * 2 IF xf >= 1.0 THEN xi = xi + 1: xf = xf - 1 IF yf >= 1.0 THEN yi = yi + 1: yf = yf - 1 IF zf >= 1.0 THEN zi = zi + 1: zf = zf - 1NEXTnoise! = rEND FUNCTION SUB noiseDetail (lod!, falloff!)IF lod! > 0 THEN perlin_octaves = lod!IF falloff! > 0 THEN perlin_amp_falloff = falloff!END SUB
FellippeHeitor:
That works really well! Good job there, Ashish!
It's a bit hard to turn on/off the lights, as they flicker if you hold "h" a little longer.
Nice how the brakes aren't the hard-artificial type I was expecting, but a more natural "slow it down" thing.
Fellippe.
Petr:
Super job, Ashish. Thank for the link! We all here are newbie :-D
i upgrade your 3 lines of code (line 94, 95, 96) for better light switching. Is the same case as in my QB64Player:
--- Code: QB64: --- IF _KEYDOWN(ASC("h")) AND TIMER > t THEN IF Car.headlight.switched THEN Car.headlight.switched = 0: t = TIMER + .2 ELSE Car.headlight.switched = -1: t = TIMER + .2 END IF
Ashish:
@STxAxTIC
I like your modification. I was stuck at that problem and I was unable to calculate the rotation of the wheel. So, I used it to rotate with velocity ( which was not accurate!).
By the way, on the line 191, it should be
--- Code: QB64: --- IF obj.frontWheel.vel.x <> 0 THEN obj.frontWheel.ang = obj.frontWheel.pos.x / obj.frontWheel.radius
instead of
--- Code: QB64: --- IF obj.frontWheel.vel.x <> 0 THEN obj.frontWheel.ang = obj.frontWheel.pos.x / Car.frontWheel.radius
right? :)
@FellippeHeitor
Thank you. :)
@Petr
Thank you. :)
Navigation
[0] Message Index
[#] Next page
Go to full version