use of spacegraph.space2d.phys.dynamics.Body2D in project narchy by automenta.
the class ParticlesTest method init.
@Override
public void init(Dynamics2D m_world) {
// first one
Body2D ground = m_world.bodies().iterator().next();
{
PolygonShape shape = new PolygonShape();
v2[] vertices = new v2[] { new v2(-40, -10), new v2(40, -10), new v2(40, 0), new v2(-40, 0) };
shape.set(vertices, 4);
ground.addFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
v2[] vertices = { new v2(-40, -1), new v2(-20, -1), new v2(-20, 20), new v2(-40, 30) };
shape.set(vertices, 4);
ground.addFixture(shape, 0.0f);
}
{
PolygonShape shape = new PolygonShape();
v2[] vertices = { new v2(20, -1), new v2(40, -1), new v2(40, 30), new v2(20, 20) };
shape.set(vertices, 4);
ground.addFixture(shape, 0.0f);
}
m_world.setParticleRadius(0.35f);
m_world.setParticleDamping(0.2f);
{
CircleShape shape = new CircleShape();
shape.center.set(0, 30);
shape.radius = 20;
ParticleGroupDef pd = new ParticleGroupDef();
pd.flags = ParticleType.b2_waterParticle;
pd.shape = shape;
m_world.addParticles(pd);
}
{
BodyDef bd = new BodyDef();
bd.type = BodyType.DYNAMIC;
Body2D body = m_world.addBody(bd);
CircleShape shape = new CircleShape();
shape.center.set(0, 80);
shape.radius = 5;
body.addFixture(shape, 0.5f);
}
}
use of spacegraph.space2d.phys.dynamics.Body2D in project narchy by automenta.
the class Racer method addObstacle.
private void addObstacle(final float pX, final float pY) {
// final Sprite box = new Sprite(pX, pY, OBSTACLE_SIZE, OBSTACLE_SIZE, this.mBoxTextureRegion, this.getVertexBufferObjectManager());
final FixtureDef boxFixtureDef = new FixtureDef(PolygonShape.box(pX, pY), 0.1f, 0.5f);
boxFixtureDef.restitution = 0.5f;
// PhysicsFactory.createBoxBody(this.mPhysicsWorld, box, BodyType.DynamicBody, boxFixtureDef);
final Body2D boxBody = mPhysicsWorld.addDynamic(boxFixtureDef);
boxBody.setLinearDamping(10);
boxBody.setAngularDamping(10);
// this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(box, boxBody, true, true));
// this.mScene.attachChild(box);
}
use of spacegraph.space2d.phys.dynamics.Body2D in project narchy by automenta.
the class ParticleSystem method solvePowder.
void solvePowder(final TimeStep step) {
float powderStrength = m_powderStrength * getCriticalVelocity(step);
float minWeight = 1.0f - Settings.particleStride;
for (int k = 0; k < m_bodyContactCount; k++) {
final ParticleBodyContact contact = m_bodyContactBuffer[k];
int a = contact.index;
if ((m_flagsBuffer.data[a] & ParticleType.b2_powderParticle) != 0) {
float w = contact.weight;
if (w > minWeight) {
Body2D b = contact.body;
float m = contact.mass;
Tuple2f p = m_positionBuffer.data[a];
Tuple2f n = contact.normal;
final Tuple2f f = tempVec;
final Tuple2f va = m_velocityBuffer.data[a];
final float inter = powderStrength * m * (w - minWeight);
final float pInvMass = getParticleInvMass();
f.x = inter * n.x;
f.y = inter * n.y;
va.x -= pInvMass * f.x;
va.y -= pInvMass * f.y;
b.applyLinearImpulse(f, p, true);
}
}
}
for (int k = 0; k < m_contactCount; k++) {
final ParticleContact contact = m_contactBuffer[k];
if ((contact.flags & ParticleType.b2_powderParticle) != 0) {
float w = contact.weight;
if (w > minWeight) {
int a = contact.indexA;
int b = contact.indexB;
Tuple2f n = contact.normal;
final Tuple2f va = m_velocityBuffer.data[a];
final Tuple2f vb = m_velocityBuffer.data[b];
final float inter = powderStrength * (w - minWeight);
final float fx = inter * n.x;
final float fy = inter * n.y;
va.x -= fx;
va.y -= fy;
vb.x += fx;
vb.y += fy;
}
}
}
}
use of spacegraph.space2d.phys.dynamics.Body2D in project narchy by automenta.
the class ParticleSystem method solveDamping.
void solveDamping(TimeStep step) {
// reduces normal velocity of each contact
float damping = m_dampingStrength;
for (int k = 0; k < m_bodyContactCount; k++) {
final ParticleBodyContact contact = m_bodyContactBuffer[k];
int a = contact.index;
Body2D b = contact.body;
float w = contact.weight;
float m = contact.mass;
Tuple2f n = contact.normal;
Tuple2f p = m_positionBuffer.data[a];
final float tempX = p.x - b.sweep.c.x;
final float tempY = p.y - b.sweep.c.y;
final Tuple2f velA = m_velocityBuffer.data[a];
// getLinearVelocityFromWorldPointToOut, with -= velA
float vx = -b.velAngular * tempY + b.vel.x - velA.x;
float vy = b.velAngular * tempX + b.vel.y - velA.y;
// done
float vn = vx * n.x + vy * n.y;
if (vn < 0) {
final Tuple2f f = tempVec;
f.x = damping * w * m * vn * n.x;
f.y = damping * w * m * vn * n.y;
final float invMass = getParticleInvMass();
velA.x += invMass * f.x;
velA.y += invMass * f.y;
f.x = -f.x;
f.y = -f.y;
b.applyLinearImpulse(f, p, true);
}
}
for (int k = 0; k < m_contactCount; k++) {
final ParticleContact contact = m_contactBuffer[k];
int a = contact.indexA;
int b = contact.indexB;
float w = contact.weight;
Tuple2f n = contact.normal;
final Tuple2f velA = m_velocityBuffer.data[a];
final Tuple2f velB = m_velocityBuffer.data[b];
final float vx = velB.x - velA.x;
final float vy = velB.y - velA.y;
float vn = vx * n.x + vy * n.y;
if (vn < 0) {
float fx = damping * w * vn * n.x;
float fy = damping * w * vn * n.y;
velA.x += fx;
velA.y += fy;
velB.x -= fx;
velB.y -= fy;
}
}
}
use of spacegraph.space2d.phys.dynamics.Body2D in project narchy by automenta.
the class ParticleSystem method solvePressure.
void solvePressure(TimeStep step) {
// that means dimensionless density
for (int i = 0; i < m_count; i++) {
m_accumulationBuffer[i] = 0;
}
for (int k = 0; k < m_bodyContactCount; k++) {
ParticleBodyContact contact = m_bodyContactBuffer[k];
int a = contact.index;
float w = contact.weight;
m_accumulationBuffer[a] += w;
}
for (int k = 0; k < m_contactCount; k++) {
ParticleContact contact = m_contactBuffer[k];
int a = contact.indexA;
int b = contact.indexB;
float w = contact.weight;
m_accumulationBuffer[a] += w;
m_accumulationBuffer[b] += w;
}
// ignores powder particles
if ((m_allParticleFlags & k_noPressureFlags) != 0) {
for (int i = 0; i < m_count; i++) {
if ((m_flagsBuffer.data[i] & k_noPressureFlags) != 0) {
m_accumulationBuffer[i] = 0;
}
}
}
// calculates pressure as a linear function of density
float pressurePerWeight = m_pressureStrength * getCriticalPressure(step);
for (int i = 0; i < m_count; i++) {
float w = m_accumulationBuffer[i];
float h = pressurePerWeight * MathUtils.max(0.0f, MathUtils.min(w, Settings.maxParticleWeight) - Settings.minParticleWeight);
m_accumulationBuffer[i] = h;
}
// applies pressure between each particles in contact
float velocityPerPressure = step.dt / (m_density * m_particleDiameter);
for (int k = 0; k < m_bodyContactCount; k++) {
ParticleBodyContact contact = m_bodyContactBuffer[k];
int a = contact.index;
Body2D b = contact.body;
float w = contact.weight;
float m = contact.mass;
Tuple2f n = contact.normal;
Tuple2f p = m_positionBuffer.data[a];
float h = m_accumulationBuffer[a] + pressurePerWeight * w;
final Tuple2f f = tempVec;
final float coef = velocityPerPressure * w * m * h;
f.x = coef * n.x;
f.y = coef * n.y;
final Tuple2f velData = m_velocityBuffer.data[a];
final float particleInvMass = getParticleInvMass();
velData.x -= particleInvMass * f.x;
velData.y -= particleInvMass * f.y;
b.applyLinearImpulse(f, p, true);
}
for (int k = 0; k < m_contactCount; k++) {
ParticleContact contact = m_contactBuffer[k];
int a = contact.indexA;
int b = contact.indexB;
float w = contact.weight;
Tuple2f n = contact.normal;
float h = m_accumulationBuffer[a] + m_accumulationBuffer[b];
final float fx = velocityPerPressure * w * h * n.x;
final float fy = velocityPerPressure * w * h * n.y;
final Tuple2f velDataA = m_velocityBuffer.data[a];
final Tuple2f velDataB = m_velocityBuffer.data[b];
velDataA.x -= fx;
velDataA.y -= fy;
velDataB.x += fx;
velDataB.y += fy;
}
}
Aggregations