[Résolu] [DB-AL] Création d'un mesh par code

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
Eanix
Messages : 62
Inscription : 08 Mai 2015 19:06

[Résolu] [DB-AL] Création d'un mesh par code

Message par Eanix » 22 Mars 2017 22:20

Bonjour, bonsoir,

Je fais appel à votre aide pour mon problème. Je suis sur un projet 2D; J'ai fait un système de champs de vision et lorsque le mesh est créer, il est invisible à la caméra orthographique et je suis obliger de passer en 3D pour me mettre face à la caméra et voir le champ de vision.

Vue de la camera :

Image


Vue face à la caméra :

Image

Ma question est : savez-vous comment mettre la face visible vers la caméra ?

Voici mon script :

Code : Tout sélectionner

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

public class FieldOfView : MonoBehaviour
{

    public float viewRadius;

    [Range(0, 360)]
    public float viewAngle;

    public LayerMask targetMask;
    public LayerMask obstacleMask;

    [HideInInspector]
    public List<Transform> visibleTargets = new List<Transform>();

    public float meshResolution;
    public int edgeResolveIterations;
    public float edgeDstThreshold;

    public MeshFilter viewMeshFilter;
    Mesh viewMesh;

    void Start()
    {
        viewMesh = new Mesh();
        viewMesh.name = "View Mesh";
        viewMeshFilter.mesh = viewMesh;

        StartCoroutine("FindTargetsWithDelay", .2f);
    }


    IEnumerator FindTargetsWithDelay(float delay)
    {
        while (true)
        {
            yield return new WaitForSeconds(delay);
            FindVisibleTargets();
        }
    }

    void LateUpdate()
    {
        DrawFieldOfView();
    }

    void FindVisibleTargets()
    {
        visibleTargets.Clear();
        Collider2D[] targetsInViewRadius = Physics2D.OverlapCircleAll(transform.position, viewRadius, targetMask);

        for (int i = 0; i < targetsInViewRadius.Length; i++)
        {
            Transform target = targetsInViewRadius[i].transform;
            Vector2 dirToTarget = (target.position - transform.position).normalized;
            if (Vector2.Angle(transform.up, dirToTarget) < viewAngle / 2)
            {
                float dstToTarget = Vector2.Distance(transform.position, target.position);

                if (!Physics2D.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask))
                {
                    visibleTargets.Add(target);
                }
            }
        }
    }

    void DrawFieldOfView()
    {
        int stepCount = Mathf.RoundToInt(viewAngle * meshResolution);
        float stepAngleSize = viewAngle / stepCount;
        List<Vector3> viewPoints = new List<Vector3>();
        ViewCastInfo oldViewCast = new ViewCastInfo();
        for (int i = 0; i <= stepCount; i++)
        {
            float angle = transform.eulerAngles.z - viewAngle / 2 + stepAngleSize * i;
            ViewCastInfo newViewCast = ViewCast(angle);

            if (i > 0)
            {
                bool edgeDstThresholdExceeded = Mathf.Abs(oldViewCast.dst - newViewCast.dst) > edgeDstThreshold;
                if (oldViewCast.hit != newViewCast.hit || (oldViewCast.hit && newViewCast.hit && edgeDstThresholdExceeded))
                {
                    EdgeInfo edge = FindEdge(oldViewCast, newViewCast);
                    
                    if (edge.pointA != Vector3.zero)
                    {
                        viewPoints.Add(edge.pointA);
                    }
                    if (edge.pointB != Vector3.zero)
                    {
                        viewPoints.Add(edge.pointB);
                    }
                }

            }


            viewPoints.Add(newViewCast.point);
            oldViewCast = newViewCast;
        }

        int vertexCount = viewPoints.Count + 1;
        Vector3[] vertices = new Vector3[vertexCount];
        int[] triangles = new int[(vertexCount - 2) * 3];

        vertices[0] = Vector3.zero;
        for (int i = 0; i < vertexCount - 1; i++)
        {
            vertices[i + 1] = transform.InverseTransformPoint(viewPoints[i]);

            if (i < vertexCount - 2)
            {
                triangles[i * 3] = 0;
                triangles[i * 3 + 1] = i + 1;
                triangles[i * 3 + 2] = i + 2;
            }
        }

        viewMesh.Clear();

        viewMesh.vertices = vertices;
        viewMesh.triangles = triangles;
        viewMesh.RecalculateNormals();
    }


    EdgeInfo FindEdge(ViewCastInfo minViewCast, ViewCastInfo maxViewCast)
    {
        float minAngle = minViewCast.angle;
        float maxAngle = maxViewCast.angle;
        Vector2 minPoint = Vector2.zero;
        Vector2 maxPoint = Vector2.zero;

        for (int i = 0; i < edgeResolveIterations; i++)
        {
            float angle = (minAngle + maxAngle) / 2;
            ViewCastInfo newViewCast = ViewCast(angle);

            bool edgeDstThresholdExceeded = Mathf.Abs(minViewCast.dst - newViewCast.dst) > edgeDstThreshold;
            if (newViewCast.hit == minViewCast.hit && !edgeDstThresholdExceeded)
            {
                minAngle = angle;
                minPoint = newViewCast.point;
            }
            else
            {
                maxAngle = angle;
                maxPoint = newViewCast.point;
            }
        }

        return new EdgeInfo(minPoint, maxPoint);
    }


    ViewCastInfo ViewCast(float globalAngle)
    {
        Vector2 dir = DirFromAngle(globalAngle, true);
        RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, viewRadius, obstacleMask);

        if (hit)
        {
            return new ViewCastInfo(true, hit.point, hit.distance, globalAngle);
        }
        else
        {
            return new ViewCastInfo(false, new Vector2(transform.position.x,transform.position.y) + dir * viewRadius, viewRadius, globalAngle);
        }
    }


    public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
    {
        if (!angleIsGlobal)
        {
            angleInDegrees += transform.eulerAngles.z;
        }
        return new Vector3(Mathf.Sin(-angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(-angleInDegrees * Mathf.Deg2Rad), 0);
    }

    public struct ViewCastInfo
    {
        public bool hit;
        public Vector3 point;
        public float dst;
        public float angle;

        public ViewCastInfo(bool _hit, Vector3 _point, float _dst, float _angle)
        {
            hit = _hit;
            point = _point;
            dst = _dst;
            angle = _angle;
        }
    }

    public struct EdgeInfo
    {
        public Vector3 pointA;
        public Vector3 pointB;

        public EdgeInfo(Vector3 _pointA, Vector3 _pointB)
        {
            pointA = _pointA;
            pointB = _pointB;
        }
    }
}

Merci d'avance !!!
Dernière édition par Eanix le 23 Mars 2017 22:29, édité 2 fois.
Un petit pas dans la technologie, un grand fouillis dans ma tête :hehe:

Avatar de l’utilisateur
Axel74
Messages : 100
Inscription : 23 Mai 2014 16:47
Localisation : Thonon - Lyon

Re: [DB-AL] Custom Mesh, Face du mauvais côté.

Message par Axel74 » 23 Mars 2017 04:49

Je dis peut être une bêtise mais t'es deux images ne semble pas coller, l'une est à l'envers. Si il ne regarde pas du bon côté c'est probablement car la valeur de la taille orthographic est négative :

Image
Douille ou l'ail que pote étaux ? Yes I like.

Avatar de l’utilisateur
Eanix
Messages : 62
Inscription : 08 Mai 2015 19:06

Re: [DB-AL] Custom Mesh, Face du mauvais côté.

Message par Eanix » 23 Mars 2017 11:47

Sa aurais pu être ça mais non ! ^^

En fait ce n'est pas une image c'est un mesh qui fonctionne un peu comme un rayon de lumière (donc quand il touche quelque chose il ne va pas plus loin). Je sait pas trop comment l'expliquer mais ce n'est pas une image bien que sa aurais pu y faire pensé ;-) .

Je vous renvois une image pour vous montrez ce que ça donne quand j'augmente le rayon à 10 unités et le champs visuel à 360°.

Image

Personne ne sait comment je pourrais mettre la face visible du mesh côté camera ? Je vous met aussi l'asset du projet, ça vous aidera à comprendre mon problème !

http://www.mediafire.com/file/hrb8aj6rw ... itypackage
Un petit pas dans la technologie, un grand fouillis dans ma tête :hehe:

Avatar de l’utilisateur
Drakulo
Messages : 113
Inscription : 10 Mars 2017 22:49
Contact :

Re: [DB-AL] Création d'un mesh par code

Message par Drakulo » 25 Mars 2017 10:30

Je pense qu'il faut tout simplement que tu inverses les Normales de ton Mesh : http://wiki.unity3d.com/index.php?title=ReverseNormals
Fun Games Maker @TriplArt
Coach à esprit UNITY : Finissez vos jeux, vivez de votre passion
Enseignant de programmation / Unity3D à Bellecour Ecole

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

Re: [DB-AL] Création d'un mesh par code

Message par Max » 25 Mars 2017 11:45

Drakulo a écrit :Je pense qu'il faut tout simplement que tu inverses les Normales de ton Mesh
je pense en effet que c'est le soucis, plus généralement un problème d'orientation des faces.
Dans ton cas, cela se traduirait par remplacer

Code : Tout sélectionner

triangles[i * 3] = 0;
triangles[i * 3 + 1] = i + 1;
triangles[i * 3 + 2] = i + 2;
par

Code : Tout sélectionner

triangles[i * 3] = i + 2;
triangles[i * 3 + 1] = 0;
triangles[i * 3 + 2] = i + 1;
(à tester)
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

Avatar de l’utilisateur
Eanix
Messages : 62
Inscription : 08 Mai 2015 19:06

Re: [DB-AL] Création d'un mesh par code

Message par Eanix » 26 Mars 2017 23:17

Merci ! :) :-D :P ::d :hehe: :ghee:
Désolé j'en ai fait trop =)

Merci de m'avoir répondu premièrement et aussi d'avoir résolu mon problème je cherchais une solution depuis quelques semaines en vain.

plus exactement il fallait que je le remplace par ceci :

Code : Tout sélectionner

triangles[i * 3] = i + 2;
triangles[i * 3 + 1] = i + 1;
triangles[i * 3 + 2] = 0;
:merci: Encore une fois Merci à vous :merci:
Un petit pas dans la technologie, un grand fouillis dans ma tête :hehe:

Répondre

Revenir vers « (C#) CSharp »