Changement de texture précis après collision
Re: Changement de texture précis après collision
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.
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.
- Yondaime13
- Messages : 55
- Inscription : 16 Mars 2015 16:42
Re: Changement de texture précis après collision
Je comprends pas trop ...
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 ?
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 ?
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
- Yondaime13
- Messages : 55
- Inscription : 16 Mars 2015 16:42
Re: Changement de texture précis après collision
Déjà je pense avoir un petit soucis ...
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 ....
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 ...
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 ....
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 ...
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
Re: Changement de texture précis après collision
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
Et colle aussi ici le code source, pour commencer
- Yondaime13
- Messages : 55
- Inscription : 16 Mars 2015 16:42
Re: Changement de texture précis après collision
Voici le code source sur un de mes 4 objets vides :
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.
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();*/
}
}
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
Re: Changement de texture précis après collision
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
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.
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 !");
}
}
}
}
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.
- Yondaime13
- Messages : 55
- Inscription : 16 Mars 2015 16:42
Re: Changement de texture précis après collision
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 ..
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
Re: Changement de texture précis après collision
Bah faut oser ! Tu ne risques pas grand chose hein, ça mord pas
- Yondaime13
- Messages : 55
- Inscription : 16 Mars 2015 16:42
Re: Changement de texture précis après collision
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.
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.
----------------------------------------
La bêtise, c'est de la paresse.
----------------------------------------
Re: Changement de texture précis après collision
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 !