在Unity3d中翻转3D游戏对象

3

在Unity3d中有没有一种方法可以翻转(镜像)3D游戏对象?

我想使用Unity游戏引擎的功能之一来翻转其中一个3D游戏对象。

2个回答

5

是的,实际上翻转一个物体并不难。以下是我的两个代码片段,可以实现此操作(我省略了显而易见的模板,包括抓取网格引用):

    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;
    }

我想给你的回答点赞,但我还是新手,只有11个积分。 - user9668888
2
只是补充一下,如果您还翻转了法线,则必须执行mesh.RecalculateBounds和mesh.RecalculateNormals。 - Rakiah

3

在检查器中,您可以通过设置X=-1Y=-1Z=-1来对对象进行缩放操作。根据要镜像的轴向。

代码实现方式如下:

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

例如,对于通过x轴进行镜像。

这适用于简单的对象。如果该对象是动画的,则会导致奇怪的行为。


1
这会产生负面影响,像zambari那样修改网格更好。虽然两个答案都值得点赞。 - PerformanceFreak
是的,正确的解决方案取决于使用情况。问题中没有提到使用情况。我建议我的(简单)解决方案仅适用于具有非复杂着色器的基本对象。 - dome12b
如果对象是动画的,或使用基本碰撞器,或使用普通纹理,或(很多东西)由于对所涉及的网格进行的计算混乱而可能出现问题。你甚至不能像那样缩放简单的立方体,它已经会产生一个警告告诉你“BoxColliders不支持负比例或大小”。 - N7D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接