使用(4D?)噪声为

时间:2016-03-10 05:16:15

标签: c# perlin-noise procedural-generation

我正在使用libnoise的C#端口和XNA(我知道它已经死了)来生成行星。

libnoise中有一个function接收球体表面(纬度和经度)中顶点的坐标,并返回一个随机值(从-1到1)。

因此,使用该值,我可以更改球体表面上每个顶点的高度(高度),创建一些高程,模拟行星表面(我不仅仅是在周围环绕纹理)球,我实际上是从头开始创建每个顶点。

我所拥有的一个例子:

enter image description here

现在我要为球体设置动画,like this

但问题是,libnoise仅适用于3D噪音。 "星球"函数将纬度和经度映射到立方体的XYZ坐标。

而且我相信,为了像我想要的那样为一个球体设置动画,我需要一个额外的坐标,成为"时间"尺寸。我对吗?或者可以用libnoise提供的方式来做到这一点吗?

OBS:正如我所提到的,我使用的是UV球,而不是icosphere或球形立方体。

编辑:这是libnoise用于将lat / long映射到XYZ的算法:

public double GetValue(double latitude, double longitude) {           

    double x=0, y=0, z=0;

    double PI = 3.1415926535897932385;
    double DEG_TO_RAD = PI / 180.0;

    double r = System.Math.Cos(DEG_TO_RAD * lat);

    x = r * System.Math.Cos(DEG_TO_RAD * lon);
    y = System.Math.Sin(DEG_TO_RAD * lat);
    z = r * System.Math.Sin(DEG_TO_RAD * lon);

    return GetNoiseValueAt(x, y, z);

}

2 个答案:

答案 0 :(得分:1)

n维噪声函数需要n个独立的输入(i 0 ,i 1 ,...,i n-1 ,i n )&返回值v,因此3D噪声足以生成随时间变化的高度图。在您的情况下,输入将是经度,纬度和时间和输出将是高度偏移。

简单的通用算法是:

at each time step (t){
  for each vertex (v) on a sphere centered on some point (c){
    calculate the longitude & latitude
    get the scalar noise value (n) for the longitude, latitude & time
    calculate the new vertex position (p) as follows p = ((v-c)n)+c
  }
}

注意:这假设您没有替换/修改原始顶点值。你可以保存它们的副本(使用更少的计算,但更多的内存)或根据与c的距离重新计算它们(使用更少的内存,但更多的计算)。此外,您可以通过计算2个(或更多)更大的时间步长来获得更平滑的动画。插值以获得中间帧。

据我所知,此解决方案应适用于UV球体,icosphere球形或球形立方体。

答案 1 :(得分:1)

好的,我想我做到了。

我刚刚将时间参数添加到映射的XYZ坐标。

使用相同的纬度和经度但是将时间增加0.01d给了我一个很好的结果。

这是我的代码:

public double GetValue(double latitude, double longitude, double time) {           

    double x=0, y=0, z=0;

    double PI = 3.1415926535897932385;
    double DEG_TO_RAD = PI / 180.0;

    double r = System.Math.Cos(DEG_TO_RAD * lat);

    x = r * System.Math.Cos(DEG_TO_RAD * lon);
    y = System.Math.Sin(DEG_TO_RAD * lat);
    z = r * System.Math.Sin(DEG_TO_RAD * lon);

    return GetNoiseValueAt(x + time, y + time, z + time);

}

如果有人有更好的解决方案,请分享!