[MY-AL] Calculer surfaces et positions des polygons d'un mesh

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Blownn
Messages : 5
Inscription : 06 Nov 2020 16:21

[MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Blownn » 06 Nov 2020 17:30

Bonjour :)

Voici mon problème, j'aurais besoin de récupérer différentes infos sur les polygones qui composent un mesh relativement lowpoly (entre 30 et 60 triangles).

J'aimerais storer au Start, dans un/des tableaux l’ensemble des polygones du mesh en question
L'idée est de pouvoir ensuite faire appel à chaque polygone indépendamment et avoir accès à sa surface, sa position.. etc

Je me débrouille plutôt sur Unity ayant déjà programmé plusieurs jeux et applications 3D mais j'ai vraiment aucunes connaissances sur la manipulation d'un mesh.
J'ai pu trouver des infos sur le calcul de surfaces, la position et l'orientation de poly mais pas moyen de comprendre comment mixer tout ça pour arriver à mes fins :gene:

Merci d'avance à tous ceux qui passeront par là :hello: !

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 8061
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Max » 06 Nov 2020 19:20

Bonsoir,

as-tu regardé du coté des paramètre des Mesh ?
Tu peux récupérer l'ensemble de info liées au maillage de ton mesh.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Blownn
Messages : 5
Inscription : 06 Nov 2020 16:21

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Blownn » 07 Nov 2020 16:35

Salut,
j'ai regardé les paramètres des Mesh oui, encore aujourd'hui, je vois bien que c'est ce qu'il me faut mais j'arrive vraiment pas à comprendre comment me servir de ça.

Une fois que j'ai mes array vertices et triangles, comment je peut accéder à la position de chaque triangles ?
Est-ce que je dois moi même faire un calcul avec les positions des trois points du triangle en question?

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 8061
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Max » 07 Nov 2020 17:15

Blownn a écrit :
07 Nov 2020 16:35
Une fois que j'ai mes array vertices et triangles, comment je peut accéder à la position de chaque triangles ?
Est-ce que je dois moi même faire un calcul avec les positions des trois points du triangle en question?
Là il te faut reprendre les fondamentaux sur la constitution des mesh (maillage, vertices, etc...)
Dans ton cas tu auras un tableau de vertices d'un coté et de l'autre le tableau des indexs formant les tri.
Par exemple le premier tri sera formé avec le vertex[id[0]], le vertex[id[1]]et enfin le vertex[id[2]]. Et ainsi de suite pour chaque tri.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Blownn
Messages : 5
Inscription : 06 Nov 2020 16:21

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Blownn » 07 Nov 2020 19:56

Oui je vois, voici ce que j'ai aujourd'hui
La pièce jointe Capture_01.PNG n’est plus disponible
Capture_01.PNG
Capture in game
Capture_01.PNG (275.28 Kio) Consulté 192 fois
Je retrouve le bon nombre de vertex et de poly. Je fait un Raycast sur les positions estimées des poly pour vérifier.
Il semblerais que ça fonctionne pour certain et pas pour d'autres. Certain raycast sont lancés depuis l'interieur du mesh comme si sa position était calculée avec des points qui ne sont pas reliés..
Est-il possible que le vertex 4 d'un mesh ne soit pas rattaché aux 2 et 3 ?

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 8061
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Max » 07 Nov 2020 20:15

Blownn a écrit :
07 Nov 2020 19:56
Je fait un Raycast sur les positions estimées des poly pour vérifier.
Il semblerais que ça fonctionne pour certain et pas pour d'autres. Certain raycast sont lancés depuis l’intérieur du mesh
je dirais normal, si tu cherches à faire un Raycast par "l'arrière" d'une face, tu n'auras pas de résultats. Le test doit toujours se faire vers le plan orienté par la normale de la face. On ne fait pas de test fiable à partir de l’intérieur d'un mesh.
Blownn a écrit :
07 Nov 2020 19:56
Est-il possible que le vertex 4 d'un mesh ne soit pas rattaché aux 2 et 3 ?
oui bien sur. Les vertices dans le tableau ne sont bien souvent en rien organisé de manière contigües. Ce sont les Id
(contenu dans le tableau Triangles ) qui comptent pour déterminer l'organisation des faces.

PS: ne poste pas de screen de ton code, c'est souvent inexploitable et interdit tout copié/collé si quelqu'un veut par exemple tester. Poste le script directement, entre les bonnes balises (Cf la charte, lien dans ma signature)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Blownn
Messages : 5
Inscription : 06 Nov 2020 16:21

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Blownn » 10 Nov 2020 18:46

Hey :)

Alors voilà, j'ai fait quelques modifs et essayé pas mal de chose cet aprèm mais j'ai toujours un soucis.
J'ai besoin de récupérer les normals de chaque poly, et je n'arrive pas à faire correspondre la bonne normal au bon poly. :?
J'imagine que le "Mesh.Normals" classe les normals dans un autre ordre encore que le "Mesh.Triangles" ..


Voici ce que j'ai pour le moment:

Code : Tout sélectionner

public class AeroDynamicMesh : MonoBehaviour
{     

    Vector3[] posTrianglesA;     			//Tableau position polygons
    Vector3[] meshVertexA;    			//Tableau vertex
    Vector3[] meshNormalsA;    //Tableau vertex

    int[] meshTrianglesA;       //tableau polygons du mesh

    // Start is called before the first frame update
    void Start()
    {
        Mesh aeroMesh = GetComponent<MeshFilter>().mesh;

        meshVertexA = aeroMesh.vertices;                        //tableau vertex init
        meshTrianglesA = aeroMesh.triangles;                    //tableau poly init
        meshNormalsA = aeroMesh.normals;                        

        posTrianglesA = new Vector3[meshTrianglesA.Length];     //tableau Position poly init 


       //   UnityEngine.Debug.Log("VertexCount = " + meshVertexA.Length/3);             //Check
       //   UnityEngine.Debug.Log("PolyCount = " + meshTrianglesA.Length/3);            //Check
       //   UnityEngine.Debug.Log("NormalsCount = " + meshNormalsA.Length);             //Check
    }

    private void Update()
    {
        //Definition des vector3 de chaques poly

        for (int i = 0; i < meshTrianglesA.Length / 3; i++)
        {

            // UnityEngine.Debug.Log("Entree");
            posTrianglesA[i] = new Vector3(((transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 0]]).x) + (transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 1]]).x) + (transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 2]]).x)) / 3,
                                            ((transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 0]]).y) + (transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 1]]).y) + (transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 2]]).y)) / 3,
                                            ((transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 0]]).z) + (transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 1]]).z) + (transform.TransformPoint(meshVertexA[meshTrianglesA[i * 3 + 2]]).z)) / 3
                                             );

            UnityEngine.Debug.DrawRay(posTrianglesA[i], meshNormalsA[i], Color.magenta);     //CHECK

        }
    
    }
Quand je teste sur un cube, les deux premières normals s'affichent correctement puis, plus aucune normals n'est dans la bonne direction.
D'après moi la normale récupérée dans meshNormalsA ne correspond pas au poly au poly du même ID, enfin c'est que je comprend ici.
Comment je peux faire pour faire correspondre la normal au bon poly ?

Avatar de l’utilisateur
Max
Newser
Newser
Messages : 8061
Inscription : 30 Juil 2011 13:57
Contact :

Re: [MY-AL] Calculer surfaces et positions des polygons d'un mesh

Message par Max » 10 Nov 2020 19:56

Bonsoir,

le tableau des normales contient les normales des vertices et non des tri, comme spécifié dans la doc.
Si tu as (comme pour un cube) 36 vertices, alors tu auras les 36 normales correspondantes.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »