在Unity 3D中翻转法线/球体

5
我为我的游戏编写了这段代码,我希望在Unity中翻转纹理。我有一个模型和一张贴图,希望贴图在球形模型内部而不是外部。我想通过移动相机浏览在球体内上下翻转后的贴图来创建360全景效果。
现在,当我第一次点击播放按钮时,它可以完美地运行,但当我停止并要再次播放时,我看不到棋盘和周围环境。
看起来每两次尝试播放才有效。由于我刚开始接触这个,我不知道我的错误出在哪里。
using UnityEngine;
using System.Collections;

public class InvertObjectNormals : MonoBehaviour 
{
    public GameObject SferaPanoramica;

    void Awake()
    {
        InvertSphere();
    }

    void InvertSphere()
    {
        Vector3[] normals = SferaPanoramica.GetComponent<MeshFilter>().sharedMesh.normals;
        for(int i = 0; i < normals.Length; i++)
        {
            normals[i] = -normals[i];
        }
        SferaPanoramica.GetComponent<MeshFilter>().sharedMesh.normals = normals;

        int[] triangles = SferaPanoramica.GetComponent<MeshFilter>().sharedMesh.triangles;
        for (int i = 0; i < triangles.Length; i+=3)
        {
            int t = triangles[i];
            triangles[i] = triangles[i + 2];
            triangles[i + 2] = t;
        }           

        SferaPanoramica.GetComponent<MeshFilter>().sharedMesh.triangles= triangles;
    }
}

我只是猜测一下,如果你将InvertSphere()移动到Start()而不是Awake(),是否会有任何变化? - LapisLazuli
一切都一样... 没有任何变化。 - moz_szt
2个回答

15

我知道你已经找到了解决方案。

如果你有兴趣尝试另一种方法,你可以使用一个着色器来翻转法线。

Flip Normals.shader

Shader "Flip Normals" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {

        Tags { "RenderType" = "Opaque" }

        Cull Off

        CGPROGRAM

        #pragma surface surf Lambert vertex:vert
        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
            float4 color : COLOR;
        };

        void vert(inout appdata_full v) {
            v.normal.xyz = v.normal * -1;
        }

        void surf (Input IN, inout SurfaceOutput o) {
             fixed3 result = tex2D(_MainTex, IN.uv_MainTex);
             o.Albedo = result.rgb;
             o.Alpha = 1;
        }

        ENDCG

    }

      Fallback "Diffuse"
}

使用着色器来完成这个任务会更快。谢谢。 - PerformanceFreak

4
您正在编辑共享网格,导致更改持久化。发生的情况是,在第二次运行时,您会将已经反转的网格再次反转,使其变回正面朝外。
建议使用以下方法:
Vector3[] normals = SferaPanoramica.GetComponent<MeshFilter>().sharedMesh.normals;

尝试
Vector3[] normals = SferaPanoramica.GetComponent<MeshFilter>().mesh.normals;

更多信息请参见这里


非常感谢!它起作用了!我现在非常高兴:D - moz_szt

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