Page 3 sur 7

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

Publié : 30 Mars 2015 22:00
par Alesk
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.

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

Publié : 31 Mars 2015 13:50
par Yondaime13
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:

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

Publié : 31 Mars 2015 14:07
par Yondaime13
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:

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

Publié : 31 Mars 2015 14:48
par Alesk
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 ;)

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

Publié : 31 Mars 2015 15:12
par Yondaime13
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. :|

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

Publié : 31 Mars 2015 15:57
par Alesk
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:

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

Publié : 31 Mars 2015 16:05
par Yondaime13
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:

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

Publié : 31 Mars 2015 16:10
par Alesk
Bah faut oser ! Tu ne risques pas grand chose hein, ça mord pas ;)

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

Publié : 31 Mars 2015 16:32
par Yondaime13
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.

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

Publié : 31 Mars 2015 16:40
par LudlowFx
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é.