/// <summary> /// Creer un nuage /// </summary> /// <param name="nuage"></param> /// <param name="init">true s'il s'agit de la creation initiale, false si c'est un /// recyclage d'un nuage qui est passe derriere la camera</param> void creerNuage(ref Nuage nuage, bool init) { if (nuage == null) { nuage = new Nuage(); nuage._particules = new List <Particule>(); } else { nuage._particules.Clear(); } float rayonNuage = FloatRandom(RAYON_MIN, RAYON_MAX); nuage.x = FloatRandom(-_tailleCubeX * 50, _tailleCubeX * 50); nuage.y = _positionNuage * _tailleCubeY * FloatRandom(-RAYON_MIN, RAYON_MAX * 2); if (init) { nuage.z = -FloatRandom(-_zCamera, _tailleCubeZ * 10); } else { nuage.z = -_tailleCubeZ * 10; } // Genere le nuage de facon 'fractale' _NbParticules = GenereNuage(ref nuage, nuage.x, nuage.y, nuage.z, rayonNuage, TAILLE_PARTICULE, MAX_NIVEAU); }
/// <summary> /// Genere recursivement un nuage, pour lui donner son aspect fractal /// </summary> /// <param name="nuage"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="z"></param> /// <param name="rayonNuage"></param> /// <param name="niveau"></param> private int GenereNuage(ref Nuage nuage, float x, float y, float z, float rayonNuage, float tailleParticule, int niveau) { Particule p = new Particule(); p.x = x; p.y = y; p.z = z; p.taille = FloatRandom(tailleParticule * 0.75f, tailleParticule * 1.5f); p.alpha = FloatRandom(ALPHA * 0.5f, ALPHA * 2.0f); p.type = r.Next(0, NB_TEXTURES); nuage._particules.Add(p); int res = 1; if (niveau > 1) { for (int i = 0; i < NB_EMBRANCHEMENTS; i++) { float AngleX = FloatRandom(0, (float)Math.PI * 2); float AngleZ = FloatRandom(0, (float)Math.PI * 2); float distanceCentre = FloatRandom(rayonNuage * 0.2f, rayonNuage); res += GenereNuage(ref nuage, x + distanceCentre * 3.0f * (float)Math.Cos(AngleX), y + distanceCentre * 0.5f * (float)Math.Sin(AngleX), z + distanceCentre * 2.0f * (float)Math.Sin(AngleZ), rayonNuage * 0.5f, tailleParticule * 0.75f, niveau - 1); } } return(res); }
void CreateNuage(ref Nuage nuage, bool init) { if (nuage == null) { nuage = new Nuage(); } nuage._nbParticules = r.Next(NBPARTICULES_MIN, NBPARTICULES_MAX); nuage._rayon = FloatRandom(RAYON_MIN, RAYON_MAX); nuage._centreX = FloatRandom(-_tailleCubeX * 50, _tailleCubeX * 50); nuage._centreY = _positionNuage * _tailleCubeY * 4; //FloatRandom( _tailleCubeY/2, _tailleCubeY ) ; if (init) { nuage._centreZ = FloatRandom(_zCamera, _tailleCubeZ * 8); } else { nuage._centreZ = FloatRandom(_tailleCubeZ / 2, _tailleCubeZ * 8); }; nuage._points = new Vecteur3D[nuage._nbParticules]; nuage._tailles = new float[nuage._nbParticules]; nuage._type = new int[nuage._nbParticules]; for (int i = 0; i < nuage._nbParticules; i++) { nuage._points[i] = new Vecteur3D(nuage._centreX + FloatRandom(-nuage._rayon, nuage._rayon), nuage._centreY + FloatRandom(-nuage._rayon, nuage._rayon), nuage._centreZ + FloatRandom(-nuage._rayon / 8, nuage._rayon / 8)); nuage._tailles[i] = FloatRandom(TAILLE_PARTICULE_MIN, TAILLE_PARTICULE_MAX); nuage._type[i] = r.Next(0, 2); } }