Пример #1
0
    //===================================================================

    //===================================================================
    private PerlinNoiseOptions GetPerlinNoiseOptions(Vector2 amplitudeRange, Vector2 frequencyRange, Vector2 lacunarityRange, Vector2 octaveCountRange, Vector2 persistenceRange, int seed)
    {
        PerlinNoiseOptions perlinOptions = new PerlinNoiseOptions();

        perlinOptions.amplitude   = Random.Range(amplitudeRange[0], amplitudeRange[1]);
        perlinOptions.frequency   = Random.Range(frequencyRange[0], frequencyRange[1]);
        perlinOptions.lacunarity  = Random.Range(lacunarityRange[0], lacunarityRange[1]);
        perlinOptions.persistence = Random.Range(persistenceRange[0], persistenceRange[1]);
        perlinOptions.octaveCount = Mathf.RoundToInt(Random.Range(octaveCountRange[0], octaveCountRange[1]));
        perlinOptions.seed        = seed;
        perlinOptions.quality     = LibNoise.QualityMode.High;
        return(perlinOptions);
    }
Пример #2
0
    //Amplitude = .05, Frequency = 1, Lacunarity = 2, OctaveCount = 6, Persistence = .5, ResizeType = ByVolume

    #endregion


    // Use this for initialization
    void Start()
    {
        // Create Perlin Noise
        PerlinNoiseOptions perlinOptions = GetPerlinNoiseOptions(amplitudeRange, frequencyRange, lacunarityRange, octaveCountRange, persistenceRange, seed);


        //Debug.Log(perlinOptions.amplitude);
        //Debug.Log(perlinOptions.frequency);
        //Debug.Log(perlinOptions.lacunarity);
        //Debug.Log(perlinOptions.octaveCount);
        //Debug.Log(perlinOptions.persistence);
        //Debug.Log(perlinOptions.seed);

        if (useRandomSeed == true)
        {
            perlinOptions.seed = Mathf.RoundToInt(Random.value * 1000000);
        }
        Perlin noise = new Perlin(perlinOptions.frequency, perlinOptions.lacunarity, perlinOptions.persistence, perlinOptions.octaveCount, seed, perlinOptions.quality);

        Mesh mesh = GetComponent <MeshFilter>().mesh;

        Vector3[] baseVertices = mesh.vertices;
        Vector3[] vertices     = new Vector3[baseVertices.Length];

        // get initial Mass and Volume
        float initialVolume = MeshOperations.VolumeOfMesh(mesh, 1);
        float initialMass   = gameObject.GetComponent <Rigidbody>().mass;

        var verticesCH = new Vertex[baseVertices.Length];

        // Apply Perlin Noise
        for (int i = 0; i < vertices.Length; i++)
        {
            var   vertex     = baseVertices[i] * 2;
            float noiseValue = (float)noise.GetValue(vertex.x, vertex.y, vertex.z);
            vertex       += vertex * noiseValue * perlinOptions.amplitude;
            vertices[i]   = vertex;
            verticesCH[i] = new Vertex((double)vertex.x, (double)vertex.y, (double)vertex.z);
        }

        // Convex Hull
        mesh = CreateConvexMesh(vertices);
        Vector3[] vertices2 = mesh.vertices;


        // Scale Mesh to Equal Sphere Volume
        float scaleMultiplier = GetBestMultiplier(mesh, initialVolume, resizeType);

        for (int i = 0; i < vertices2.Length; i++)
        {
            var vertex = vertices2[i];
            vertex      *= scaleMultiplier;
            vertices2[i] = vertex;
        }

        // Finalize Mesh
        mesh.vertices = vertices2;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        // Update Meshes
        GetComponent <MeshFilter>().mesh         = null;
        GetComponent <MeshFilter>().mesh         = mesh;
        GetComponent <MeshCollider>().sharedMesh = null;
        GetComponent <MeshCollider>().sharedMesh = mesh;

        // Update Mass
        gameObject.GetComponent <Rigidbody>().ResetCenterOfMass();
        UpdateGrainProperties();
    }