   [SOLVED] Physics 2D drag problem
  Hi, I'm having difficulties with drag.My coefficients are set to:k1=.5k2=.5My equation to integrate the drag looks like this:   drag=(k1*accAccumX)+(k2*(accAccumX*accAccumX));   grandVelX=accAccumX*(-drag);The problem is that I am getting crazy results... i.e. the player goes really fast in the opposite direction I move him.Any idea what I am doing wrong?Thanks,JamesPS. I've taken mass out of the equation until I get the system to the point where everything works.[Edited by - NotTheCommonDose on June 22, 2009 7:10:35 PM]
  Ah, I made that error once too :-) I assume that accAccumX is either a vector or the vertical part of a vector - in other words it can have both negative and positive value! The trouble lies here: (accAccumX*accAccumX) since + * + and - * - is always positive, your drag will work in the same direction no matter how the body moves. All you need to do is say (accAccumX*abs(accAccumX)), making sure one of the terms is always positive. Then your drag will work in the opposite way of the body's movement.Cheers,Mike   ;  I'm starting to get the feeling that setting a maximum velocity as a result of drag isn't going to be simple.   ;  Whoops, didn't see your answer. I think that might do it!PS. you've been a lot of help :D   ;  By Jove, I think I've got it! Since it's a force I need to add it not multiply it to the acceleration.The correct code looks like this:   k1=.09;   k2=.01;   drag=(k1*accAccumX)+(k2*(accAccumX*Math.abs(accAccumX)));   accAccumX+=(-drag);   grandVelX=accAccumX;Again, thanks! I would have still been stuck on direction otherwise.James   ;  Glad you got it working. That math.abs() thing had me ripping my hair out too :-)Here's what my drag equation looks like. It works on force-level and only depends on an air friction coefficient, particle area, and particle velocity squared. Force += -AirFriction*Area*Velocity*Abs(Velocity)Cheers,Mike   ;Quote:Original post by NotTheCommonDoseI'm starting to get the feeling that setting a maximum velocity as a result of drag isn't going to be simple.It's not simple but not too hard either:Write the equations of motion:F = a - k*v;v = integral(F)=>a - k*v = dv/dt;Or as a diff equation:dv/(a - kv) = k*dtThus you get v = vmax*(1 - exp(-k*t))You want v ~= vmax (equal to some degree) => 0.99vmax = vmax(1-exp(-k*t)) for some t you want: Solve for k to get the constant that will give you a certain maximum velocity, reached within the required time. From here