[DB-AL] Mettre une couleur à un mesh

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Répondre
polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

[DB-AL] Mettre une couleur à un mesh

Message par polmpolm123 » 23 Déc 2016 15:42

Bonjour,

Je voudrais associé à un mesh une couleur qui varie en fonction du temps entre deux frames
Mais je ne sais pas qu'est ce que je dois faire avec la méthode ColorFromHue(float v) (c'est visual studio qui me l'as mise).

Code : Tout sélectionner

    [SerializeField] float speed = 90f;
    Mesh mesh;
    
        void Start ()
    {
    
     mesh = new Mesh(); 
     
     ....
    
     Color[] colors = new Color[3];

        float offset = Time.time * speed;

        colors[0] = ColorFromHue(0 + offset);
        colors[1] = ColorFromHue(120 + offset);
        colors[2] = ColorFromHue(240 + offset);

        mesh.colors = colors;
        
}        

    private Color ColorFromHue(float v)
    {
        throw new NotImplementedException();        

    }
    

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6225
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Mettre une couleur à un mesh

Message par boubouk50 » 23 Déc 2016 16:26

https://github.com/parahunter/mesh-pres ... hColors.cs

Alors quand on demande de l'aide, il faut:
- Nous indiquer d'où tu sors le code. Vu qu'il n'est pas de toi, ça nous donne une indication sur ton niveau et où chercher. (Du coup, ici la solution est dans le GitHub recopié, puisque cette fonction n'existe pas autrement)
- Nous donner le script en ENTIER
- Nous donner les erreurs consoles et le maximum d'information sur l'erreur.

Quand on copie un code d'une tierce personne, il faut AUSSI copier les fonctions associées... Notamment ColorFromHue ()
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

Re: [DB-AL] Mettre une couleur à un mesh

Message par polmpolm123 » 23 Déc 2016 20:04

Excusez-moi ^^ ,

J'ai pris le code ici https://www.youtube.com/watch?v=nJO9qTjR3UI , ( à 10:00)
J'ai ajouté le code de la fonction coloFromHue mais ça ne change pas de couleur.
J'ai aucun message d'erreur dans la console.

Code : Tout sélectionner

public class VertexColors : MonoBehaviour {

    [SerializeField] float speed = 90f;

    Mesh mesh;

    // Use this for initialization
    void Start ()
    {
        mesh = new Mesh(); 

        // assigner les sommets
        Vector3[] vertices = new Vector3[3];
        vertices[0] = new Vector3(-1, -1, 0);
        vertices[1] = new Vector3(0, 0.8f, 0);
        vertices[2] = new Vector3(1, -1, 0);
        mesh.vertices = vertices;

        // assigner les triangles
        int[] triangles = new int[3] { 0, 1, 2 };
        mesh.triangles = triangles;

        GetComponent<MeshFilter>().mesh = mesh;

        Vector3[] normals = new Vector3[3];
        normals[0] = Vector3.back; normals[1] = Vector3.back; normals[2] = Vector3.back;
        mesh.normals = normals;
        
            Color32 ColorFromHue(float h)
    {
        h = Mathf.Repeat(h, 360f);

        h /= 60;            // sector 0 to 5
        float s = 1; float v = 1; //saturation and value is both set to max
        float c = s * v;

        //HSV to RGB conversion
        Color32 returnCol = new Color32();
        returnCol.a = 255;

        int i;
        float f, p, q, t;

        if (s == 0)
        {
            // achromatic (grey)
            returnCol.r = (byte)(v * 255);
            returnCol.g = (byte)(v * 255);
            returnCol.b = (byte)(v * 255);
            return returnCol;
        }

        i = (int)System.Math.Floor((double)h);
        f = h - i;          // factorial part of h
        p = v * (1 - s);
        q = v * (1 - s * f);
        t = v * (1 - s * (1 - f));
        switch (i)
        {
            case 0:
                returnCol.r = (byte)(v * 255);
                returnCol.g = (byte)(t * 255);
                returnCol.b = (byte)(p * 255);
                break;
            case 1:
                returnCol.r = (byte)(q * 255);
                returnCol.g = (byte)(v * 255);
                returnCol.b = (byte)(p * 255);
                break;
            case 2:
                returnCol.r = (byte)(p * 255);
                returnCol.g = (byte)(v * 255);
                returnCol.b = (byte)(t * 255);
                break;
            case 3:
                returnCol.r = (byte)(p * 255);
                returnCol.g = (byte)(q * 255);
                returnCol.b = (byte)(v * 255);
                break;
            case 4:
                returnCol.r = (byte)(t * 255);
                returnCol.g = (byte)(p * 255);
                returnCol.b = (byte)(v * 255);
                break;
            default:        // case 5:
                returnCol.r = (byte)(v * 255);
                returnCol.g = (byte)(p * 255);
                returnCol.b = (byte)(q * 255);
                break;
        }

        return returnCol;
    }



        // Update is called once per frame
        void Update ()
    {
        Color32[] colors = new Color32[3];

        float offset = Time.time * speed;

        colors[0] = ColorFromHue(0 + offset);
        colors[1] = ColorFromHue(120 + offset);
        colors[2] = ColorFromHue(240 + offset);

        mesh.colors32 = colors;

    }

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Mettre une couleur à un mesh

Message par Max » 23 Déc 2016 21:37

Bonsoir polmpolm123,
polmpolm123 a écrit :J'ai aucun message d'erreur dans la console.
Ben, si il s'agit du code que tu as posté dans ton dernier pessage, là permet moi d'avoir un gros doute. On a l'impression que tu as copié/collé la fonction 'ColorFromHue' au milieu du premier code. C'est d'autant plus dommage que le code complet est fournis sur la page dont Boubouk fournit le lien plus haut.

En suite, au delà du code, quel but poursuis-tu ? Pense-tu avoir les bases pour arriver à tes fins ? On parlera des connaissances générales en 3D, ainsi que les bases sur Unity lui même.
Car jouer du vertexcolor, au jour d'aujourd'hui, il faut de bonne raison pour y toucher.
Quel material as-tu définis pour ton objet ? Et surtout quel shader ? (La doc, toujours consulter la doc, par exemple sur la partie mesh color)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

Re: [DB-AL] Mettre une couleur à un mesh

Message par polmpolm123 » 23 Déc 2016 22:53

Bonjour,
J'ai effectivement copié coller la fonction 'ColorFromHue' du lien donnée ^^. (Je ne pensais pas qu'appliqué une couleur était si compliqué ^^)
Pour l'objectif pour l'instant c'est juste de réaliser le triangle multicolore de la vidéo.
J'ai repris tous le code du GitHub du lien donnée , le triangle reste unicolore.
J'ai fait aussi avec l'exemple de la documentation pour voir mais y a rien qui se passe.

Pour le material utilisé j'ai juste fait dans le projet clic droit -> create -> material puis j'ai appliqué le material à mon gameObject

Code : Tout sélectionner

    Mesh mesh;

    // Use this for initialization
    void Start()
    {
        mesh = new Mesh();

        // assigner les sommets
        Vector3[] vertices = new Vector3[3];
        vertices[0] = new Vector3(-1, -1, 0);
        vertices[1] = new Vector3(0, 0.8f, 0);
        vertices[2] = new Vector3(1, -1, 0);
        mesh.vertices = vertices;

        // assigner les triangles
        int[] triangles = new int[3] { 0, 1, 2 };
        mesh.triangles = triangles;

        GetComponent<MeshFilter>().mesh = mesh;

        // create new colors array where the colors will be created.
        Color[] colors = new Color[vertices.Length];

        for (int i = 0; i < vertices.Length; i++)
            colors[i] = Color.Lerp(Color.red, Color.green, vertices[i].y);

        // assign the array of colors to the Mesh.
        mesh.colors = colors;

    }

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Mettre une couleur à un mesh

Message par Max » 23 Déc 2016 23:56

polmpolm123 a écrit :Pour le material utilisé j'ai juste fait dans le projet clic droit -> create -> material puis j'ai appliqué le material à mon gameObject
Je n'ai pas regardé la vidéo. Mais, le material à son importance, où plus précisément le shader employé.
CF la doc, comme je l'ai dit plus haut (mesh color)
Qui dit en substance ceci: (Note that most built-in Shaders don't display vertex colors. Use one that does, such as a Particle Shader, to see vertex colors)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

Re: [DB-AL] Mettre une couleur à un mesh

Message par polmpolm123 » 24 Déc 2016 01:56

ho ^^, je n'avais pas vu cette ligne. J'ai mis un shader Particle pour le material et ça fonction, le triangle à de multiple couleurs qui varient.

Pour revenir sur le but en fait je veux faire un effet d'apparition très simple pour mon niveau ^^ et j'étais entrain de voir comment faire pour y arriver. Et apparemment fraudais que je manipule les triangle du mesh.
Je vais d’abord continué de rechercher et tester et si je n'y arrive pas je posterai sur le forum ^^.

Merci de vos aident

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Mettre une couleur à un mesh

Message par Max » 24 Déc 2016 12:30

polmpolm123 a écrit :Pour revenir sur le but en fait je veux faire un effet d'apparition très simple pour mon niveau ^^ et j'étais entrain de voir comment faire pour y arriver. Et apparemment fraudais que je manipule les triangle du mesh.
De se que j'ai compris, tu as pour objectif quelque chose de similaire à se que l'on voit sur cette vidéo:

https://www.youtube.com/watch?v=ZROROPHEEos

Chalenge technique intéressant, même si pas si simple.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

polmpolm123
Messages : 30
Inscription : 23 Déc 2016 15:15

Re: [DB-AL] Mettre une couleur à un mesh

Message par polmpolm123 » 28 Déc 2016 23:41

Bonjour,
Oui je voudrais faire quelque chose comme cela ^^.

Pour la méthode ColorFromHue je n'ai pas très bien compris ce qu'il fait. Pourquoi il utilise 0,120,240, pourquoi il fait un module 360 pour h et je ne comprends pas l'utilisation de i, f, p, q, t .

Code : Tout sélectionner


	[SerializeField] float speed = 90f;

	float offset = Time.time * speed;

        colors[0] = ColorFromHue(0 + offset);
        colors[1] = ColorFromHue(120 + offset);
        colors[2] = ColorFromHue(240 + offset);

    Color32 ColorFromHue(float h)
    {
        h = Mathf.Repeat(h, 360f);
        Debug.Log("***" + h + "***");

        h /= 60;            // sector 0 to 5
        float s = 1; float v = 1; //saturation and value is both set to max
        float c = s * v;

        //HSV to RGB conversion
        Color32 returnCol = new Color32();
        returnCol.a = 255;

        int i;
        float f, p, q, t;

        if (s == 0)
        {
            // achromatic (grey)
            returnCol.r = (byte)(v * 255);
            returnCol.g = (byte)(v * 255);
            returnCol.b = (byte)(v * 255);
            return returnCol;
        }

        i = (int)System.Math.Floor((double)h);
        Debug.Log(h +" ||| "+ i);
        f = h - i;          // factorial part of h
        p = v * (1 - s);
        q = v * (1 - s * f);
        t = v * (1 - s * (1 - f));
         Debug.Log(f +" ||| "+ p +" ||| "+ q +" ||| "+ t);
        switch (i)
        {
            case 0:
                returnCol.r = (byte)(v * 255);
                returnCol.g = (byte)(t * 255);
                returnCol.b = (byte)(p * 255);
                break;
            case 1:
                returnCol.r = (byte)(q * 255);
                returnCol.g = (byte)(v * 255);
                returnCol.b = (byte)(p * 255);
                break;
            case 2:
                returnCol.r = (byte)(p * 255);
                returnCol.g = (byte)(v * 255);
                returnCol.b = (byte)(t * 255);
                break;
            case 3:
                returnCol.r = (byte)(p * 255);
                returnCol.g = (byte)(q * 255);
                returnCol.b = (byte)(v * 255);
                break;
            case 4:
                returnCol.r = (byte)(t * 255);
                returnCol.g = (byte)(p * 255);
                returnCol.b = (byte)(v * 255);
                break;
            default:        // case 5:
                returnCol.r = (byte)(v * 255);
                returnCol.g = (byte)(p * 255);
                returnCol.b = (byte)(q * 255);
                break;
        }

        return returnCol;
    }

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Mettre une couleur à un mesh

Message par Max » 29 Déc 2016 09:54

Je ne suis pas convaincu que de te plonger dans la compréhension de cette fonction te sois réellement super utile pour l'objectif que tu poursuis. (un apprentissage de se que sont les shaders, plus surement par contre)
Sinon, il s'agit d'une routine permettant les conversions des formats colorimétriques HSV vers RGB.
tout est là: https://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV
Bonne lecture :mrgreen:
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »