我使用C#端口利布噪声与XNA (我知道它死了),以产生行星。
在the噪声中有一个函数,它接收球面(纬度和经度)中顶点的坐标,并返回一个随机值(从-1到1)。
因此,通过这个值,我可以改变球体表面(高度)上每个顶点的高度,创建一些高程,模拟一个行星的表面(我并不是简单地在球体周围包裹纹理,而是从零开始创建每个顶点)。
我所拥有的一个例子:

现在我想让这个球体充满活力,像这样
但问题是,with噪声只适用于3D噪声。“行星”函数将纬度和经度映射到立方体的XYZ坐标。
我相信,要像我想要的那样使一个球体充满活力,我需要一个额外的坐标,作为“时间”维度。我说的对吗?或者,是否可以用lib噪音提供的内容来实现这一点?
如前所述,我使用的是紫外线球,而不是icosphere或球形立方体。
编辑:下面是lib噪音用来将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);
}发布于 2016-03-13 23:29:51
好的,我想我成功了。
我刚刚将时间参数添加到映射的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);
}如果有人有更好的解决方案,请分享!
发布于 2020-01-20 12:24:34
很抱歉我的回答太迟了,但是我在网上找不到满意的答案,所以我正在为将来有这个问题的人写这个。
对我有用的是使用多个3d perlin噪声源,并将它们组合成一个单一的噪声源。把时间加到xyz坐标上只会产生一个非常明显的效果,地形在(-1,-1,-1)方向移动。平均超过4个不相关的噪声源确实会稍微改变噪声特性,因此您可能不得不根据您的用例调整一些因素。这个解决方案仍然不是完美的,但我还没有看到任何视觉工件。
代码是C++流噪声,但是它应该能很好地翻译到其他语言。
noise::module::Perlin perlin_noise[4];
float get_height(ofVec3f p, float time) {
p*=2;
time /= 10 ;
return (perlin_noise[0].GetValue(p.x, p.y, p.z) +
perlin_noise[1].GetValue(p.x, p.y, time) +
perlin_noise[2].GetValue(p.x, time, p.z) +
perlin_noise[3].GetValue(time, p.y, p.z))/2;
}理想情况下,对于单个三维噪声源,你想要用t的单调函数将x,y,z弦相乘,这样它就可以探索出一个不断扩展的噪声源球面,但我还没有算出这个数学。
编辑:我使用的框架(openframeworks)有一个在ofSignedNoise(glm::vec4)中构建的4d perlin噪声函数
https://stackoverflow.com/questions/35908138
复制相似问题