【问题标题】:Flipping 3D Gameobjects in Unity3d在 Unity3d 中翻转 3D 游戏对象
【发布时间】:2018-06-29 11:07:18
【问题描述】:

有没有办法在 Unity3d 中翻转(镜像)一个 3D 游戏对象?

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

【问题讨论】:

    标签: c# unity3d 3d game-engine


    【解决方案1】:

    是的,翻转一个物体实际上并不难。这是实现此目的的代码的两个 sn-ps(我省略了获取网格引用的明显样板):

        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 分
    • 只是补充说你必须做mesh.RecalculateBounds和mesh.RecalculateNormals,如果你也翻转了法线
    【解决方案2】:

    您可以在检查器中通过X = -1Y = -1Z = -1 缩放对象。根据你要镜像对象的轴。

    通过代码,您可以这样做:

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

    以 x 轴镜像为例。

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

    【讨论】:

    • 这会导致负面影响,像zambari 这样修改网格会更好。虽然这两个答案都值得赞成。
    • 是的,正确的解决方案取决于用例。问题中没有提到用例。我建议我的(简单)解决方案仅适用于具有非复杂着色器的基本对象。
    • 如果对象是动画的或使用基本碰撞器或使用普通纹理或(很多东西)可能会出错,因为它对有问题的网格所做的计算混乱。你甚至不能像这样缩放简单的立方体,它已经产生了一个警告,告诉你“BoxColliders 不支持负比例或大小。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多