RaycastHit.triangleIndex альтернативы - PullRequest
0 голосов
/ 26 декабря 2018

Я работаю над плагином уничтожения в реальном времени для единства, но я столкнулся с некоторыми проблемами, связанными с манипулированием сеткой.

, что я пытаюсь сделать:

cutотверстие из сетки, удалив переднюю и заднюю стороны 3d-сетки.

Пример изображения

Example image

что я делаю:

Я удаляю часть оригинальной сетки (вна данный момент это всего лишь один треугольник), клонирующий его и помещающий в другую сетку (просто фоновая информация).

то, что моя делает / выглядит как

what mine does/looks like

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

public class destroy : MonoBehaviour 
{

    public GameObject ttt;

    // Use this for initialization
    void Start () {

    }


    void deleteTri(int index)  // what is index? index is hit.triangleIndex the triangle that the mouse hit, this number is relative to the top rightmost triangle 
    {
        GameObject clone = Instantiate(this.gameObject);
        Destroy(clone.GetComponent<distroy>());
        Destroy(clone.GetComponent<MeshCollider>());


        Destroy(this.gameObject.GetComponent<MeshCollider>()); // removes prevouse render of shape 
         Mesh mesh = transform.GetComponent<MeshFilter>().mesh; // gets mesh (oop)


        int[] oldTriangles = mesh.triangles;  // current total number of triangles
        int[] oldTriangles2 = mesh.triangles;  

        int[] newTriangles = new int[mesh.triangles.Length - 3];
        int[] otherTriangles = new int[mesh.triangles.Length - 3];

        int i = 0;
        int j = 0;
        int j2 = 0;
        int i2 = 0;
        while (j < mesh.triangles.Length)  // makeing a new list of all the vector points in the mesh when it finds the mesh you have made it skips those three vector points and finishes the list this then removes that point from the mesh 
        {
            if(j != index*3)
            {
                newTriangles[i++] = oldTriangles[j++];
                newTriangles[i++] = oldTriangles[j++];
                newTriangles[i++] = oldTriangles[j++];
            }
            else
            {
                 j += 3;
            }


            // this is for making the second mesh and is an inverse of the original code 
            if (j2 == index * 3)
            {
                otherTriangles[i2++] = oldTriangles2[j2++];
                otherTriangles[i2++] = oldTriangles2[j2++];
                otherTriangles[i2++] = oldTriangles2[j2++];
            }
            else
            {
               j2 += 3;
            }

        }
        transform.GetComponent<MeshFilter>().mesh.triangles = newTriangles;  //says this is the new mesh 
        this.gameObject.AddComponent<MeshCollider>(); // renders the mesh 

        clone.transform.GetComponent<MeshFilter>().mesh.triangles = otherTriangles;  //says this is the new mesh 
        clone.gameObject.AddComponent<MeshCollider>(); // renders the mesh 




    }



    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Ray ray2 = Camera.main.ViewportPointToRay(ttt.transform.position);

            if (Physics.Raycast(ray, out hit, 1000.0f))
            {
                deleteTri(hit.triangleIndex);
               // print(hit.triangleIndex);
               // print(ray2.hit.triangleIndex);
                //print(ray.triangleIndex);
            }
        }
    }
}

проблема с моим текущим кодом в том, что он работает только для плоской сетки, а не для 3d-сетки.Это потому, что приведение лучей прекращается, когда оно попадает во что-то, мне нужна программа, чтобы определить triangleIndex обеих сторон, а затем передать / вернуть мне.Я потерялся, пожалуйста, помогите!

...