编程实现三次bezier曲线的绘制_视觉系编程2——用代码写出动态交互海报

d00460acfbabe9dde30477fc9fee831e.png

今天的文章介绍了如何将平面设计与编程结合起来,做一张动态交互海报。

motion graphic大火的今天,小伙伴们来学习一下吧~

知乎视频​www.zhihu.com

71b773a251319eb41a2913a95522f70f.png
静态效果图1

329e7294fca5ace4fa4c3a7853536193.png
静态效果图2

平面设计是组织,编排文字,图像,符号的一种视觉表现形式。

所以现在将这种海报分为三部分,背景,眼睛(符号),文字。

注:代码是用p5js写的。

1.眼睛

45cf90da64ae58f251c92d8566dbf682.png

眼眶:用两个贝塞尔曲线画出,眼眶的阴影同形状不同颜色,并向右下位移(8,8)

function drawEyekuang() {
  //影子
  push();
  translate(8, 8);
  fill(120, 200);
  bezier(-55, 0, -35, z - 44, 35, z - 44, 55, 0);
  bezier(-55, 0, -35, 44 - z, 35, 44 - z, 55, 0);
  pop();

  //眼眶
  bezier(-55, 0, -35, z - 44, 35, z - 44, 55, 0);
  bezier(-55, 0, -35, 44 - z, 35, 44 - z, 55, 0);

  push();
  stroke(255);
  line(-55, 0, 55, 0);
  pop();
  fill(0);

}

眼珠:用noise使眼球随机变大变小,反三角函数求出角度,让眼球跟着鼠标位置移动。

function drawEyeball(size, x, y) {
  //反三角函数求出角度
  angle = atan2(mouseY - y, mouseX - x);
  push();
  rotate(angle);
  for (b = 0; b < width / 2; b += size) {
    noise2 += noise(2);
    for (c = 0; c < width / 2; c += size) {
      noise3 += noise(2);
      fill(0);
      let u = 1;
      ellipse(size / 6, 0, noise(noise2, noise3) * 1.3 * size * u, noise(noise2, noise3) * 1.3 * size * u);
      push();
      fill(255);
      ellipse(3, 3, 3, 3);
      pop();
    }
  }
  pop();
}

最后眼眶和眼珠整合在一起的函数

function drawEye_dad(x, y, v) {
  push();
  translate(x, y);
  rotate(frameCount / v);
  drawEyekuang();
  pop();
  
  push();
  translate(x, y);
  drawEyeball(40, x, y);
  pop()

在set up使用数组储存随机生成眼睛的位置和大小

let Eyes_xaxis_nums = 5;
let Eyes_yaxis_nums = 4;
let Eyes_locs = [];

function setup() {
  createCanvas(600, 800);
  frameRate(50);
  noisex = noisey = 0;
  noStroke();
  for (var i = 1; i < Eyes_xaxis_nums; i++) {
    for (var k = 1; k < Eyes_yaxis_nums; k++) {
      let random_dis = 60;
      let x = random(-random_dis, random_dis);
      let y = random(-random_dis, random_dis);
      let v = random(20, 200);
      Eyes_locs.push([x + i / Eyes_xaxis_nums * width, y + k / Eyes_yaxis_nums * (height - 300), v]);
    }
  }
}

在draw中用function drawEye_dad(x, y, v)这个函数画出

function draw() {
  for (var i = 0; i < Eyes_locs.length; i++) {
    var x, y, v;
    [x, y, v] = Eyes_locs[i];
    drawEye_dad(x, y, v);
  }
}

2.背景

就是画格子,很简单啦~

2个for循环分别划出横向和纵向

602831a58e7b38ef4f18b6311aa3fcce.png
function drawGrid(m, n) {
  stroke(m, m, n);
  for (i = 0; i < height; i += 20) {
    line(0, i, width, i);
  }
  for (a = 0; a < width; a += 20) {
    line(a, 0, a, height);
  }
}

3.文字

左下角4层文字:按键盘字体之间的空隙会随机改变,所以在此处设置一个变量 textgap

四层文字颜色不同,制造一种立体的视觉效果

93435605da1d8852f7ace4a6fcb2e6f2.png
参考图,来源网络
function drawtext(a) {
  push();
  fill(0,200);
  strokeWeight(7);
  stroke(0);
  text(a, 50, 95-textGap);
  pop();

  push();
  fill(231, 45, 48);
  strokeWeight(7);
  stroke(231, 45, 48);
  text(a, 50, 105);
  pop();

  push();
  fill(240, 133, 13);
  strokeWeight(7);
  stroke(240, 133, 13);
  text(a, 50, 115+textGap);
  pop();

  push();
  fill(255, 226, 63);
  strokeWeight(7);
  stroke(255, 226, 63);
  text(a, 50+textGap, 125);
  pop();
}

4. 交互部分

之前设置的背景颜色和格子颜色都与m,n有关。background(62, m, 152); drawGrid(m, n);按下键盘让m,n随机变化,就能改变背景颜色了。

随机textgap也会改变文字间距。

调整贝塞尔曲线的两个控制点,令鼠标按下仿佛有眨眼的效果。

function keyPressed() {
  m = random(255);
  n = random(255);
  textGap = random(0, 5);
}

function mousePressed() {
  z = 44;
  u = 0;
}

function mouseReleased() {
  z = 0;
  u = 1;
}

一起来玩玩吧,按鼠标和键盘都有不同的效果~

链接在这:https://editor.p5js.org/nancy2721/present/1HVnkg59e

最后分享几个我喜欢的动态海报,学习编程的时候小伙伴们记得发挥自己的想象力和创造力,结合自己的专业更容易做出有趣的东西~

来源网络,侵删

f8fa530822eaf3a11e0ad8257e078b20.gif

3c3e40c8c3499c72ad780abfa2e8902f.gif

f6b80e8a7539bf6b572147247ba51e7f.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值