所有分类
  • 所有分类
  • 后端开发
白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

在介绍它之前,我们先看看,上述的图形,如果我们不使用白噪声(完全随机),而是使用柏林噪声,会是什么样子呢?这里我制作了一张动图,大家可以感受下,每次点击都是一次利用了柏林噪声随机,赋予每个格子不同随机颜色的结果:就是把柏林噪声运用在点阵定位

认识噪声与柏林噪声

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

柏林噪音简直是画大图的神器!它特别有意思,就像机器里蹦出了野性,给你那种朦胧的自然乱感,而且还给出来0至1内的随机数!跟平时的白噪音不太一样,它稍微规整点儿,看上去顺眼多啦哈哈哈。

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

生活中有好多东西就像柏林噪音,比如木头的纹路和山坡的高低,这就是因为它们有很多细节,虽然没有完全独立,但还是有些联系。这种画法可以让图片更真实、干净、漂亮!

白噪声与柏林噪声的区别

告诉你个事儿白噪音和柏林噪音做CSS艺术作品时,效果可差远。白噪声画出来的东西,就像是一堆乱七八糟的颜色搅合在一起,真心不咋地好看;可要是换成柏林噪音,就能让每个小方块都有亲密的联系,整个画面看起来就规整多了,也顺眼多了!

你看这黑白噪音图跟柏林噪声图,两者简直差距老大!简单来说,白噪音图让人眼花缭乱,头晕目眩;但柏林噪声图就不一样它表现得丰富多彩,每个方块都紧密相连,像个有趣儿的小天地。

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

实现方法与应用场景

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

想要画漂亮图形?用CSS-doodle这个神器就行!比如运用柏林噪音算法,只要给每个格子随机涂上颜色就好,记住要让颜色间有些许联系这样就有独特的效果~

这么说,这款软件不仅仅是做网页设计那么简单,还能搞定艺术创造和动画制作~比如说,你想让网站看上去更酷炫,只需要调整下背景色、画风啥的就行!还有页面翻页时的特效,都能做得超级炫酷

// This code implements the algorithm I describe in a corresponding SIGGRAPH 2002 paper.
// JAVA REFERENCE IMPLEMENTATION OF IMPROVED NOISE - COPYRIGHT 2002 KEN PERLIN.
public final class ImprovedNoise {
   static public double noise(double x, double y, double z) {
      int X = (int)Math.floor(x) & 255,                  // FIND UNIT CUBE THAT
          Y = (int)Math.floor(y) & 255,                  // CONTAINS POINT.
          Z = (int)Math.floor(z) & 255;
      x -= Math.floor(x);                                // FIND RELATIVE X,Y,Z
      y -= Math.floor(y);                                // OF POINT IN CUBE.
      z -= Math.floor(z);
      double u = fade(x),                                // COMPUTE FADE CURVES
             v = fade(y),                                // FOR EACH OF X,Y,Z.
             w = fade(z);
      int A = p[X  ]+Y, AA = p[A]+Z, AB = p[A+1]+Z,      // HASH COORDINATES OF
          B = p[X+1]+Y, BA = p[B]+Z, BB = p[B+1]+Z;      // THE 8 CUBE CORNERS,
      return lerp(w, lerp(v, lerp(u, grad(p[AA  ], x  , y  , z   ),  // AND ADD
                                     grad(p[BA  ], x-1, y  , z   )), // BLENDED
                             lerp(u, grad(p[AB  ], x  , y-1, z   ),  // RESULTS
                                     grad(p[BB  ], x-1, y-1, z   ))),// FROM  8
                     lerp(v, lerp(u, grad(p[AA+1], x  , y  , z-1 ),  // CORNERS
                                     grad(p[BA+1], x-1, y  , z-1 )), // OF CUBE
                             lerp(u, grad(p[AB+1], x  , y-1, z-1 ),
                                     grad(p[BB+1], x-1, y-1, z-1 ))));
   }
   static double fade(double t) { return t * t * t * (t * (t * 6 - 15) + 10); }
   static double lerp(double t, double a, double b) { return a + t * (b - a); }
   static double grad(int hash, double x, double y, double z) {
      int h = hash & 15;                      // CONVERT LO 4 BITS OF HASH CODE
      double u = h

当然,本文不是专门来论述柏林噪声如何实现的,上述代码谁看了都头大。我们只需要知道,我们可以借助柏林噪声去构建更有规律的图形效果。让我们的图形更具美感。

利用 CSS-doodle,在 CSS 中利用柏林噪声

那么,在 CSS 中我们如何去使用柏林噪声呢?

一种方式是找一些现成的库,譬如 p5.js 里面的 noise 函数。

当然,这里,我习惯使用 CSS-doodle,这个 CSS 图形构建库我在多篇文章中已经都有介绍过。

简单而言,CSS-doodle 它是一个基于 Web-Component 的库。允许我们快速的创建基于 CSS Grid 布局的页面,并且提供各种便捷的指令及函数(随机、循环等等),让我们能通过一套规则,得到不同 CSS 效果。可以简单看看它的主页 -- Home Page of CSS-doodle,只需要 5min 也许就能快速上手。

譬如上述的图形,它的全部代码

<css-doodle>
    :doodle {
        @size: 50vmin;
        gap: 1px;
    }
   
    background: hsl(@rn(255, 1, 2), @rn(10%, 90%), @rn(10%, 90%));

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

深入了解柏林噪声算法

你可能没听过柏林噪声,其实这个东西在我们做css图形设计时很有用!它其实就像把网格打乱,让每一个小格子都能够随机获得不一样,但又能产生某种联系的数字。

为提升设计技能?学算法原理,编点小程序就能画出完美的 CSS 图案。这样既能启发创意思维,而且还可以锻炼你的大脑。

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

应用示例与效果展示

快来学学如何用柏林噪音功能在CSS上画出各种纹理比如在10x10的网格里,每个小格子都随机填上@rn(100)噪音函数的颜色,这样就能看到周围的格子颜色也跟着变化,超神奇滴!

白噪音OUT,柏林噪声IN!CSS神器让你的设计更有灵性

别忘了用CSS-doodle的@rn()调整下样式配合上简单的柏林噪声算法,瞬间就变身为美观还特立独行的图案了!这样学怎么给CSS图形注入艺术元素也轻松多了吧~

探索创意空间与未来发展

    rn({ x, y, context, position, grid, extra, shuffle }) {
      let counter = 'noise-2d' + position;
      let [ni, nx, ny, nm, NX, NY] = last(extra) || [];
      let isSeqContext = (ni && nm);
      return (...args) => {
        let {from = 0, to = from, frequency = 1, amplitude = 1} = get_named_arguments(args, [
          'from', 'to', 'frequency', 'amplitude'
        ]);
        if (args.length == 1) {
          [from, to] = [0, from];
        }
        if (!context[counter]) {
          context[counter] = new Perlin(shuffle);
        }
        frequency = clamp(frequency, 0, Infinity);
        amplitude = clamp(amplitude, 0, Infinity);
        let transform = [from, to].every(is_letter) ? by_charcode : by_unit;
        let t = isSeqContext
          ? context[counter].noise((nx - 1)/NX * frequency, (ny - 1)/NY * frequency, 0)
          : context[counter].noise((x - 1)/grid.x * frequency, (y - 1)/grid.y * frequency, 0);
        let fn = transform((from, to) => map2d(t * amplitude, from, to, amplitude));
        let value = fn(from, to);
        return push_stack(context, 'last_rand', value);
      };
    },

告诉你个超级棒的事儿!用柏林噪声搞CSS画图,可不是闹着玩的!科技越来越牛了,连我们的设计思维也跟着升级!以后,用柏林噪声玩转CSS画图说不定就是大热门!真的是前途不可限量!

    :doodle {
        grid-gap: 1px;
        width: 600px; height: 600px;
    }
    background: hsl(@r(360), 80%, 80%);
    transform: 
        scale(@r(1.1, .3, 3)) 
        skew(@r(-45deg, 45deg, 3));

想提高美工技巧?那就按葫芦画瓢学点儿CSS知识,试得多错得多,找找灵感,真正做项目时就能得心应手!这样很实用!而且还能让你变成设计牛人,拿出惊艳的新作品给大伙看看!

html,
body {
    width: 100%;
    height: 100%;
    background-color: #000;
}

原文链接:https://www.icz.com/technicalinformation/web/2024/04/14078.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?