首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用(4D?)噪声

用(4D?)噪声
EN

Stack Overflow用户
提问于 2016-03-10 05:16:14
回答 2查看 871关注 0票数 0

我使用C#端口利布噪声与XNA (我知道它死了),以产生行星。

在the噪声中有一个函数,它接收球面(纬度和经度)中顶点的坐标,并返回一个随机值(从-1到1)。

因此,通过这个值,我可以改变球体表面(高度)上每个顶点的高度,创建一些高程,模拟一个行星的表面(我并不是简单地在球体周围包裹纹理,而是从零开始创建每个顶点)。

我所拥有的一个例子:

现在我想让这个球体充满活力,像这样

但问题是,with噪声只适用于3D噪声。“行星”函数将纬度和经度映射到立方体的XYZ坐标。

我相信,要像我想要的那样使一个球体充满活力,我需要一个额外的坐标,作为“时间”维度。我说的对吗?或者,是否可以用lib噪音提供的内容来实现这一点?

如前所述,我使用的是紫外线球,而不是icosphere或球形立方体。

编辑:下面是lib噪音用来将lat/long映射到XYZ的算法:

代码语言:javascript
复制
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);

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-13 23:29:51

好的,我想我成功了。

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

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

这是我的代码:

代码语言:javascript
复制
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);

}

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

票数 1
EN

Stack Overflow用户

发布于 2020-01-20 12:24:34

很抱歉我的回答太迟了,但是我在网上找不到满意的答案,所以我正在为将来有这个问题的人写这个。

对我有用的是使用多个3d perlin噪声源,并将它们组合成一个单一的噪声源。把时间加到xyz坐标上只会产生一个非常明显的效果,地形在(-1,-1,-1)方向移动。平均超过4个不相关的噪声源确实会稍微改变噪声特性,因此您可能不得不根据您的用例调整一些因素。这个解决方案仍然不是完美的,但我还没有看到任何视觉工件。

代码是C++流噪声,但是它应该能很好地翻译到其他语言。

代码语言:javascript
复制
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噪声函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35908138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档