Search Unity

Question How to fix vertices after probuilder polymesh substract method?

Discussion in 'World Building' started by Ozgekocaoglu, Aug 9, 2022.

  1. Ozgekocaoglu

    Ozgekocaoglu

    Joined:
    Feb 13, 2019
    Posts:
    38
    Hello everyone,

    We are making our own navmesh, that's why i made a mesh tool to edit and create new meshes. I use
    https://github.com/karl-/pb_CSG this library (probuilder external library) to cutting polygons.
    Cutting is perfect, i can get perfect final touch.

    But problem is after cutting my mesh is looks like that:




    I snapped vertices and triangles and still my vertices here:




    Because of these complicated vertices, navmesh working wrong.


    My snap code is here:


    Code (CSharp):
    1. snappedVertices.Clear();
    2.     vertices.Clear();
    3.     indices.Clear();
    4.  
    5.     for(int i = 0; i < meshFilter.sharedMesh.vertices.Length; i++) {
    6.       var next = new Vector3(meshFilter.sharedMesh.vertices[i].x, 0, meshFilter.sharedMesh.vertices[i].z);
    7.       vertices.Add(next);
    8.     }
    9.  
    10.     foreach(var v in vertices) {
    11.       snappedVertices.Add(v);
    12.     }
    13.  
    14.  
    15.     for(int i = 0; i < snappedVertices.Count; i++) {
    16.       clearClosestVertices(i, snappedVertices[i]);
    17.     }
    18.  
    19.     snappedVertices = snappedVertices.Distinct().ToList();
    20.  
    21.     indices = meshFilter.sharedMesh.triangles.ToList();
    22.  
    23.     Func<Vector3, (Vector3, int)> getClosest = (Vector3 p) => {
    24.       float closestDistance = float.MaxValue;
    25.       Vector3 closestVector = Vector3.zero;
    26.       int closestIndex = 0;
    27.  
    28.       for (int i  = 0; i < snappedVertices.Count; i++) {
    29.         var diff = p - snappedVertices[i];
    30.         if (diff.sqrMagnitude < closestDistance) {
    31.           closestDistance = diff.sqrMagnitude;
    32.           closestVector = snappedVertices[i];
    33.           closestIndex = i;
    34.         }
    35.       }
    36.  
    37.       return (closestVector, closestIndex);
    38.     };
    39.  
    40.     newIndices = new List<int>();
    41.  
    42.     foreach(var v in indices.Select(i => vertices[i])) {
    43.       newIndices.Add(getClosest(v).Item2);
    44.     }
    45.  
    46.     meshFilter.sharedMesh.triangles = newIndices.ToArray();
    47.     meshFilter.sharedMesh.vertices = snappedVertices.ToArray();
    48.  
    49.     meshFilter.sharedMesh.UploadMeshData(false);

    I've tried vertex welding but i did not work.

    Any idea? What can i do?