Exemple #1
0
    /*
     * Same thing here. Builds the right joint connecting two nodes and applies the gene parameters.
     */
    private void BuildMuscle(MuscleGene gene)
    {
        if (gene.enableMode == Gene.EnableMode.Disabled)
        {
            return;
        }

        muscleDensity += 2f / nodes.Length;

        Rigidbody node1 = nodes[gene.originNode];
        Rigidbody node2 = nodes [gene.connectedNode];

        switch (gene.jointType)
        {
        case Gene.JointType.Fixed:
            // node1.transform.position = node2.transform.position;
            FixedJoint fixedJoint = node1.gameObject.AddComponent <FixedJoint> ();
            fixedJoint.connectedBody = node2;
            break;

        case Gene.JointType.Spring:
            AxisMuscle muscle = node1.gameObject.AddComponent <AxisMuscle> ();
            muscle.connectedBody     = node2;
            node2.transform.position = (node1.transform.position + gene.axis * 2);
            muscle.Spawn(gene);
            break;
        }
    }
Exemple #2
0
 private void UseGene(MuscleGene gene)
 {
     this.heartBeat         = gene.heartBeat;
     this.contractTime      = gene.contractTime;
     this.contractedLength  = gene.contractedLength;
     this.extensionDistance = gene.extensionDistance;
     this.movementAxis      = gene.axis;
     this.enableMode        = gene.enableMode;
 }
Exemple #3
0
 public void Spawn(MuscleGene gene)
 {
     if (gene != null)
     {
         this.UseGene(gene);
     }
     else
     {
         this.RandomizeParams();
     }
     this.Spawn();
 }
Exemple #4
0
    /* p2 fitness > p1fitness */
    public void SetParents(
        ProunGenome p1,
        ProunGenome p2,
        float p1Fitness,
        float p2Fitness,
        MutationParams mutationParams)
    {
        int p1Size = p1.body.Length;
        int p2Size = p2.body.Length;

        int smallerSize = p2Size > p1Size ? p1Size : p2Size;
        int largerSize  = p1Size > p2Size ? p1Size : p2Size;

        float fitnessRatio = p2Fitness / (p1Fitness + p2Fitness);

        int newSize = 0;

        NodeGene[] _newBody = new NodeGene[largerSize];

        for (int i = 0; i < smallerSize; i++, newSize++)
        {
            _newBody [i] = Utility.genFloat() < fitnessRatio ? p2.body [i] : p1.body [i];
        }

        if (p2Size > p1Size)
        {
            for (int i = smallerSize; i < largerSize; i++, newSize++)
            {
                _newBody [i] = p2.body [i];
            }
        }

        NodeGene[] newBody = new NodeGene[newSize];
        for (int i = 0; i < newSize; i++)
        {
            newBody [i]       = _newBody [i];
            newBody [i].index = i;
        }

        AdjacencyMatrix <MuscleGene> newMind = new AdjacencyMatrix <MuscleGene> (newSize);

        for (int i = 0; i < smallerSize; i++)
        {
            for (int j = 0; j < smallerSize; j++)
            {
                MuscleGene muscleGene = p1.mind.GetNeighbor(i, j);
                if (muscleGene != null)
                {
                    newMind.SetNeighbor(i, j, muscleGene.Disable());
                }
            }
        }

        for (int i = 0; i < p2Size; i++)
        {
            for (int j = 0; j < p2Size; j++)
            {
                MuscleGene muscleGene = p2.mind.GetNeighbor(i, j);
                if (muscleGene != null)
                {
                    newMind.SetNeighbor(i, j, (MuscleGene)muscleGene.Mutate(mutationParams.muscleGeneMutationParams));
                }
            }
        }

        this.body = newBody;
        this.mind = newMind;
    }