Buoyancy
Blitz3D Forums/Blitz3D Beginners Area/Buoyancy
| ||
Alright so I've been working on this for a bit and decided its time to come on here. Basically I have a cube, and a plane of "water", I want the cube to go underwater a little bit, come up, then go back under, in smaller and smaller amounts, untill finally it stops. Like a boat in water, Im trying to make it buoyant. So I got the Cube to bounce up and down, by simply applying, with some gravity. If CUBEY#<WATERLEVEL TranslateEntity CUBE,0,-(GRAVITY*DENSITY*CUBEVOLUME),0 endif That makes it bounce, but it never Stops. So how would you go about making an object "Stop" bouncing eventaully? |
| ||
I'm not an expert on 3d programming, but I'm pretty sure that if you make a variable to keep track of the amount of times the cube bobs up and down, you should be able to stop it from bobbing after a certain amount of time. Like this: ----------------------------------------------------------------------------- bob=5 if bob>=1 then [insert bobbing code here] bob=bob-1 end if |
| ||
Thanks, thats what I thought too. But I was trying it earlier, no luck, I could get it to stop, but it wouldn't do it gradually and smoothly. |
| ||
The cube should settle automatically - you just need to make sure that when in water it's upwards acceleration / force ( bouyancy ) is slightly higher than it's downwards acceleraton / force ( gravity ).const TIMESTEP# = .005 const Gravity# = 9.8 global Bouyancy# = 10.2 [loop] Acceleration = Acceleration - Gravity If entityy( CUBE ) < WATERLEVEL Acceleration = Acceleration + Bouyancy endif translateentity CUBE, 0, Acceleration * TIMESTEP, 0 [loop] Just vary the bouyancy factor to have objects surface quicker or slower etc.. Having it stop after a set amount of iterations won't look very good imo. Stevie |
| ||
If CUBEY#<WATERLEVEL TranslateEntity CUBE,0,-(GRAVITY*DENSITY*CUBEVOLUME),0 endif You need something to reduce the bob, which is why it goes forever. I would have done it something like: 'if entity is not in the water set: TimeFromfirstHit#=1.0 'else if entity is in the water, for each loop/timeperiod set: TimeFromfirstHit#=TimeFromfirstHit#*0.8 '(the closer to 1.0 the slower to stop bobbing) if TimeFromfirstHit#<0.0001 TimeFromfirstHit#=0.0 '<-infinity catcher TranslateEntity CUBE,0, -(GRAVITY*DENSITY*CUBEVOLUME)*TimeFromfirstHit#,0 Stevies way above looks good too. |
| ||
I would use sin/cos that is multiplied by a decreasing energy value "e". Additionally the sinus index "a" may increase/loop faster and faster (like in a rubber relaxing effect).aspeed#=1.0 e#=2.0 while e>0.1 a#=(a + aspeed) mod 359 aspeed=aspeed*1.01 e=e*0.975 positionentity cube,0,sin(a)*e,0 renderworld() flip wend |