Перелистывание трехмерных игровых объектов в Unity3d - PullRequest
0 голосов
/ 29 июня 2018

Есть ли способ перевернуть (отразить) трехмерный игровой объект в Unity3d?

Я хочу перевернуть один из 3D-объектов GameOb с использованием игрового движка Unity

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Да, перевернуть объект не так уж и сложно Вот два фрагмента моего кода, которые достигают этого (я пропустил очевидный шаблон, который захватывает ссылку на сетку):

    public bool flipX = true;
    public bool flipY;
    public bool flipZ;


 void Flip()
    {
        if (mesh == null) return;
        Vector3[] verts = mesh.vertices;
        for (int i = 0; i < verts.Length; i++)
        {
            Vector3 c = verts[i];
            if (flipX) c.x *= -1;
            if (flipY) c.y *= -1;
            if (flipZ) c.z *= -1;
            verts[i] = c;
        }

        mesh.vertices = verts;
        if (flipX ^ flipY ^ flipZ) FlipNormals();
    }

Одна важная деталь заключается в том, что в зависимости от конфигурации оси вам может потребоваться перевернуть грани нормали. Это достигается путем изменения порядка расположения вершин в массиве треугольников:

    void FlipNormals()
    {
        int[] tris = mesh.triangles;
        for (int i = 0; i < tris.Length / 3; i++)
        {
            int a = tris[i * 3 + 0];
            int b = tris[i * 3 + 1];
            int c = tris[i * 3 + 2];
            tris[i * 3 + 0] = c;
            tris[i * 3 + 1] = b;
            tris[i * 3 + 2] = a;
        }
        mesh.triangles = tris;
    }
0 голосов
/ 29 июня 2018

Вы можете масштабировать объект как X = -1 или Y = -1 или Z = -1 в инспекторе. По оси вы хотите отразить объект.

С помощью кода вы можете сделать это:

transform.localScale += new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z);

для зеркального отражения по оси x, например.

Это работает для простых объектов. Если объект анимирован, это вызовет странное поведение.

...