- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试按照教程统一设置简单的地形生成器,到目前为止它按预期工作,但我想做更“自然”的外观,发现我需要做 Octave 或多级噪声。
我在网上找到的关于多级 Perlin 噪声的所有内容对我来说都无法理解,或者使用了完全不同的方法。
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
}
下面的链接是我当前的结果和我正在努力实现的结果。
用这个方法能达到这样的效果吗?如果可以的话,可以显示脚本示例吗?
非常感谢。
*再次更新代码
最佳答案
多级或多倍频程 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 ;
您放入数组中的数字将决定噪声的最终形状。频率数组中的值乘以您的输入,振幅数组中的值乘以该层的结果 perlin。
关于c# - Unity - 柏林噪音 Octave ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55990333/
我今天尝试使用噪声在处理中生成伪随机角度,但它没有像我希望的那样工作。 float xoff = 0; float inc = 0.01; void draw(){ float vx = cos(
我正在使用 OpenCV 和 Python 处理图像。我需要去除图像中的点/噪声。 我尝试了使点变小的膨胀,但是文本被损坏了。我还尝试了两次循环扩张和一次腐 eclipse 。但这并没有给出令人满意的
我需要使用我编写的 perlin 噪声程序在 Java 中生成 3D 行星(球体)的纹理。但问题是左侧和右侧需要相同,上下也必须相同,这样您才能将纹理放在球体上。 我无法将柏林噪声源放在这里,因为它太
我想构建一个 android 应用程序,它可以识别我的声音,将其转换为文本,并显示我刚刚说的 toast 。我可以通过使用一个按钮来为我启动语音识别器来做到这一点。但现在我想让它只根据我的声音工作。
嗨,我正在使用我发现的算法来生成柏林噪声。我想做的是用更少的曲线创建更锐利的边缘Picture 。 private static final double F2 = 0.5*(Math.sqr
我正在尝试用 C++ 编写一个程序来播放一个小的 .wav 文件。我已经按照 DirectX SDK 文档对其进行了编程,以在辅助静态缓冲区上编写和播放。它运行正常,除了在任何 .wav 文件播放结束
在这个 short video 中听我的问题. 现在我更详细地解释: 在那个视频中,我已经播放了(点击按钮)一个音频文件三次,连续两次,最后一次有一点停顿。第一次听起来像 radio 正在调谐,第二次
所以在过去的几个小时里,我一直在尝试用 Dart 制作一个简单的 Perlin 噪声发生器。为此,我决定在 this page 上使用二维生成的伪代码。 (很棒的阅读!) 这是我的 Dart 实现的样
我正在为 android 开发一个 OCR 应用程序(构建为 java 应用程序)。我想从相机捕获的图像中检测文本并进行预处理我正在使用 OpenCV,但我得到了一些额外的行,这些行被读取为文本,我采
我正在使用 Ruby on Rails 3.1.1 和 pg gem。 在我的 Gemfile.lock 中,这是我拥有的 pg (0.11.0) 我的日志中充满了如下所示的信息。我没有用 sqlit
我在 javascript 中创建了一个带有实时对话模块的应用程序。我正在使用 WebRTC 设置对等连接。信号和候选人似乎都工作正常。对等点不在同一个网络上。 在某些时候,音频开始向流中添加点击。质
我在基于 android 的 csipsimple 应用程序中使用了一个 PJSIP 库。除一个问题外,一切正常。当我打开扬声器时,通话中有很多回声/噪音,无法进行通话。可能是什么问题以及如何处理这个
当您按下 alt+几乎任何其他键时,它会发出 clang 。噪音说“你已经尝试做一些你做不到的事情” 我想在多个组合中使用 alt 键作为网络应用程序的键盘快捷键。 尽管在按下 alt+* 时有一些事
我的目标是创建一个 SDL 窗口,绘制不同的波形并播放该波的不确定声音。通过按下特定的键,可以修改波的幅度、频率或波形等参数。 问题在于,即使是绘制时看起来不错的简单正弦波,听起来也很嘈杂。我不明白为
我收到大量这样的消息,围绕着我故意不支持的 SSL 协议(protocol),例如SSLv3、TLS1.0 等 2020-02-06 13:08:30,600 ERROR [io.undertow.r
我有错误s的情况通常是从 3rd-party JS 发出的,例如 Chartbeat 等。我想捕获并丢弃/静音这些错误以及相关的噪音。 所有此类 3rd 方脚本都会执行以下操作: 创建 DOM 标签
我对新 ffmpeg 中的重采样结果感到困惑。我将 AAC 音频解码为 PCM,ffmpeg 显示音频信息为: Stream #0:0: Audio: aac, 44100 Hz, stereo, f
我是一名优秀的程序员,十分优秀!