Search in sources :

Example 6 with Body2D

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);
    }
}
Also used : ParticleGroupDef(spacegraph.space2d.phys.particle.ParticleGroupDef) PolygonShape(spacegraph.space2d.phys.collision.shapes.PolygonShape) CircleShape(spacegraph.space2d.phys.collision.shapes.CircleShape) spacegraph.util.math.v2(spacegraph.util.math.v2) BodyDef(spacegraph.space2d.phys.dynamics.BodyDef) Body2D(spacegraph.space2d.phys.dynamics.Body2D)

Example 7 with Body2D

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);
}
Also used : FixtureDef(spacegraph.space2d.phys.dynamics.FixtureDef) Body2D(spacegraph.space2d.phys.dynamics.Body2D)

Example 8 with Body2D

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;
            }
        }
    }
}
Also used : Tuple2f(spacegraph.util.math.Tuple2f) Body2D(spacegraph.space2d.phys.dynamics.Body2D)

Example 9 with Body2D

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;
        }
    }
}
Also used : Tuple2f(spacegraph.util.math.Tuple2f) Body2D(spacegraph.space2d.phys.dynamics.Body2D)

Example 10 with Body2D

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;
    }
}
Also used : Tuple2f(spacegraph.util.math.Tuple2f) Body2D(spacegraph.space2d.phys.dynamics.Body2D)

Aggregations

Body2D (spacegraph.space2d.phys.dynamics.Body2D)14 Tuple2f (spacegraph.util.math.Tuple2f)6 Shape (spacegraph.space2d.phys.collision.shapes.Shape)3 ManifoldPoint (spacegraph.space2d.phys.collision.ManifoldPoint)2 CircleShape (spacegraph.space2d.phys.collision.shapes.CircleShape)2 PolygonShape (spacegraph.space2d.phys.collision.shapes.PolygonShape)2 BodyDef (spacegraph.space2d.phys.dynamics.BodyDef)2 Fixture (spacegraph.space2d.phys.dynamics.Fixture)2 ParticleGroupDef (spacegraph.space2d.phys.particle.ParticleGroupDef)2 spacegraph.util.math.v2 (spacegraph.util.math.v2)2 Random (java.util.Random)1 Loop (jcog.exe.Loop)1 HaiQae (jcog.learn.ql.HaiQae)1 FloatRange (jcog.math.FloatRange)1 XoRoShiRo128PlusRandom (jcog.math.random.XoRoShiRo128PlusRandom)1 Tensor (jcog.math.tensor.Tensor)1 TensorLERP (jcog.math.tensor.TensorLERP)1 SpaceGraph (spacegraph.SpaceGraph)1 Gridding (spacegraph.space2d.container.Gridding)1 VERTICAL (spacegraph.space2d.container.Gridding.VERTICAL)1