I’m generating particles and applying a LinearSinkForce with 1/r^2 falloff to them, but the system isn’t stable; the orbits diverge. Every lap the radius gets bigger and bigger. Is there something I can do to prevent this, or do I need a different physics engine?
A is the vector specifying where particles are created, vel is their launch velocity, GM is the field constant.
A = orbital_mechanics.latlong(lat1,long1,earthradius)
vel, GM = orbital_mechanics.getGPSLaunch(lat1,long1,lat2,long2,earthradius,elevation,time,0.00001)
p = ParticleEffect()
p.reset()
p.setPos(0.000, 0.000, 0.000)
p.setHpr(0.000, 0.000, 0.000)
p.setScale(1.000, 1.000, 1.000)
p0 = Particles('kepler-ballistics')
# Particles parameters
p0.setFactory("PointParticleFactory")
p0.setRenderer("LineParticleRenderer")
p0.setEmitter("PointEmitter")
p0.setPoolSize(2048)
p0.setBirthRate(10.00100) # Period, not rate
p0.setLitterSize(1)
p0.setLitterSpread(0)
p0.setSystemLifespan(0.0000)
p0.setLocalVelocityFlag(1)
p0.setSystemGrowsOlderFlag(0)
# Factory parameters
p0.factory.setLifespanBase(10.0) # Ballistic particles' lifetime
p0.factory.setLifespanSpread(0.0000)
p0.factory.setMassBase(1.0000)
p0.factory.setMassSpread(0.0000)
p0.factory.setTerminalVelocityBase(4000.0000)
p0.factory.setTerminalVelocitySpread(0.0000)
# Point factory parameters
# Renderer parameters
#p0.renderer.setAlphaMode(BaseParticleRenderer.PRALPHAINOUT)
p0.renderer.setUserAlpha(1.00)
# Line parameters
p0.renderer.setHeadColor(Vec4(0.20, 0.70, 1.00, 1.00))
p0.renderer.setTailColor(Vec4(0.20, 0.25, 0.50, 1.00))
p0.renderer.setLineScaleFactor(2.00)
# Emitter parameters
p0.emitter.setEmissionType(BaseParticleEmitter.ETEXPLICIT)
p0.emitter.setAmplitude(1.0000)
p0.emitter.setAmplitudeSpread(0.0000)
p0.emitter.setOffsetForce(Vec3(0.0000, 0.0000, 0.0000))
print(vel.getX())
print(vel.getY())
print(vel.getZ())
p0.emitter.setExplicitLaunchVector(Vec3F(vel.getX(),vel.getY(),vel.getZ())) # Launch trajectory
#p0.emitter.setExplicitLaunchVector(Vec3F(0.10,0.10,0.10))
#p0.emitter.setRadiateOrigin(Point3(0.0000, 0.0000, 0.0000))
#p0.emitter.setRadiateOrigin(Point3(A.getX(), A.getY(), A.getZ()))
# Point parameters
p0.emitter.setLocation(Point3(A.getX(), A.getY(), A.getZ()))
p.addParticles(p0)
f0 = ForceGroup('gravsink')
# Force parameters
force0 = LinearSinkForce(Point3(0.0000, 0.0000, 0.0000), LinearDistanceForce.FTONEOVERRSQUARED, 1.0000, GM, 0)
#force0.setVectorMasks(1, 1, 1)
force0.setActive(1)
f0.addForce(force0)
p.addForceGroup(f0)
return p