Unity - Сгенерированный скриптом меш имеет некорректное освещение - PullRequest
0 голосов
/ 12 мая 2018

У меня есть сценарий, который разбивает куб на четыре равные треугольные призмы, при этом панель GameObject является исходным разрушенным объектом.Каждая призма полностью создается сценарием путем назначения вершин и треугольников пустой сетке, а исходный объект уничтожается.

    // 2D Points which will connect to the center to form triangles
    List<Vector2> shatterPoints = new List<Vector2> {new Vector2(-0.5f, -0.5f),
        new Vector2(-0.5f, 0.5f), new Vector2(0.5f, 0.5f), new Vector2(0.5f, -0.5f)};

    // Generate each fragment
    for (int i = 0; i < shatterPoints.Count; i++) {
        GameObject Fragment = new GameObject("Empty"); // Create game object
        Fragment.AddComponent<MeshFilter>();
        Fragment.AddComponent<MeshRenderer>();

        Vector3 point1 = shatterPoints[i]; // Grab the two edge points for this fragment
        Vector3 point2;
        if (i + 1 == shatterPoints.Count) {
            point2 = shatterPoints[0];
        } else {
            point2 = shatterPoints[i + 1];
        }

        Mesh FragMesh = new Mesh(); // Create the mesh

        FragMesh.vertices = new Vector3[] {point1 + Vector3.forward * 0.5f,
            point2 + Vector3.forward * 0.5f, new Vector3(0f, 0f, 0.5f),
            new Vector3(0f, 0f, -0.5f), point2 - Vector3.forward * 0.5f,
            point1 - Vector3.forward * 0.5f};
        FragMesh.triangles = new int[] {1,0,2,  5,4,3,  0,5,3,  3,2,0,  4,5,0,  0,1,4,  1,2,3,  3,4,1};

        // Copy important properties from the original piece to the fragment
        Fragment.GetComponent<MeshFilter>().mesh = FragMesh;
        Fragment.transform.position = Panel.transform.position;
        Fragment.transform.rotation = Panel.transform.rotation;
        Fragment.transform.localScale = Panel.transform.localScale;

        Fragment.GetComponent<Renderer>().material = Panel.GetComponent<Renderer>().material;
        FragMesh.RecalculateNormals();

        // Add force here later (and a rigidbody while you're at it)
    }

    Destroy(Panel);

Вот изображения куба до и после разрушения:

Куб перед разрушением

Куб после разрушения и ручного перемещения фрагментов

Хотя я пересчитываю нормали каждого фрагмента в сценарии, освещаякажется неправильным.Я новичок в генерации процедурных сеток, так может кто-нибудь пролить свет на это?(не каламбур). Спасибо, что уделили время.

1 Ответ

0 голосов
/ 14 мая 2018

Атрибуты, которые вы видите, связаны с тем, что группы сглаживания одинаковы для всех вновь созданных сеток. Конечно, можно было бы создать отдельные веры для каждого лица, чем единство не будет пытаться сгладить края,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...