Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一-柏林噪声倍频程_C#_Visual Studio_Unity3d_Perlin Noise - Fatal编程技术网

C# 统一-柏林噪声倍频程

C# 统一-柏林噪声倍频程,c#,visual-studio,unity3d,perlin-noise,C#,Visual Studio,Unity3d,Perlin Noise,我正试图在unity教程中设置简单的地形生成器,到目前为止它可以正常工作,但我想做更“自然”的外观,并发现我需要做倍频程或多级噪声 我在网上找到的关于多级柏林噪声的一切,我都不理解,或者使用了完全不同的方法 using UnityEngine; [RequireComponent(typeof(MeshFilter))] public class Mesh_Generator : MonoBehaviour { #region Variables Mesh mesh;

我正试图在unity教程中设置简单的地形生成器,到目前为止它可以正常工作,但我想做更“自然”的外观,并发现我需要做倍频程或多级噪声

我在网上找到的关于多级柏林噪声的一切,我都不理解,或者使用了完全不同的方法

using UnityEngine;

[RequireComponent(typeof(MeshFilter))]
public class Mesh_Generator : MonoBehaviour
{

    #region Variables
    Mesh mesh;

    Vector3[] vertices;
    //Vector2[] Uvs;
    Color[] colors;
    int[] triangles;

    [Range(1, 9999)]
    public int xSize = 100;
    [Range(1, 9999)]
    public int zSize = 100;

    public Gradient gradient;

    public float MinHeight = 0;
    public float MaxHeight = 0;

    public bool Reset_Min_Max;
    #endregion
    #region Octaves
    [Range(1, 6)]
    public int Octaves = 6;
    public int Scale = 50;

    public float offsetX = 0f;
    public float offsetY = 0f;

    public float Frequency_01 = 5f;
    public float FreqAmp_01 = 3f;

    public float Frequency_02 = 6f;
    public float FreqAmp_02 = 2.5f;

    public float Frequency_03 = 3f;
    public float FreqAmp_03 = 1.5f;

    public float Frequency_04 = 2.5f;
    public float FreqAmp_04 = 1f;

    public float Frequency_05 = 2f;
    public float FreqAmp_05 = .7f;

    public float Frequency_06 = 1f;
    public float FreqAmp_06 = .5f;
    #endregion
    #region Start
    void Start()
    {
        mesh = new Mesh();
        GetComponent<MeshFilter>().mesh = mesh;

        offsetX = Random.Range(0f, 99999f);
        offsetY = Random.Range(0f, 99999f);
    }
    #endregion
void ResetMinMax()
{
    MinHeight = 0f;
    MaxHeight = 0f;
        Reset_Min_Max = false;
}
#region Update
private void Update()
    {
        if (Reset_Min_Max)
            ResetMinMax();

        CreateShape();
        UpdateMesh();
    }
    #endregion
    #region CreateShape
    void CreateShape()
    {
        #region Vertices
        vertices = new Vector3[(xSize + 1) * (zSize + 1)];

        for (int i = 0, z = 0; z <= zSize; z++)
        {
            for (int x = 0; x <= xSize; x++)
            {
                float y = Calculate(x, z);
                vertices[i] = new Vector3(x, y, z);

                if (y > MaxHeight)
                    MaxHeight = y;
                if (y < MinHeight)
                    MinHeight = y;

                i++;
            }
        }

        int vert = 0;
        int tris = 0;
        #endregion
        #region Triangles
        triangles = new int[xSize * zSize * 6];

        for (int z = 0; z < zSize; z++)
        {
            for (int x = 0; x < xSize; x++)
            {
                triangles[tris + 0] = vert + 0;
                triangles[tris + 1] = vert + xSize + 1;
                triangles[tris + 2] = vert + 1;
                triangles[tris + 3] = vert + 1;
                triangles[tris + 4] = vert + xSize + 1;
                triangles[tris + 5] = vert + xSize + 2;

                vert++;
                tris += 6;
            }
            vert++;
        }
        #endregion
        #region Gradient Color
        colors = new Color[vertices.Length];
        for (int i = 0, z = 0; z <= zSize; z++)
        {
            for (int x = 0; x <= xSize; x++)
            {
                float Height = Mathf.InverseLerp(MinHeight, MaxHeight, vertices[i].y);
                colors[i] = gradient.Evaluate(Height);
                i++;
            }
        }
        #endregion
        #region UVs
        /*
         Uvs = new Vector2[vertices.Length];
         for (int i = 0, z = 0; z <= zSize; z++)
         {
             for (int x = 0; x <= xSize; x++)
             {
                 Uvs[i] = new Vector2((float)x / xSize, (float)z / zSize);
                 i++;
             }
         }
         */
        #endregion
    }
    #endregion
    #region Octaves Calculation
    float Calculate(float x, float z)
    {
        float[] octaveFrequencies = new float[] { Frequency_01, Frequency_02, Frequency_03, Frequency_04, Frequency_05, Frequency_06 };
        float[] octaveAmplitudes = new float[] { FreqAmp_01, FreqAmp_02, FreqAmp_03, FreqAmp_04, FreqAmp_05, FreqAmp_06 };
        float y = 0;

        for (int i = 0; i < Octaves; i++)
        {
            y += octaveAmplitudes[i] * Mathf.PerlinNoise(
                     octaveFrequencies[i] * x + offsetX * Scale,
                     octaveFrequencies[i] * z + offsetY * Scale) ;

        }

        return y;
    }
    #endregion
    #region UpdateMesh
    void UpdateMesh()
    {
        mesh.Clear();

        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.colors = colors;
        //mesh.uv = Uvs;

        mesh.RecalculateNormals();

    }
    #endregion
    #region  Gizmos
    /* 
     private void OnDrawGizmos()
    {
        if (vertices == null)
            return;

        for (int i = 0; i < vertices.Length; i++){
            Gizmos.DrawSphere(vertices[i], .1f);
        }           
    }
    */
    #endregion
}
使用UnityEngine;
[要求组件(类型(网状过滤器))]
公共类网格生成器:单行为
{
#区域变量
网目;
向量3[]个顶点;
//矢量2[]紫外线;
颜色[]颜色;
int[]三角形;
[射程(19999)]
公共int xSize=100;
[射程(19999)]
公共int zSize=100;
公共梯度;
公共浮子最小高度=0;
公共浮点数MaxHeight=0;
公共布尔重置_最小_最大;
#端区
#区域倍频程
[射程(1,6)]
公共整数倍频程=6;
公共int量表=50;
公开浮动抵销x=0f;
公共浮动抵消=0f;
公共浮点数频率_01=5f;
公共浮动频率amp_01=3f;
公共浮动频率_02=6f;
公共浮球频率amp_02=2.5f;
公共浮动频率_03=3f;
公共浮球频率amp_03=1.5f;
公共浮动频率_04=2.5f;
公共浮标频率amp_04=1f;
公共浮动频率_05=2f;
公共浮动频率amp_05=.7f;
公共浮动频率_06=1f;
公共浮动频率amp_06=.5f;
#端区
#区域启动
void Start()
{
网格=新网格();
GetComponent().mesh=mesh;
偏移量x=随机范围(0f,9999f);
offsetY=随机范围(0f,9999f);
}
#端区
void ResetMinMax()
{
最小高度=0f;
最大高度=0f;
重置最小值最大值=错误;
}
#地区更新
私有void更新()
{
如果(重置最小值最大值)
重置最小值();
CreateShape();
UpdateMesh();
}
#端区
#区域创建形状
void CreateShape()
{
#区域顶点
顶点=新矢量3[(xSize+1)*(zSize+1)];

对于(inti=0,z=0;zmulti-level,或multi-octave-perlin)来说,它只是标准perlin的几个迭代加在一起。 示例代码可能如下所示:

float[] octaveFrequencies=new float() {1,1.5f,2,2.5f} ;
float[] octaveAmplitudes=new float() {1,0.9f,0.7f,0.f} ;
float y=0;
for(int i=0;i<octaveFrequencies.Length;i++)
 y += octaveAmplitudes[i]* Mathf.PerlinNoise(
      octaveFrequencies[i]*x + .3f, 
      octaveFrequencies[i]* z + .3f) * 2f ;
float[]octaveFrequencies=newfloat(){1,1.5f,2,2.5f};
float[]octaveamples=newfloat(){1,0.9f,0.7f,0.f};
浮动y=0;

对于(int i=0;我想你至少为我清除了一点,但我认为我仍然做了一些错误的事情,因为这感觉仍然是“人工”链接:我从这个:float Calculate(float x,float z)中检索“Y”:你的代码块在哪里。在这个频率下看起来大致像柏林,八度很好地显示你的分辨率(在这种情况下,顶点计数)应该稍高一点(或您的基本频率较低),看起来高阶perlin在增加顶点的数量时被混叠了,这是512x 256,它会完全破坏图形:,而且看起来仍然很平淡。tho,我在主要问题中再次更新了代码。好吧,我半实现了我想要的,但没有你的代码,我无法实现,我只是使用了巨大的值,这就是为什么我这么做的原因nt工作正常,无法使用更多的问题256x256顶点仍然存在。添加山谷/河流现在将很容易,因为我更清楚地了解它,我非常感谢:)