我正在使用libnoise的C#端口和XNA(我知道它已经死了)来生成行星。
libnoise中有一个function接收球体表面(纬度和经度)中顶点的坐标,并返回一个随机值(从-1到1)。
因此,使用该值,我可以更改球体表面上每个顶点的高度(高度),创建一些高程,模拟行星表面(我不仅仅是在周围环绕纹理)球,我实际上是从头开始创建每个顶点。
我所拥有的一个例子:
现在我要为球体设置动画,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);
}
答案 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);
}
如果有人有更好的解决方案,请分享!