示例#1
0
文件: fireworks.cpp 项目: avu/physics
    /**
     * Creates a new firework of this type and writes it into the given
     * instance. The optional parent firework is used to base position
     * and velocity on.
     */
    void create(Firework *firework, const Firework *parent = NULL) const
    {
        firework->type = type;
        firework->age = crandom.randomReal(minAge, maxAge);

        cyclone::Vector3 vel;
        if (parent) {
            // The position and velocity are based on the parent.
            firework->setPosition(parent->getPosition());
            vel += parent->getVelocity();
        }
        else
        {
            cyclone::Vector3 start;
            int x = (int)crandom.randomInt(3) - 1;
            start.x = 5.0f * cyclone::real(x);
            firework->setPosition(start);
        }

        vel += crandom.randomVector(minVelocity, maxVelocity);
        firework->setVelocity(vel);

        // We use a mass of one in all cases (no point having fireworks
        // with different masses, since they are only under the influence
        // of gravity).
        firework->setMass(1);

        firework->setDamping(damping);

        firework->setAcceleration(cyclone::Vector3::GRAVITY);

        firework->clearAccumulator();
    }
示例#2
0
void RagdollDemo::reset()
{
    bones[0].setState(
        cyclone::Vector3(0, 0.993, -0.5),
        cyclone::Vector3(0.301, 1.0, 0.234));
    bones[1].setState(
        cyclone::Vector3(0, 3.159, -0.56),
        cyclone::Vector3(0.301, 1.0, 0.234));
    bones[2].setState(
        cyclone::Vector3(0, 0.993, 0.5),
        cyclone::Vector3(0.301, 1.0, 0.234));
    bones[3].setState(
        cyclone::Vector3(0, 3.15, 0.56),
        cyclone::Vector3(0.301, 1.0, 0.234));
    bones[4].setState(
        cyclone::Vector3(-0.054, 4.683, 0.013),
        cyclone::Vector3(0.415, 0.392, 0.690));
    bones[5].setState(
        cyclone::Vector3(0.043, 5.603, 0.013),
        cyclone::Vector3(0.301, 0.367, 0.693));
    bones[6].setState(
        cyclone::Vector3(0, 6.485, 0.013),
        cyclone::Vector3(0.435, 0.367, 0.786));
    bones[7].setState(
        cyclone::Vector3(0, 7.759, 0.013),
        cyclone::Vector3(0.45, 0.598, 0.421));
    bones[8].setState(
        cyclone::Vector3(0, 5.946, -1.066),
        cyclone::Vector3(0.267, 0.888, 0.207));
    bones[9].setState(
        cyclone::Vector3(0, 4.024, -1.066),
        cyclone::Vector3(0.267, 0.888, 0.207));
    bones[10].setState(
        cyclone::Vector3(0, 5.946, 1.066),
        cyclone::Vector3(0.267, 0.888, 0.207));
    bones[11].setState(
        cyclone::Vector3(0, 4.024, 1.066),
        cyclone::Vector3(0.267, 0.888, 0.207));

    cyclone::real strength = -random.randomReal(500.0f, 1000.0f);
    for (unsigned i = 0; i < NUM_BONES; i++)
    {
        bones[i].body->addForceAtBodyPoint(
            cyclone::Vector3(strength, 0, 0), cyclone::Vector3()
            );
    }
    bones[6].body->addForceAtBodyPoint(
        cyclone::Vector3(strength, 0, random.randomBinomial(1000.0f)),
        cyclone::Vector3(random.randomBinomial(4.0f), random.randomBinomial(3.0f), 0)
        );

    // Reset the contacts
    cData.contactCount = 0;
}
示例#3
0
文件: sailboat.cpp 项目: avu/physics
void SailboatDemo::update()
{
    // Find the duration of the last frame in seconds
    float duration = (float)TimingData::get().lastFrameDuration * 0.001f;
    if (duration <= 0.0f) return;

    // Start with no forces or acceleration.
    sailboat.clearAccumulators();

    // Add the forces acting on the boat.
    registry.updateForces(duration);

    // Update the boat's physics.
    sailboat.integrate(duration);

    // Change the wind speed.
    windspeed = windspeed * 0.9f + r.randomXZVector(1.0f);

    Application::update();
}