Bonsoir,
j'aurais pu choisir le titre "Détection d'arête", mais je ne souhaite pas orienter la solution.
je travaille sur un projet (Unity 2021.3 URP) dans lequel le personnage récupère des objets divers (armes, munitions, nourriture, médicament ...). Une de ses statistiques est la perception, lui permettant de détecter plus ou moins facilement les objets récupérables. La détection dépend également de la distance de l'objet, de l'état de fatigue et de la vitesse du personnage, et du niveau de difficulté. Tout ceci fonctionne bien : la console affiche bien les messages comme "objet machin détecté" et "objet truc perdu de vue".
L'affaire s'est gâtée quand j'ai voulu déclencher un effet visuel quand l'objet est détecté, Avec Shader Graph, j'ai réalisé un shader qui teinte l'objet détecté. Malheureusement, je n'ai pas pu combiner son material avec le material de l'objet (pour mémoire shader URP/Lit avec une texture 4k dans laquelle sont prises les couleurs et les motifs).
J'ai alors tenté d'ajouter par code mon material avec mon shader. Cela me permet, au prix d'une certaine lourdeur, soit d'afficher cette teinte en laissant la texture de l'objet apparaitre (mais l'objet devient transparent), soit à colorer l'objet (on ne voit plus la texture). De plus cette coloration complète de l'objet est assez peu esthétique.
Je creuse donc dans une autre direction, je voudrais afficher en surbrillance seulement les arêtes de l'objet quand il est détecté (pour être clair : une boîte de munitions -> 6 arêtes droites, une boîte de conserve -> 2 cercles et 2 arêtes droites). Pour le moment, je souhaite n'avoir que les arêtes visibles, mais toutes les arêtes m'ira également si c'est plus simple.
Quelles seraient les pistes à explorer pour ceci ?
PS : les objets sont issus d'un asset de Synty Studio, Apocalypse.
[Résolu (quasi)] Création d'un effet visuel quand un objet est détecté.
[Résolu (quasi)] Création d'un effet visuel quand un objet est détecté.
Dernière édition par jmhoubre le 15 Sep 2022 22:52, édité 1 fois.
Re: Création d'un effet visuel quand un objet est détecté.
Pistes à explorer :
Billet assez complet sur la notion de depth.
- Script Edge detection des Standard Assets
- (--) Semble s'appliquer à toute la scène.
- Node Scene Depth de Shader Graph
Billet assez complet sur la notion de depth.
- boubouk50
- ModoGenereux
- Messages : 6246
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Création d'un effet visuel quand un objet est détecté.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
- boubouk50
- ModoGenereux
- Messages : 6246
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Création d'un effet visuel quand un objet est détecté.
Plutôt un shader de wireframe alors?
https://github.com/Chaser324/unity-wireframe (exemple parmi tant d'autres)
Le plus difficile sera de décider quelles sont les arêtes qui sont visibles ou non. Essayer de trouver un algo qui décide automatiquement en fonction des normales aux arêtes (smoothing group ou normale partagée pour les faces planes)
Dans ton cube, tu dessines les arêtes franches, mais en réalité tu as aussi les arêtes transversales de chaque face.
https://github.com/Chaser324/unity-wireframe (exemple parmi tant d'autres)
Le plus difficile sera de décider quelles sont les arêtes qui sont visibles ou non. Essayer de trouver un algo qui décide automatiquement en fonction des normales aux arêtes (smoothing group ou normale partagée pour les faces planes)
Dans ton cube, tu dessines les arêtes franches, mais en réalité tu as aussi les arêtes transversales de chaque face.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Création d'un effet visuel quand un objet est détecté.
Merci,
j'ai regardé, et il me semble que cette solution n'est pas compatible d'URP. Je vais quand même essayer.
j'ai regardé, et il me semble que cette solution n'est pas compatible d'URP. Je vais quand même essayer.
Re: Création d'un effet visuel quand un objet est détecté.
Bonsoir,
j'ai renoncé à mettre en œuvre cette solution, pour laquelle il me manque des connaissances.
J'ai poursuivi avec mon shader, et j'ai réussi à obtenir quelque chose qui me va : j'ai exposé la texture des objets, la couleur d'émission et un booléen HighLighted qui permet de déclencher ou non l'effet. Je n'ai pas les arêtes de l'objet, mais une illumination, ce qui me suffit.
Je partage le graphe, qui n'est pas une super réalisation, mais pourra peut-être servir à d'autres.
j'ai renoncé à mettre en œuvre cette solution, pour laquelle il me manque des connaissances.
J'ai poursuivi avec mon shader, et j'ai réussi à obtenir quelque chose qui me va : j'ai exposé la texture des objets, la couleur d'émission et un booléen HighLighted qui permet de déclencher ou non l'effet. Je n'ai pas les arêtes de l'objet, mais une illumination, ce qui me suffit.
Je partage le graphe, qui n'est pas une super réalisation, mais pourra peut-être servir à d'autres.
Re: [Résolu (quasi)] Création d'un effet visuel quand un objet est détecté.
Petit complément : il n'y a pas de méthode, à ma connaissance, SetBool.
J'ai donc modifié _HighLighted en float, mode integer. Un noeud Comparison réglé sur Not Equal compare _HighLighted à 0. Il est connecté aux 2 noeuds Branch.
Voici le code que j'utilise :
J'ai donc modifié _HighLighted en float, mode integer. Un noeud Comparison réglé sur Not Equal compare _HighLighted à 0. Il est connecté aux 2 noeuds Branch.
Voici le code que j'utilise :
Code : Tout sélectionner
using UnityEngine;
public abstract class Item : MonoBehaviour
{
private Renderer meshRenderer;
private Material highlightMaterial;
private int propertyID;
private void Awake ()
{
// Récupère le material.
meshRenderer = GetComponent<MeshRenderer> ();
highlightMaterial = meshRenderer.material;
// Identifiant du champ HighLighted.
propertyID = Shader.PropertyToID ("_HighLighted");
}
public void ActivateHighLightedMaterial ()
{
highlightMaterial.SetFloat (propertyID, 1);
}
public void UnActivateHighLightedMaterial ()
{
highlightMaterial.SetFloat (propertyID, 0);
}
}