Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[Aporte] Mesh con transicion de formas geometricas

Iniciado por Jose134, Abril 27, 2016, 06:17:55 PM

Tema anterior - Siguiente tema
Abril 27, 2016, 06:17:55 PM Ultima modificación: Abril 27, 2016, 06:18:57 PM por Jose134
Bueno la verdad es que no sabia muy bien que titulo poner a esto, el caso es que ayer estuve haciendo esto a modo de reto (un amigo me pregunto que como lo haria yo y al no poder darle una respuesta me propuse investigar y hacerlo) El script genera un mesh con forma triangular mediante codigo y este mesh se puede transformar en un cuadrado, en un pentagono o en un hexagono dependiendo de una variable numerica (y se puede pasar directamente desde cualquier forma a cualquier otra, como por ejemplo, de triangulo a hexagono)He decidido compartirlo por si a alguien le sirve, simplemente aplicadlo a un GameObject que tenga un MeshFitler y un MeshRenderer y ya debería funcionar correctamente
using UnityEngine;
using System.Collections;

public class ShapeMorph : MonoBehaviour {

    private MeshFilter mf;
    private Mesh mesh;


    public int shape = 0;
    public float morphSpeed = 10f;

    void Awake ()
    {
        mf = GetComponent<MeshFilter>();
        mesh = new Mesh();
    }
    void Start ()
    {
        mesh = InitialMesh();
        mf.mesh = mesh;
    }

    void Update ()
    {
        shape = Mathf.Clamp(shape, 0, 3);

        if (shape ==  0) { mf.mesh.vertices = SetTriangle(); mf.mesh.name = "Triangle"; }
        if (shape ==  1) { mf.mesh.vertices = SetSquare();   mf.mesh.name = "Square";   }
        if (shape ==  2) { mf.mesh.vertices = SetPentagon(); mf.mesh.name = "Pentagon"; }
        if (shape ==  3) { mf.mesh.vertices = SetHexagon();  mf.mesh.name = "Hexagon";  }
    }

    private Mesh InitialMesh ()
    {
        Mesh newMesh = new Mesh();
        newMesh.name = "EditableMesh_Triangle";

        newMesh.vertices = new Vector3[]
        {
            new Vector3(0.5f, 1f, 0f),    //A - 0
            new Vector3(0.25f, 0.5f, 0f), //B - 1
            new Vector3(0f, 0f, 0f),      //C - 2
            new Vector3(0.5f, 0f, 0f),    //D - 3
            new Vector3(1f, 0f, 0f),      //E - 4
            new Vector3(0.75f, 0.5f, 0f)  //F - 5
        };
        newMesh.triangles = new int[]
        {
            0, 5, 1,
            5, 4, 3,
            1, 3, 2,
            1, 5, 3
        };
        newMesh.normals = new Vector3[]
        {
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward
        };
        newMesh.uv = new Vector2[]
        {
            new Vector2(0.5f, 1f),
            new Vector2(0.25f, 0.5f),
            new Vector2(0f, 0f),
            new Vector2(0.5f, 0f),
            new Vector2(1f, 0f),
            new Vector2(0.75f, 0.5f)
        };

        return newMesh;
    }

    private Vector3[] SetTriangle()
    {
        Vector3[] vertices = mf.mesh.vertices;

        vertices[0] = Vector3.Lerp(vertices[0], new Vector3(0.5f, 1f, 0f), morphSpeed * Time.deltaTime);
        vertices[1] = Vector3.Lerp(vertices[1], new Vector3(0.25f, 0.5f, 0f), morphSpeed * Time.deltaTime);
        vertices[2] = Vector3.Lerp(vertices[2], new Vector3(0f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[3] = Vector3.Lerp(vertices[3], new Vector3(0.5f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[4] = Vector3.Lerp(vertices[4], new Vector3(1f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[5] = Vector3.Lerp(vertices[5], new Vector3(0.75f, 0.5f, 0f), morphSpeed * Time.deltaTime);

        return vertices;
    }
    private Vector3[] SetSquare ()
    {
        Vector3[] vertices = mf.mesh.vertices;

        vertices[0] = Vector3.Lerp(vertices[0], new Vector3(0f, 1f, 0f), morphSpeed * Time.deltaTime);
        vertices[1] = Vector3.Lerp(vertices[1], new Vector3(0f, 0.5f, 0f), morphSpeed * Time.deltaTime);
        vertices[2] = Vector3.Lerp(vertices[2], new Vector3(0f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[3] = Vector3.Lerp(vertices[3], new Vector3(0.5f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[4] = Vector3.Lerp(vertices[4], new Vector3(1f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[5] = Vector3.Lerp(vertices[5], new Vector3(1f, 1f, 0f), morphSpeed * Time.deltaTime);

        return vertices;
    }
    private Vector3[] SetPentagon ()
    {
        Vector3[] vertices = mf.mesh.vertices;

        vertices[0] = Vector3.Lerp(vertices[0], new Vector3(0f, 0.5f, 0f), morphSpeed * Time.deltaTime);
        vertices[1] = Vector3.Lerp(vertices[1], new Vector3(0.125f, 0.25f, 0f), morphSpeed * Time.deltaTime);
        vertices[2] = Vector3.Lerp(vertices[2], new Vector3(0.25f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[3] = Vector3.Lerp(vertices[3], new Vector3(0.75f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[4] = Vector3.Lerp(vertices[4], new Vector3(1f, 0.5f, 0f), morphSpeed * Time.deltaTime);
        vertices[5] = Vector3.Lerp(vertices[5], new Vector3(0.5f, 1f, 0f), morphSpeed * Time.deltaTime);

        return vertices;
    }
    private Vector3[] SetHexagon ()
    {
        Vector3[] vertices = mf.mesh.vertices;

        vertices[0] = Vector3.Lerp(vertices[0], new Vector3(0f, 0.75f, 0f), morphSpeed * Time.deltaTime);
        vertices[1] = Vector3.Lerp(vertices[1], new Vector3(0f, 0.25f, 0f), morphSpeed * Time.deltaTime);
        vertices[2] = Vector3.Lerp(vertices[2], new Vector3(0.5f, 0f, 0f), morphSpeed * Time.deltaTime);
        vertices[3] = Vector3.Lerp(vertices[3], new Vector3(1f, 0.25f, 0f), morphSpeed * Time.deltaTime);
        vertices[4] = Vector3.Lerp(vertices[4], new Vector3(1f, 0.75f, 0f), morphSpeed * Time.deltaTime);
        vertices[5] = Vector3.Lerp(vertices[5], new Vector3(0.5f, 1f, 0f), morphSpeed * Time.deltaTime);

        return vertices;
    }
   
}
 Un saludo a todos

Ostras, muy bueno y muy original. A lo Terminator!


Cita de: GSG3D date=1461794715" data-ipsquote="" data-cite="GSG3D" class="ipsQuote">Interesante, para cuando la versión en 3D? ;)

Cita de: Braltor date=1461796119" data-ipsquote="" data-cite="Braltor" class="ipsQuotees gracioso xD  supongo q solo necesita duplicar los vertices en Z y agregar las caras de los lados
Lo se, pero es un incentivo solamente.

Cita de: iRobb date=1461788384" data-ipsquote="" data-cite="iRobb" class="ipsQuoteOstras, muy bueno y muy original. A lo Terminator!
jajaja gracias (aunque la idea en verdad fue de mi amigo, yo solo lo programe xD)

Etiquetas: