Changement de texture précis après collision

Questions à propos du scripting Shader.
Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 30 Mars 2015 22:00

Tu dessines directement sur la texture en utilisant les coordonnées UV des points d'impact des raycast.
Mais pour dessiner un motif ça va être compliqué.

Le plus simple est de partir avec une texture où le motif existe déjà, avec un couche alpha à 0 (donc tout est totalement transparent)
Et au lieu de remplir avec des couleurs sur la texture, tu remplis des zones de la couche alpha pour faire apparaitre le motif.

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 31 Mars 2015 13:50

Je comprends pas trop ... :oops:

En gros j'ai déjà ma deuxième texture sur le mesh qui au départ est transparente et quand la pointe passe on la rend visible ? :roll:
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 31 Mars 2015 14:07

Déjà je pense avoir un petit soucis ... :oops:

J'ai réussi à créer des rayons, à faire des raycasts. Je reçois bien des coordonnées des points d'impacts quand je regarde la valeur de mon RayCastHit.point et je percute le bon mesh quand je regarde le RayCastHit.collider.gameObject.tag mais quand je veux récupérer le vecteur 2D correspondant au RayCastHit.textureCoord j'ai des valeurs nulles .... :oops:

Et quand j'applique la méthode du site officiel Unity3D dans la doc de TextureCoord (avec la multiplication par la largeur et hauteur des coordonnées) j'ai l'erreur :

NullReferenceException: Object reference not set to an instance of an object

Je comprends pas vu qu'il me renvoie le bon tag ... :roll:
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 31 Mars 2015 14:48

c'est étrange... tu peux me passer un package contenant une version légère de ton projet afin que je vois directement ce qu'il se passe ?
Et colle aussi ici le code source, pour commencer ;)

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 31 Mars 2015 15:12

Voici le code source sur un de mes 4 objets vides :

Code : Tout sélectionner

public class Raycasting_UV_2 : MonoBehaviour {

	public static bool Ray2;
	public static Vector3 point2;
	private Rigidbody mesh;


	// Use this for initialization
	void Start () {
		mesh = GetComponent<Rigidbody>();
	}

	void Update () {


		RaycastHit hit2;
		Vector2 uv;

		if (Ray2 = Physics.Raycast (mesh.transform.position, Vector3.down, out hit2, 8)) {
			point2 = hit2.point;
		}

		Renderer rend = hit2.transform.GetComponent<Renderer>();
		Texture2D tex = rend.material.mainTexture as Texture2D;
		Vector2 pixelUV = hit2.textureCoord2;

		/*pixelUV.x *= tex.width;
		pixelUV.y *= tex.height;
		tex.SetPixel(pixelUV.x, pixelUV.y, Color.black);
		tex.Apply();*/

	}
}

Je sais pas si c'est un problème avec la texture qui est déjà sur mon mesh qui est directement importé depuis blender vu que j'exporte en .FBX depuis blender. Quand je remplace Texture2D par Color et mainTexture par color j'ai bien des valeurs RGBA non nulles par contre. :|
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 31 Mars 2015 15:57

Plusieurs erreurs dans ton code, en voici un qui roule.
Il ne faut pas utiliser les variables statiques comme tu le fais. Une variable statique est commune à toutes les instances d'une même classe.
Pas non plus besoin de chopper le rigidbody, le transform est directement accessible. (et pas non plus besoin de rigibody tout court dans ce cas)
La fonction Physics.Raycast retourne true s'il y a impact, et rempli les données du RaycastHit qui lui est spécifié dans ce cas seulement, c'est pour ça que tu avais un objet null (car pas de collision détectée)

Assures-toi bien que la texture a l'option Read/Write enabled et que sont format est RGBA32

Code : Tout sélectionner

public class RayCasting_UV_2 : MonoBehaviour {

	// propriété contenant les données du dernier point d'impact
	private RaycastHit lastHit;

	// Use this for initialization
	void Start () {

	}
	
	void Update () {

		// variable locale pour récupérer le point d'impact actuel
		RaycastHit hit;

		if (Physics.Raycast (transform.position, Vector3.down, out hit, 8)) {
			// mémorisation du point d'impact s'il y a collision
			lastHit = hit;
		}

		// si un point d'impact est mémorisé, mise à jour de la texture
		if(lastHit.transform != null){
			Renderer rend = lastHit.transform.GetComponent<Renderer>();
			Texture2D tex = rend.material.mainTexture as Texture2D;
			if(tex != null){
				Vector2 pixelUV = lastHit.textureCoord2;

				pixelUV.x *= tex.width;
				pixelUV.y *= tex.height;

				tex.SetPixel((int)pixelUV.x, (int)pixelUV.y, Color.red);
				tex.Apply();
			}else{
				Debug.Log ("No texture !");
			}
		}
	}
}
Pour finir, je pense qu'il serait mieux de structurer ça autrement.
Au lieu de coller un script comme celui-ci sur chaque point de repère, tu devrais plutôt faire un seul script (associé à ton outil par exemple) dans lequel tu références les points de repères dans un tableau.
Et ensuite tu fais une boucle sur ce tableau pour détecter tous les points d'impacts, que tu dessineras ensuite en une seule fois sur la texture.

J'attends ta copie, tu as 3 heures. :mrgreen:

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 31 Mars 2015 16:05

Je vais bosser ça ! Je sais programmer c'est juste que le C# c'est nouveau pour moi donc j'ose pas trop à faire des trucs comme ça encore mais bon je vais me lancer merci .. :lol:
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Changement de texture précis après collision

Message par Alesk » 31 Mars 2015 16:10

Bah faut oser ! Tu ne risques pas grand chose hein, ça mord pas ;)

Avatar de l’utilisateur
Yondaime13
Messages : 55
Inscription : 16 Mars 2015 16:42

Re: Changement de texture précis après collision

Message par Yondaime13 » 31 Mars 2015 16:32

Comment tu accèdes à "Texture Import Settings" parce qu'il me dit :

UnityException: Texture '800pxhuman_hip_bone_texture' is not readable, the texture memory can not be accessed from scripts. You can make the texture readable in the Texture Import Settings.
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------

Avatar de l’utilisateur
LudlowFx
Messages : 1367
Inscription : 19 Sep 2013 05:50

Re: Changement de texture précis après collision

Message par LudlowFx » 31 Mars 2015 16:40

A part s'il y en a d'autres que je ne connais pas ou que tu parles d'autre chose, clique sur ta texture dans ton panel Project et dans le panel Inspector tu auras les paramètres d'imports de la texture sélectionné.
Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Répondre

Revenir vers « les Shaders »