--- title: Fonctions de Densité type: docs weight: 8 --- Les fonctions de densité définissent la forme du terrain en calculant des valeurs de densité à chaque point dans l'espace 3D. **Package:** `com.hypixel.hytale.builtin.hytalegenerator.density` ## Concept de Fonction de Densité Les fonctions de densité retournent des valeurs qui déterminent solide vs air : - Valeurs positives = terrain solide - Valeurs négatives = air - Zéro = limite de surface ```java public interface DensityFunction { // Calculer la densité à une position float calculate(int x, int y, int z, GenerationContext context); } ``` ## Fonctions de Densité de Base ### ConstantDensity Retourne une valeur constante : ```yaml Type: ConstantDensity Value: 1.0 ``` ### NoiseDensity Utilise le bruit pour la variation du terrain : ```yaml Type: NoiseDensity NoiseType: Simplex Scale: 0.01 Amplitude: 1.0 Octaves: 4 Persistence: 0.5 ``` ### HeightGradient Crée un terrain plat à une hauteur spécifique : ```yaml Type: HeightGradient BaseHeight: 64 Falloff: 32 ``` ```java public class HeightGradient implements DensityFunction { private int baseHeight; private float falloff; public float calculate(int x, int y, int z, GenerationContext ctx) { return (baseHeight - y) / falloff; } } ``` ## Fonctions Composites ### AddDensity Combine plusieurs fonctions par addition : ```yaml Type: AddDensity Functions: - terrain_base - terrain_hills - terrain_mountains ``` ### MultiplyDensity Multiplie les valeurs des fonctions : ```yaml Type: MultiplyDensity Functions: - terrain_base - mask_function ``` ### BlendDensity Mélange entre fonctions : ```yaml Type: BlendDensity FunctionA: plains_terrain FunctionB: mountain_terrain Blender: biome_blend ``` ## Fonctions de Bruit ### SimplexNoise Bruit lisse et naturel : ```java public class SimplexNoiseDensity implements DensityFunction { private SimplexNoise noise; private float scale; private int octaves; private float persistence; public float calculate(int x, int y, int z, GenerationContext ctx) { float value = 0; float amplitude = 1; float frequency = scale; for (int i = 0; i < octaves; i++) { value += noise.noise3D(x * frequency, y * frequency, z * frequency) * amplitude; amplitude *= persistence; frequency *= 2; } return value; } } ``` ### PerlinNoise Bruit Perlin classique : ```yaml Type: PerlinNoiseDensity Scale: 0.02 Octaves: 6 Persistence: 0.5 Lacunarity: 2.0 ``` ### VoronoiNoise Bruit basé sur les cellules : ```yaml Type: VoronoiDensity Scale: 0.005 Type: Distance # ou Edge, Cell ``` ## Façonnage du Terrain ### CliffFunction Crée des formations de falaises : ```java public class CliffFunction implements DensityFunction { private float cliffHeight; private float steepness; public float calculate(int x, int y, int z, GenerationContext ctx) { float baseNoise = ctx.noise2D(x, z, 0.01f); float cliffFactor = Math.abs(baseNoise) > 0.3f ? steepness : 1.0f; return (64 - y) * cliffFactor; } } ``` ### TerraceFunction Crée un terrain en terrasses : ```yaml Type: TerraceDensity TerraceHeight: 8 Smoothing: 0.5 ``` ### OverhangFunction Crée des surplombs et des arches : ```yaml Type: OverhangDensity BaseFunction: terrain_base OverhangNoise: overhang_noise Threshold: 0.3 ``` ## Fonctions Spécifiques aux Biomes ```yaml # density/forest_terrain.yaml Type: BiomeDensity Biome: forest Function: Type: AddDensity Functions: - Type: HeightGradient BaseHeight: 68 Falloff: 24 - Type: NoiseDensity Scale: 0.02 Amplitude: 0.3 ``` ## Fonctions de Masque Contrôle où la densité s'applique : ```yaml Type: MaskedDensity Function: mountain_terrain Mask: Type: NoiseMask Scale: 0.001 Threshold: 0.5 ``` ## Configuration ```yaml # density/terrain_config.yaml DensityFunctions: terrain_base: Type: HeightGradient BaseHeight: 64 Falloff: 32 terrain_hills: Type: NoiseDensity Scale: 0.01 Amplitude: 16 terrain_combined: Type: AddDensity Functions: [terrain_base, terrain_hills] ``` ## Fonction de Densité Personnalisée ```java public class MyDensityFunction implements DensityFunction { @Override public float calculate(int x, int y, int z, GenerationContext ctx) { // Logique de terrain personnalisée float baseHeight = 64 + ctx.noise2D(x, z, 0.01f) * 20; return baseHeight - y; } } // Enregistrer dans le setup du plugin densityRegistry.register("my_terrain", new MyDensityFunction()); ``` ## Bonnes Pratiques {{< callout type="info" >}} **Directives des Fonctions de Densité :** - Utilisez des fonctions composites pour un terrain complexe - Équilibrez les échelles de bruit pour une apparence naturelle - Testez avec des outils de visualisation - Considérez les performances avec les fonctions complexes - Utilisez le cache pour les calculs coûteux {{< /callout >}}