Hi,
what can be the formula of air friction?
we say that i have 2 value
vel = velocity (vector)
friction = 0.01
the friction must increase as the velocity increase …
thanks
Hi,
what can be the formula of air friction?
we say that i have 2 value
vel = velocity (vector)
friction = 0.01
the friction must increase as the velocity increase …
thanks
You could just take the air friction as a percentage of the velocity. so
friction = vel * 0.05
just makes friction 5 percent of the velocity. This is the most simple solution I can think of, but I’m sure its possible to model realistic air friction, but that would take some research and googling on your part. You would have to take into account the size of an object, the air temperature, altitude … but that would only be required if your doing some highly realistic simulations. maybe you are???
As a rule of thumb, the effects of air resistance are proportional to the velocity squared, i.e.,
friction = velocity * velocity * DRAG_COEFFICIENT
where DRAG_COEFFICIENT is a predefined constant.
Look up “Drag equation” on Wikipedia for more details.
yes klauser ,good idea, for that i open a TD, i have a formula but much more complicated … too complicated
calculating a friction as “percentage” to substract is very easy
def m(cont):
own = cont.owner
vel = own.worldLinearVelocity
friction = 0.05 * vel
vel -= friction
Or,
velocity = own.worldLinearVelocity * 0.95
uhm…
i have the suspect that is too easy
the percentage not should increase also ?
something as :
1 m/s : friction = 0.0000000001 (almost nothing)
100 m/s friction = 0.08
or not?
It should, after all checking a drag equation through fluids, one can see the velocity of the object as a factor.
When you’re next in a car, hold your hand out the window. The faster you go, the more force you feel on your hand.
in python syntax?
is correct?
import bge
def m(cont):
own = cont.owner
vel = own.worldLinearVelocity
mag = vel.magnitude
friction = vel*mag*0.005
vel -= friction
vel*mag == vel
because
vel is a vector of size mag
Myself I would just invert the velocity vector, scale it down a little, and apply a force based on it. That would let bullet do the work of how much it will impact the actual motion.
vel is not normalized!
vel*mag == vel.normalized()magmag
PS: i make a bit of mix because >> vector * vector = float …instead better keep the vector
You are right, this is indeed true.
But wouldn’t that
[QUOTE=Monster;2216656]You are right, this is indeed true.
Edit: never mind
under 1 not happen nothing of wrong
maybe with high number can be a bit strange (but maybe is right)
return the velocity after calculating the friction…(only with float)
def friction( vel ) :
return vel - vel * vel * 0.005
>>> friction(0.1)
0.09995000000000001
>>> friction(5)
4.875
>>> friction(10)
9.5
>>> friction(50)
37.5
>>> friction(150)
37.5
>>> friction(200)
0.0
>>> friction(300)
-150.0
if the velocity magnitude is more than 400 become crazy…
>>> friction(401)
-403.005
(max speed and gravity = terminal velocity) + additional force
whereby friction & drag depending on atmosphere thickness.
however speed in a vacuum are possibly infinite.
Hi
Basic formula
p = 1.22 # air density at sea level kg/m3
a = 0.31415 # area(m2) of 5 cm radius sphere /cannon ball
Cd = 0.47 # drag coefficient for sphere
v = 12.0 # velocity ms
Drag = 0.5 * p * v**2 * a * Cd
If area and Cd are not changing, meaning the attitude towards motion is not changing or object is a shpere and also if altitude is constant, then the p * a * Cd * 0.5 can pre calculate in initial phase and main loop code will be very simple.
Drag = 0.09006 * v**2
I’m wrong or with this formula the “limit” of speed is 12 m/s ?
if the speed is > 12 m/s the drag > of velocity (bounce backward)
more or less in a medium gun (i read this) a bullet start with 300 m/s and tounch the ground after 2 km
The v is just a variable for your dynamic object forward axis velocity.
Hi
I made a test script for the b263+, which is calculating sphere’s drag per local axes.
import bge
cont = bge.logic.getCurrentController()
own = cont.owner
def drag(v): # cal drag with preset value
try:
return v**2 * -0.090066805 * (v/abs(v))
except ZeroDivisionError:
return 0.0
# get local velocities
v = own.localLinearVelocity
# apply local linear forces
own.applyForce([drag((v[0]), drag(v[1]), drag(v[2])], 1)
OK
this last work subdividing the constant number by 60
0.09 / 60
a obj-bullet shot at 300 m/s (45° of angle) fall about at 1.2 km