public void InitializeMesh() { trunkTimeOverTime = new AnimationCurve(new Keyframe[] { new Keyframe(0, 0), new Keyframe(actualTrunkGrowthDuration / maxDuration, 1f), new Keyframe(1, 1) }); positionsAndNormals = GenerateTrajectory(transform.position, InitialDirection, nbOfSegments + 1); mf = GetComponent <MeshFilter> (); triangles = new int[6 * nbOfSides * nbOfSegments]; GenerateTriangles(points, triangles); points = new Vector3[nbOfSides * (nbOfSegments + 1)]; //GeneratePoints (0f, points); uvs = new Vector2[points.Length]; GenerateUVs(uvs); Mesh m = mf.mesh; m.Clear(); m.vertices = points; m.triangles = triangles; m.uv = uvs; m.RecalculateNormals(); mf.mesh = m; }
public PositionsAndNormals GenerateTrajectory(Vector3 initialPosition, Vector3 initialDirection, int arrayLength) { float rayDuration = 10f; //PARAMETERS initialDirection.Normalize(); PositionsAndNormals positionsNormals = new PositionsAndNormals(arrayLength); Vector3 currentDirection = initialDirection; Vector3 currentPosition = initialPosition; Vector3 currentNormal = Vector3.Cross(initialDirection, new Vector3(0.21f, 0.656f, 0.254f)); Vector3 prevPosition = initialPosition; positionsNormals.pos [0] = initialPosition; positionsNormals.nor [0] = currentNormal; for (int i = 1; i < arrayLength; i++) { float lengthRatio = i / (float)arrayLength; //DIRECTION CALCULATION Vector3 gravity = Vector3.down * gravityForce * gravityOverLength.Evaluate(lengthRatio); Vector3 noise = noiseForce * noiseOverLength.Evaluate(lengthRatio) * Noise3D.PerlinNoise3D(currentPosition / noiseSize); float distance = Mathf.Lerp(initialSegmentLength, finalSegmentLength, segmentLengthOverLength.Evaluate(lengthRatio)); currentDirection = distance * (currentDirection + gravity + noise).normalized; PosDir pd = Collision(new PosDir(currentPosition, currentDirection, currentNormal), distance); for (int k = 0; k < 10; k++) { pd = Collision(new PosDir(currentPosition, pd.dir, pd.normal), distance); } currentPosition = pd.pos; currentDirection = pd.dir; positionsNormals.pos [i] = currentPosition; positionsNormals.nor [i] = pd.normal; prevPosition = currentPosition; } return(positionsNormals); }
public void Initialize() { positionsAndNormals = GetComponent <CollisionCurve>().GenerateTrajectory(transform.position, initalDirection, nbOfSegments + 1); mf = GetComponent <MeshFilter> (); points = GeneratePoints(); triangles = GenerateTriangles(points); Mesh m = new Mesh(); m.vertices = points.ToArray(); m.triangles = triangles.ToArray(); m.RecalculateNormals(); mf.mesh = m; }
//USED TO GENERATE THE TRAJECTORY AT THE CREATION OF THE PLANT public PositionsAndNormals GenerateTrajectory(Vector3 initialPosition, Vector3 initialDirection, int arrayLength) { //PARAMETERS totalLength = 0f; initialDirection.Normalize(); PositionsAndNormals positionsNormals = new PositionsAndNormals(arrayLength); Vector3 currentDirection = initialDirection; Vector3 currentPosition = initialPosition; Vector3 currentNormal = initialNormal; positionsNormals.pos [0] = initialPosition; positionsNormals.nor [0] = currentNormal; float computedLength = nbOfSegments * (initialSegmentLength + finalSegmentLength) / 2f; float actualNoiseSize = noiseSize * computedLength; Vector3 noiseOffset = Vector3.zero; float noiseMultiplier = 1f; for (int i = 1; i < arrayLength; i++) { //RATIO float lengthRatio = i / (float)arrayLength; //DIRECTION FORCES CALCULATION Vector3 gravity = Vector3.zero; if (hasGravity) { gravity = Vector3.down * gravityForce * gravityOverLength.Evaluate(lengthRatio); } Vector3 noise = Vector3.zero; if (hasNoise) { if (i % 25 == 0) { noiseOffset.y += 3 * actualNoiseSize; noiseMultiplier = 5f; } noise = noiseForce * noiseOverLength.Evaluate(lengthRatio) * Noise3D.PerlinNoise3D((currentPosition + noiseOffset + plantSeed * Vector3.left) / actualNoiseSize); } Vector3 force = currentDirection; if (initialForce) { force = initialForceCoef * initialDirection; } float distance = Mathf.Lerp(initialSegmentLength, finalSegmentLength, segmentLengthOverLength.Evaluate(lengthRatio)); totalLength += distance; currentDirection = distance * (force + gravity + noiseMultiplier * noise).normalized; //currentDirection = distance * (force + currentDirection + gravity + noiseMultiplier * noise).normalized; PosDir pd = new PosDir(currentPosition, currentDirection, currentNormal); //CALCULATE COLLISIONS if (hasCollisions) { //COLLISION CALCULATION WITH 10 ITERATIONS for (int k = 0; k < 10; k++) { pd = Collision(new PosDir(currentPosition, pd.dir, pd.normal), distance); } currentPosition = pd.pos; currentDirection = pd.dir; } else { currentPosition += currentDirection; } noiseMultiplier = 1f; positionsNormals.pos [i] = currentPosition; positionsNormals.nor [i] = pd.normal; } return(positionsNormals); }