déterminer nombre et positions des sommets d'un objet complexe

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
Avatar de l’utilisateur
Kaloverian
Messages : 341
Inscription : 10 Août 2016 03:03

déterminer nombre et positions des sommets d'un objet complexe

Message par Kaloverian » 14 Avr 2020 18:51

bonjour,

Voici un script C# permettant pour de déterminer les vecteurs positions (position globale) des sommets d'un cube avec un scale spécifique:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//le but de ce script est donner la  position globale des vertices(sommets) du cube quelle que soit sa transformation
//ce script est à appliquer sur le cube concerné
//il faut remplir la matrice 4x4 que par des 1
//appliquer ce script à un special_objet oblige de le scaler à 100 et de rien transformer sur ses enfants
//si l'objet ,sur lequel le comptage de sommets est établi, est parenté à un empty, appliquer ce script sur l'objet et non sur l'empty
//problème:pour special_objet, tous les sommets ne sont pas pris en compte malgré le nombre bon de sommets configuré

public class vertex_global_position : MonoBehaviour {

    public GameObject objet,empty;
    public Mesh mesh;
    public int nombre_sommets;
    List <GameObject> EmptySommetList;
    int i;
   
    public Matrix4x4 localToWorldMatrix ;
   

    void Start()
    {
      //objet.AddComponent<MeshRenderer>();
      // objet.AddComponent<MeshFilter>().mesh = mesh;
     mesh = GetComponent < MeshFilter > (). mesh;
     EmptySommetList = new List<GameObject>();
        
 

    MeshFilter mf = objet.GetComponent<MeshFilter>();
    Matrix4x4 localToWorld = transform.localToWorldMatrix;
     
    for (i = 0; i < nombre_sommets; i++)
        {
            EmptySommetList.Add(empty);
            EmptySommetList[i] = new GameObject("sommet" + i);

             
            Vector3 world_Pt = transform.TransformPoint(mesh.vertices[i]);

            EmptySommetList[i].transform.position =transform.TransformPoint(mesh.vertices[i]);
           

 
            print("composante_x_sommet "+i+" :"+world_Pt.x+",composante_y_sommet "+i+" :"+world_Pt.y+",composante_z_sommet "+i+" :"+world_Pt.z);
            }

        }//fin Update()
}//fin class



Ici,je choisis nombre_sommets=8
Avec ce code,un empty est placé sur chaque sommet.
Ça fonctionne !

Mais si j''ai affaire à un objet plus complexe(par exemple une croix en 3 dimensions):
1)je ne suis plus sûr du nombre de sommets à entrer
2)si ce nombre dépasse le bon nombre de sommets,,il y aura des doublons et des sommets en trop

Comment dois-je modifier le code pour déterminer avec précision les postions globales et le nombre de sommets d'un objet 3D plus complexe?

merci de votre aide
Dernière édition par Kaloverian le 14 Avr 2020 19:17, édité 1 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par boubouk50 » 14 Avr 2020 19:03

Depuis le MeshFilter, tu as accès au Mesh qui te donne accès notamment au VertexCount.

Attention tout de même aux sommets dupliqués. Je ne suis pas sur que le vertexCount te donne le bon chiffre, sachant que certains sommets sont dupliqués pour les hard edges, les coupures d'UVs, autre matériau, etc. Il te faudra peut être comparer les positions de chacun des sommets pour exclure les dupliqués.

Regarde aussi ce que le tableau vertices te sort comme nombre.
"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

Avatar de l’utilisateur
Kaloverian
Messages : 341
Inscription : 10 Août 2016 03:03

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par Kaloverian » 14 Avr 2020 19:59

avec ce code tiré de :
https://docs.unity3d.com/ScriptReferenc ... Count.html

appliqué à un cube,ça me retourne 24 au lieu de 8 !

Pourquoi?

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par djulio74 » 14 Avr 2020 20:05

Parce que comme le disait boubouk, dans de nombreux cas plusieurs vertex sont superposé pour créer des arrête saillante. Dans ton cas du cube, chaque face est composé de 4. Vertex indépendant des autres faces, tu as donc 4x 6 vertex. C'est tout à fait normal.
Il faut que les arrêtes soient adoucies, smooth comme on dit pour n'avoir qu'un vertex par sommet au lieu 3

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Kaloverian
Messages : 341
Inscription : 10 Août 2016 03:03

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par Kaloverian » 14 Avr 2020 20:10

smooth avec Blender et pas avec Unity,, est-ce cela?

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par djulio74 » 14 Avr 2020 20:16

Oui. Dans unity les mesh de base (cube, sphère....) ne sont pas éditable.
Dans blender, créer un cube et smooth les vertex avec un angle supérieur à 90. Par contre à l'affichage ton cube n'aura plus la même apparence du fait qu'il n'aura plus les arrêtes saillantes.

Par contre à essayer je sais pas ce que ça donne mais c'est mettre, dans unity, un mesh collider à ton cube et le mettre en convex. Le collider devrait être généré, et peut être avec les vertex weldé ( weld), et te servir de ce mesh ( getcomponent meshcollider sharedmesh) pour en récupérer les vertex

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
Kaloverian
Messages : 341
Inscription : 10 Août 2016 03:03

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par Kaloverian » 14 Avr 2020 22:50

Ce n'est pas ici un forum sur Blender mais malgré des essais différents sur Blender:
-l'application en mode Objet du modificateur Adoucir donnera sur Unity un nombre de vertices nul !
-le passage en mode Edit>mode vertex>tout sélectionner>adoucir vertex donnera sur Unity 24 vertices !
Bref,je ne trouve sur Blender la bonne technique pour adoucir convenablement mon cube de manière à ce que sur Unity le nombre de sommets renvoyé soit 8 !

Peut-on m'aider malgré tout?

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par djulio74 » 14 Avr 2020 23:42

si c'est un mesh importé alors directement dans unity tu peux le faire.
une fois importé, tu le selectionne sans le mettre dans la scene, tu as des option d'import dans l'inspecteur :
- coche "weld vertices"
- Met "Normals" sur "calculate"
- Met le "Smoothing angle" au max ( 180)
- clique sur "Apply"

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6208
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par boubouk50 » 15 Avr 2020 10:41

Je pense qu'il faut faire une gestion du nombre de sommets dans Unity pour pouvoir travailler sur tous les meshs possibles.
Comme déjà évoqué, le tableau vertices de la classe Mesh te permet de récupérer tous les sommets du mesh. Un simple test sur les positions te permettrait de récupérer seulement les sommets distincts quelque soit le modèle à la base. Comme je suppose que tu ne fais ce test qu'une seule fois (et pas à chaque frame), cette solution me semble viable.
"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

Avatar de l’utilisateur
Kaloverian
Messages : 341
Inscription : 10 Août 2016 03:03

Re: déterminer nombre et positions des sommets d'un objet complexe

Message par Kaloverian » 15 Avr 2020 14:34

Où télécharger le package weld_vertices?

Répondre

Revenir vers « (C#) CSharp »