示例#1
0
//-----------------------------------------------------------------------
void PUGeometryRotator::initParticleForEmission(PUParticle3D* particle)
{
    //// Only continue if the particle is a visual particle
    //if (particle->particleType != Particle::PT_VISUAL)
    //	return;
    //for (auto iter : _particleSystem->getParticlePool().getActiveParticleList())
    {
        //PUParticle3D *particle = static_cast<PUParticle3D*>(iter);
        if (!_rotationAxisSet)
        {
            // Set initial random rotation axis and orientation(PU 1.4)
            particle->orientation.x = CCRANDOM_MINUS1_1();
            particle->orientation.y = CCRANDOM_MINUS1_1();
            particle->orientation.z = CCRANDOM_MINUS1_1();
            particle->orientation.w = CCRANDOM_MINUS1_1();
            particle->orientation.normalize();
            particle->rotationAxis.x = CCRANDOM_0_1();
            particle->rotationAxis.y = CCRANDOM_0_1();
            particle->rotationAxis.z = CCRANDOM_0_1();
            particle->rotationAxis.normalize();
        }

        if (_useOwnRotationSpeed)
        {
            // Use the rotation speed of the particle itself
            particle->rotationSpeed = calculateRotationSpeed(particle);
        }
    }
}
示例#2
0
void PUGeometryRotator::updatePUAffector( PUParticle3D *particle, float deltaTime )
{
    //for (auto iter : _particleSystem->getParticles())
    {
        //PUParticle3D *particle = iter;
        // Rotate the geometry

        if (_useOwnRotationSpeed)
        {
            // Use scaled rotationspeed and adjust the speed according to the _velocity
            _scaledRotationSpeed = particle->rotationSpeed * deltaTime;
        }
        else
        {
            // Scale speed (beware that dynamic values don't result in a rotation; use a fixed value instead)
            _scaledRotationSpeed = calculateRotationSpeed(particle) * deltaTime;
        }

        _q.set(0.0f, 0.0f, 0.0f, 1.0f);
        //_q = Quaternion::IDENTITY;
        if (_rotationAxisSet)
        {
            _q.set(_rotationAxis, _scaledRotationSpeed);
            //_q.FromAngleAxis(Radian(_scaledRotationSpeed), _rotationAxis);
        }
        else
        {
            _q.set(particle->rotationAxis, _scaledRotationSpeed);
            //_q.FromAngleAxis(Radian(_scaledRotationSpeed), visualParticle->rotationAxis);
        }

        particle->orientation = _q * particle->orientation;
    }
}
示例#3
0
void PUVortexAffector::preUpdateAffector( float deltaTime )
{
    PUParticleSystem3D* sys = static_cast<PUParticleSystem3D *>(_particleSystem);

    if (sys)
    {
        Mat4 rotMat;
        Mat4::createRotation(sys->getDerivedOrientation(), &rotMat);
        _rotation.set(rotMat * _rotationVector, float(calculateRotationSpeed() * deltaTime));
    }
    else
    {
        _rotation.set(_rotationVector, float(calculateRotationSpeed() * deltaTime));
    }

    getDerivedPosition();
}