Я работаю над плагином уничтожения в реальном времени для единства, но я столкнулся с некоторыми проблемами, связанными с манипулированием сеткой.
, что я пытаюсь сделать:
cutотверстие из сетки, удалив переднюю и заднюю стороны 3d-сетки.
Пример изображения
что я делаю:
Я удаляю часть оригинальной сетки (вна данный момент это всего лишь один треугольник), клонирующий его и помещающий в другую сетку (просто фоновая информация).
то, что моя делает / выглядит как
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 обеих сторон, а затем передать / вернуть мне.Я потерялся, пожалуйста, помогите!