modification texture sur une partie d'un gameObject

Questions à propos du scripting Shader.
jesstrice66
Messages : 3
Inscription : 29 Juin 2016 15:03

modification texture sur une partie d'un gameObject

Message par jesstrice66 » 29 Juin 2016 15:18

Bonjour à tous,


Je suis confronté à un problème que je ne parviens pas a résoudre et j'espère que quelqu'un pourra m'éclairer. Voilà je cherche à changer la "couleur", texture d'une partie d'un gameObjet qui est enfaite un maillage OBJ, je voudrais qu'à l'endroit où je click sur cette objet la texture change. Je ne vois absolument pas comment faire cela car d'après ce que je comprend, la texture est ancrée dans le format du fichier... du coup pensez que cela soit possible de manière à ne pas avoir à modifier le fichier OBJ lui même?

Merci d'avance pour votre aide.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 5402
Inscription : 28 Avr 2014 11:57
Localisation : Toulouse

Re: modification texture sur une partie d'un gameObject

Message par boubouk50 » 29 Juin 2016 15:48

Merci de faire un effort d'explication et de formulation de phrase pour qu'on comprenne un peu mieux le sujet, parce que là c'est pas très compréhensible...

Tu souhaites dessiner sur la texture?
Tu souhaites changer la couleur globale de la texture? Ou bien une zone définie par un clic?
"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

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: modification texture sur une partie d'un gameObject

Message par simonj » 29 Juin 2016 15:51

Tu veux que la modification sur la texture soit sauvegardé après ?

Parce qu'assez simplement tu peux récupérer l'objet sur lequel tu viens de cliquer grâce à un Raycast et après si tu trouves un Renderer sur l'objet tu peux, j'imagine, lui changer sa couleur. Je suis allé chercher un exemple ici, si tu veux regarder.

En gros ça donnerais :

Code : Tout sélectionner

public class ExampleClass : MonoBehaviour {
    public Camera cam;
    void Start() {
        cam = GetComponent<Camera>();
    }
    void Update() {
        if (!Input.GetMouseButton(0))
            return;
        
        RaycastHit hit;
        if (!Physics.Raycast(cam.ScreenPointToRay(Input.mousePosition), out hit))
            return;
        
        Renderer rend = hit.transform.GetComponent<Renderer>();
        MeshCollider meshCollider = hit.collider as MeshCollider;
        if (rend == null || rend.sharedMaterial == null || rend.sharedMaterial.mainTexture == null || meshCollider == null)
            return;
        
        Texture2D tex = rend.material.mainTexture as Texture2D;
        }
}
Après c'est assez basique, donc je ne sais pas si ça correspond vraiment à tes besoins ?

jesstrice66
Messages : 3
Inscription : 29 Juin 2016 15:03

Re: modification texture sur une partie d'un gameObject

Message par jesstrice66 » 30 Juin 2016 13:38

Bonjour, tout d'abord merci pour vos réponses, en relisant mon message je me rends compte qu'effectivement ce n'est pas très clair. En faite, je souhaite modifier la couleur d'une zone qui serait sélectionnée par la souris, donc ici deux options possibles :
- on sélectionne plusieurs points à la souris, puis on les relient en formant un polygone sur le maillage de l'objet, et c'est ce polygone qui sera mise en relief en le changeant de couleur,
- on sélectionne un point sur l'objet et un motif prédéfini vient se "plaqué" sur l'objet en respectant les courbures du maillage à l’endroit où l'on a cliqué.

Je ne me suis pas encore décidé sur l'option la plus simple à codée et la plus ergonomique sachant que ce ne sera pas forcément les mêmes, je pense opter pour la deuxième solution, qu'en pensez-vous?
Pour cela j'aurais donc un motif de bas type carrée ou triangle que je doit placer sur l'objet 3D, qui doit changer de couleur à l'endroit où sera plaqué ce motif.

J'espère que c'est plus clair...

Simonj, pour te répondre, oui j'aimerais que cette zone texturée soit sauvegardée, et j'utilise le Raycast pour avoir le point d'intersection avec l'objet; voici mon code :

Code : Tout sélectionner


public class ClickAction : MonoBehaviour {



    public Zoning zoning;
    public GameObject Mesh;
    public GameObject Zone;
    private int compteur = 0;
    RaycastHit main;
    

    private List<Vector3> pts = new List<Vector3>();

    
    void Start () {
        zoning.DoZone = false;
    }
	
	
	void Update () {

        if (Input.GetMouseButtonDown(0))
            {
                if (zoning.DoZone==true)
                {
                    Ray toMouse = Camera.main.ScreenPointToRay(Input.mousePosition);
                    RaycastHit rhInfo;
                    // Debug.DrawRay(toMouse.origin, toMouse.direction * 10, Color.cyan);

                    bool didHit = Physics.Raycast(toMouse, out rhInfo, 500.0f);

                    if (didHit)
                    {
                        Instantiate(Zone, toMouse.GetPoint(rhInfo.distance + 0.45f), Quaternion.identity);
                        //Debug.Log(rhInfo.collider.name + "   " + rhInfo.distance);
                    }
                    else
                        // Debug.Log("clicked on a empty space");
                        main = rhInfo;
                    pts.Add(main.point);
                }
            }
            Debug.Log(pts.Count);
        }
       	
}

Du coup j'aurais quelques question sur la partie renderer dans ton code, le renderer est celui de l'objet sur lequel je clic ou celui du motif à placer? Ton code provoque le changement de texture de l'objet maillé en entier?

Merci,

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: modification texture sur une partie d'un gameObject

Message par simonj » 30 Juin 2016 15:20

Dans l'idée, pour la deuxième solution c'est assez facile.

Tu as ton point sur ta texture grâce à ton Raycast donc c'est parfait.

Il suffit de savoir quoi dessiner, donc si ça peux être une forme géométrique procédurale (Un peu de math pour faire tous les calculs) ou bien une texture que tu connais. Par exemple une texture avec un motif que tu veux appliquer.

Tu part du point que tu viens de trouver sur ta texture, tu décales pour trouver le bord en haut à gauche et ensuite tu itères sur tous tes pixels de ta texture motif (En faisant bien attention que ça ne sorte pas de la texture destination) et tu fais un SetPixel sur la texture de destination en interpolant entre le pixel de la texture destination et le pixel de la texture motif.

Le gros problème de cette technique c'est que si tu as des UV un peu particulier sur ta texture, le motif peux possiblement s'appliquer sur plusieurs parties de ton modèle.
Et pour gérer la rotation de ton motif aussi, c'est pas forcément évident.

PS : Le code au dessus ne faisais rien de particulier à part te donner la texture du modèle sur lequel tu viens de cliquer. Mais c'est bien cette texture qu'il faut modifier pour appliquer le motif.

jesstrice66
Messages : 3
Inscription : 29 Juin 2016 15:03

Re: modification texture sur une partie d'un gameObject

Message par jesstrice66 » 30 Juin 2016 16:35

simonj a écrit :
Tu part du point que tu viens de trouver sur ta texture, tu décales pour trouver le bord en haut à gauche et ensuite tu itères sur tous tes pixels de ta texture motif (En faisant bien attention que ça ne sorte pas de la texture destination) et tu fais un SetPixel sur la texture de destination en interpolant entre le pixel de la texture destination et le pixel de la texture motif.
.

Cette partie là n'est pas très claire pour moi, le problème que j'ai actuellement c'est que lorsque je colle le motif sur l'objet, tout va bien tant qu'on reste complètement face à l'objet mais si ou tourne la vue, là ça devient très moche car on voit très bien que c'est un plan 2D posé sur un objet 3D et je ne sais pas comment faire pour régler ce problème. Je ne vois pas ce que tu veux dire par "tu décales".

Répondre

Revenir vers « les Shaders »