//=================================================================== //=================================================================== 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); }
//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(); }