如何生成酷炫的背景图片? | 数字艺术 Perlin Noise

观察下面的动图,你是否对其流动的线条顺滑性感到惊讶?当我第一次看到这张图的时候,第一反应就是,这不就是一张随机的运动图嘛,把每粒子的运动轨迹位置添加一个通过random函数获取数值不就可以了?但是后来在我实际编写代码实现的过程中,通过random函数表现出粒子运动效果看起来很杂乱无序,没有这种视觉上的顺滑感。

仔细观察上图,会发现这种流线的运动看似随机,但是感觉有种规律。后经翻阅资料后,找到背后相关的技术原理:Perlin Noise.很多小伙伴在编写粒子运动的代码的过程中,使用随机数生成器创建“随机数”来使粒子对象的运动和行为显得更自然,这种随机数往往代表不可预测性。随机数生成器肯定有这方面的作用,但有时其输出可能过于杂乱而显得不自然。有时候会发现,在手写板上书写的笔迹显得异常的丑,计算机将其稍加润色一下,整个笔迹就显得十分的自然和美观;在玩3D游戏中,会发现一些游戏中的角色运动的十分有规律且自然;湖面波浪的起伏。这些自然效果的表现,都可以通过 Perlin Noise 表现出来。Perlin noisePerlin noise是一个随机序列生成器,它的表现比标准random更自然、更和谐。它是由Ken Perlin在20世纪80年代开发的,并已用于图形应用程序,以生成程序纹理、形状、地形和其他看似有机的形式。Perlin 噪声常见实现形式为二维、三维或四维函数,但可以定义为任意数量的维。实现Perlin Noise通常包括三个步骤:网格定义;点积;插值。网格定义

二维网格的向量定义一个n维网格,其中每个网格交点都有一个与其关联且固定的随机n维单位长度渐变向量;但在一维情况下,梯度是介于 -1 和 1 之间的随机标量。点积

每个点与其最近的网格节点梯度值的点积输入一个点(二维的话就是二维坐标,三维就是三维坐标,n维的就是n个坐标),我们找到和它相邻的那些晶格顶点(二维下有4个,三维下有8个,n维下有2^n个),计算该点到各个晶格顶点的距离向量,再分别与顶点上的梯度向量做点乘,得到个点乘结果。插值使用缓和的曲线来计算它们的权重和。由高等数学可以知道,函数越是高阶可导函数曲线越是平滑,在一阶导满足连续性,但它的二阶导在晶格顶点处(即t = 0或t = 1)不为0,会造成明显的不连续性。在二阶导上仍然满足连续性。举例说明:此处蓝点代表2D平面输入的(x,y)坐标点和其周围的4个晶体格顶点。

这里的蓝点代表输入坐标其他4个晶体格顶点单位坐标在4个单位坐标的每个坐标上,生成所谓的伪随机梯度向量。该梯度矢量定义了一个正方向(指向它的方向),当然也定义了一个负方向(指向它的相反方向)。 伪随机意味着,对于输入到梯度矢量方程中的任何整数集,总是会出现相同的结果。因此,这似乎是随机的,但实际上并非如此。另外,这意味着每个积分坐标都有其“自己的”梯度,如果梯度函数不变,则该梯度将永远不变。

接下来,我们需要计算从给定点到网格上8个周围点的4个矢量。下面显示了2D的示例情况。

距离矢量示例接下来,我们取两个向量(梯度向量和距离向量)之间的点积。这给了我们最终的影响力值:grad.x * dist.x + grad.y * dist.y + grad.z * dist.z之所以可行,是因为两个向量的点积等于两个向量之间的角度的余弦值乘以这些向量的大小:dot(vec1,vec2) = cos(angle(vec1,vec2)) * vec1.length * vec2.length换句话说,如果两个向量指向相同的方向,则点积将等于:1 * vec1.length * vec2.length..如果两个向量指向相反的方向,则点积将等于:-1 * vec1.length * vec2.length如果两个向量垂直,则点积为0 。因此,点积的结果在梯度方向上将为正,而在相反的方向上将为负。这就是梯度矢量定义正方向和负方向的方式。这是代表这些正面/负面影响的图形:

因此,现在我们要做的就是在这4个值之间进行插值,以便在4个网格点之间获得某种加权平均值。解决这个问题的方法很简单:像这样对平均值进行平均或者加权平均值。应用一维Perlin函数控制虚拟人物在游戏中,使用柏林噪声不断调整虚拟人物的关节位置,使其看起来更生动。绘制草图电脑画的线总是笔直的,这会使它们看起来不自然和不友好。可以使用Perlin噪波为绘制线算法引入抖动,使其看起来像是用手绘制的。

二维Perlin函数地形Perlin Noise 用来表现地形的连绵起伏。云Perlin Noise 也适合用于云层渲染。生成材质Perlin Noise 生成各种纹理,比重复的平铺纹理贴图更易于查看。三维Perlin函数3D云用来产生体积云云动画用3D Perlin Noise函数产生2维动画固体纹理有些渲染/光线跟踪程序,如POVray,通过从三维纹理中直接切割对象来应用纹理。案例int noiseScale = 500, noiseStrength = 1;int num = 1000;Particle[] particles = new Particle[num];void setup(){// windows size = 800 * 600size(800,600);// no strokenoStroke();// paint 1000 paticlesfor(int i = 0; i < num; ++i){PVector loc = new PVector(random(width * 1.2), random(height * 1.2), 2);float angle = random(TWO_PI);PVector dir = new PVector(cos(angle),sin(angle));float speed = random(0.5, 2);particles[i] = new Particle(loc, dir, speed);}}void draw(){fill(0,10);noStroke();rect(0,0,width,height);for(int i = 0; i < num; ++i){particles[i].run();}}class Particle{// 3 Elements : Location Velocity DirectionPVector loc, vel, dir;// Speedfloat speed;// direction changeint d = 1;Particle(PVector _loc, PVector _dir, float _speed){loc = _loc;dir = _dir;speed = _speed;}// run to next positionvoid run(){// calc the next positionmove();// check position is out of edgecheckEdge();// paint particleupdate();}void move(){// generate the random anglefloat angle = noise(loc.x/noiseScale, loc.y/noiseScale, frameCount/noiseScale) * TWO_PI * noiseStrength;// deltaX = x-axis incrementdir.x = cos(angle);// deltaY = y-axis incrementdir.y = sin(angle);// vel = [delatX, deltaY]vel = dir.get();// speed numvel.mult(speed * d);// nextlocation = curPosition + velloc.add(vel);}void checkEdge(){if(loc.x < 0 || loc.x > width || loc.y < 0 || loc.y > height){// factor 1.2 ensure the loc.x near edgeloc.x = random(width * 1.2);loc.y = random(height);}}void update(){fill(255);ellipse(loc.x, loc.y, loc.z, loc.z);}

恒成立上海理工大学光电硕士努力将数字公式可视化- END -获取年会分享录播请加入知识星球置顶文件(不定期放出)戳星球二维码 ↓

(0)

相关推荐

  • word2vec中的数学模型

    word2vec中的数学模型

  • 【向量场】- 图解高等数学 18

    向量场就是向量构成的一种图形, 平面上的每一个点都对应着一个向量(当然不能在所有的点处都标上向量), 每个向量的取决于x,y的位置, 大小取决于的分量函数. 平面向量场 绘制向量 {2,1} 的向量场 ...

  • OPOLAR环景照明系统:酷炫电视墙背景灯,跟着剧情一起变幻

    OPOLAR环景照明系统是一款专为单调电视墙打造的背景灯系统,安装简单,灯效丰富,通过手机APP直接控制,灯效会根据电视画面变化或者音乐律动呈现不同的效果,还有彩虹.火焰等12种趣味灯效,非常酷炫.

  • 与光共舞|mapping太油腻?看看用投影创作的数字艺术能多酷炫

    Miguel Chevalier 法国数字艺术家 Miguel Chevalier(生于1959年)是国际知名的虚拟和数字艺术先驱,自1978 年以来就一直专注于将计算机作为一种艺术表达手段.迄今为止 ...

  • 就这?炫酷动态PPT背景的套路,居然这么简单!

    文章来源:公众号@杰森说 文章作者:杰森 嗨,各位木友们好呀,我是杰森. 在PPT设计中,总有一些简单的套路,能做出让人啧啧称奇的效果. 比如使用动态的PPT背景,我们先来看看使用了动态背景的PPT长 ...

  • 手摸手教你做一个超火的酷炫视频,一键生成!

    昨天中秋,再给大家补上一句中秋快乐,虽然这调休出来的三天假期挺短的,但我是好好休息了一下. 不过这三天我也不是啥都没干,前两天刚放假的时候,把家里的神兽送到了我爸妈那,然后无事一身轻的我躺床上准备找个 ...

  • 酷炫!海军航空兵超燃大片来袭

    当你安享盛世安宁,他们翱翔在寂静的云海,为国护航,使命必达,守护祖国每一寸山河.他们是中国海空守护者,守护着每一个人的中国梦!(王亮 赵昌辉 李明熹 编辑:海苔妹) 当你安享盛世安宁,他们翱翔在寂静的 ...

  • 魔幻!45组酷炫数学动图!看完喜欢上数学,根本停不下来…

    怎么让数学变得好玩? 怎么让抽象的数学原理变得形象? 怎么能喜欢上数学? 看看下面这些炫酷的数学动图吧! 1 三角形内角和为180º 2 多边形外角和为360º (这张图片来源于可乐学习,www.ke ...

  • snapseed制作逆世界效果,普通照片的酷炫修图法

    我们先来看一下照片的前后对比 这是原图 ▼ 这是后期之后的图 ▼ 原图非常普通,就是随手一拍的城市风景照片,色彩和层次感都一般,后期主要使用snapseed增加了一个同样的对立照片效果,于是就产生了一 ...

  • 酷炫的地面互动投影,扩宽了人们的视野

    走路看手机溺亡事件的发生,足以可见,人们平时走动时地面占据了大部分视野范围,因此地面互动投影也被更多领域所应用,使人们的生活更便捷. 地面互动投影作为互动投影的一种形式,通过悬挂在顶部的投影仪,将影像 ...

  • 酷炫的现代轻奢风,典雅奢华,都市人追求的高品质家装

    简单生活往往只是追求高品质的家装,现代都市人都希望家装简单却包含意义的非凡,看似简单,却要透露着精致美. 品质生活是一种格局,酷炫的现代轻奢风,典雅奢华,打造都市人追求的高品质家装. 客厅家具 客厅选 ...