【问题标题】:Flip Normals in Unity 3D/spheresUnity 3D/球体中的翻转法线
【发布时间】:2021-09-09 05:20:42
【问题描述】:

我已经为我的游戏编写了这段代码,我想要的是统一翻转纹理上的法线。我有一个模型和一个纹理,并希望纹理位于球体模型内部而不是外部。我想通过在翻转纹理顶部的球内图像周围移动相机来创建 360 度全景效果。

现在,当我第一次点击播放按钮时,它运行良好,但是当我停止它并想再次播放时,我看不到棋盘和周围环境。

它似乎每 2 次我尝试播放一次。我对此有点陌生,我不知道我的错误在哪里。

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(); 会发生什么变化;开始()而不是唤醒()
  • 还是一样的……没什么变化

标签: c# unity3d


【解决方案1】:

我知道您找到了脚本的修复方法。

如果您对替代方案感兴趣,可以使用着色器来翻转法线。

翻转法线着色器

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

【讨论】:

  • 使用着色器执行此操作更快。谢谢。
【解决方案2】:

您正在编辑 sharedMesh,这会导致更改持续存在。发生的情况是,当您第二次点击运行时,您正在反转已经反转的网格,使其再次正面朝外。

代替

Vector3[] normals = SferaPanoramica.GetComponent<MeshFilter>().sharedMesh.normals;

试试

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

更多信息请参见here

【讨论】:

  • 非常感谢!有效!我现在很高兴:D
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多