コード例 #1
0
ファイル: Plant.cs プロジェクト: GabrielVidal1/GrenGame
    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;
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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;
    }
コード例 #4
0
ファイル: Plant.cs プロジェクト: GabrielVidal1/GrenGame
    //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);
    }