Active Forums > QB64 Discussion

Car : Physics Test

(1/2) > >>

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