void initParticle(Particle& out) { // Time particle is created relative to the global running // time of the particle system. out.initialTime = mTime; // Flare lives for 2-4 seconds. out.lifeTime = GetRandomFloat(2.0f, 4.0f); // Initial size in pixels. out.initialSize = GetRandomFloat(10.0f, 15.0f); // Give a very small initial velocity to give the flares // some randomness. GetRandomVec(out.initialVelocity); // Scalar value used in vertex shader as an amplitude factor. out.mass = GetRandomFloat(1.0f, 2.0f); // Start color at 50-100% intensity when born for variation. out.initialColor = GetRandomFloat(0.5f, 1.0f)*WHITE; // Generate random particle on the ring in polar coordinates: // random radius and random angle. float r = GetRandomFloat(10.0f, 14.0f); float t = GetRandomFloat(0, 2.0f*D3DX_PI); // Convert to Cartesian coordinates. out.initialPos.x = r*cosf(t); out.initialPos.y = r*sinf(t); // Random depth value in [-1, 1] (depth of the ring) out.initialPos.z = GetRandomFloat(-1.0f, 1.0f); }
vgl_vector_3d<double> GetOrthogonalVector(const vgl_vector_3d<double> &V) { //Gram Schmidt Orthogonalization vgl_vector_3d<double> RandVec = GetRandomVec(); vgl_vector_3d<double> N = RandVec - Project(RandVec, V); normalize(N); return N; }
void FireBall::initParticle(ParticleEmitter::Particle& out) { // Time particle is created relative to the global running // time of the particle system. out.initialTime = mTime; out.age=mTime; // Flare lives for 2-4 seconds. // original values //out.lifeTime = GetRandomFloat(2.0f, 8.0f); out.lifeTime = GetRandomFloat(mMinLifeTime, mMaxLifeTime); // Initial size in pixels. // original values //out.initialSize = GetRandomFloat(10.0f, 15.0f); out.initialSize = GetRandomFloat(mMinSize, mMaxSize); // Give a very small initial velocity to give the flares // some randomness. GetRandomVec(out.initialVelocity); out.initialVelocity.x *= mAccelImpulse.x; out.initialVelocity.y *= mAccelImpulse.y; out.initialVelocity.z *= mAccelImpulse.z; out.initialVelocity.x += mAccelShift.x; out.initialVelocity.y += mAccelShift.y; out.initialVelocity.z += mAccelShift.z; // Scalar value used in vertex shader as an amplitude factor. out.mass = GetRandomFloat(1.0f, 2.0f); // Start color at 50-100% intensity when born for variation. out.initialColor = static_cast<DWORD>(GetRandomFloat(0.5f, 1.0f) * 1.0f);//white; V3 temp = mParticleRadius - mInitPos; float length = temp.Length(); V3 tempNormal = temp.Normalize(); //D3DXMATRIX outmtx; noMat3 outmtx; //D3DXMatrixRotationYawPitchRoll(&outmtx,GetRandomFloat(0.0f,2.0f)*noMath::PI,GetRandomFloat(0.0f,2.0f)*noMath::PI,0.0f); noAngles angle(RAD2DEG(GetRandomFloat(0.0f,2.0f)*noMath::PI), RAD2DEG(GetRandomFloat(0.0f,2.0f)*noMath::PI), 0.0f); outmtx = angle.ToMat3(); //D3DXVec3TransformCoord(&temp,&temp,&outmtx); temp = outmtx * temp; out.initialPos = mInitPos + (temp * length); }