码绘VS手绘(二)动态绘图

  • 一、前言
  • 二、实验内容
    • (一)主题
    • (二)实验结果
      • 1、码绘
        • 最终效果
        • 程序结构
        • 具体函数解析
      • 2、手绘
  • 三、总结——编程与手绘的比较
    • 1、工具和载体
    • 2、技法
    • 3、理念
    • 4、创作体验和呈现效果
    • 5、应用和局限性
  • 参考文件

一、前言

这篇文章是之前静态绘图的后续,既静态码绘之后,我们又要尝试动态码绘啦!
附上第一篇的链接:码绘VS手绘(一)静态绘图

依然是用p5.js,本来是想继续用上次的米奇做成动态的,但想了想除了让云彩飘一下,米奇走两步之外也做不出什么花样了,还是想做些更有趣的东西。米奇的城堡我是建不成了,不如来点烟花吧!于是就愉快地决定做一个烟花的动态效果了!
p5.js官方文档(内附详细函数示例)

二、实验内容

(一)主题

  • 用手绘和码绘两种方式创作“运动”主题的作品,并撰写报告,对比二者在表现“动态”方面的异同。

(二)实验结果

1、码绘

最终效果

白色小圆点实时跟踪鼠标,当点击鼠标时,放出烟花,烟花升空一定高度后绽放。烟花有两种形态,随机出现;烟花有五种颜色,也随机选择。

程序结构
function setup() // 函数将在程式开始时被调用一次,定义初始的环境属性。
{var c=createCanvas(windowWidth, windowHeight);//创建画布,宽高为窗口大小frameRate(50);    //设置调用draw()的频率
}
//一些变量的设置
//……
function draw() {         //持续重复调用background(0, 0, 40); //设置背景色 ,保证页面实时更新     //……调用绘制函数
}
function mouseClicked() {} //鼠标点击相应函数
function setPosition1(firePosition){} //烟花种类1的设置
function setPosition2(firePosition){} //烟花种类2的设置
function startNew(x,y,tx,px,colorChange,fire){} //释放烟花
具体函数解析

(1) 变量设置

var tx = 0;   //烟花在竖直方向上的移动距离
var nx,ny;    //烟花释放位置
var newone=false;  //boolen变量,用来判断是否释放烟花
var fireworks = [];//储存一个烟花中各个点的数组
var radius=40;     //烟花绽放后的半径,初始值为40
var colorChange =0;//烟花的颜色
var px=5;   //烟花释放后,烟花中各个点的半径,初始值为5
var fire=0; //烟花的种类

(2) 鼠标点击响应函数

function mouseClicked() {   //p5.js自带函数,鼠标左键单击时调用newone=true;  //点击鼠标左键,可以释放烟花nx=mouseX;   //以当前鼠标位置为烟花释放的位置ny=mouseY;
}

(3)draw()函数

function draw() {background(0, 0, 40);        tx=tx+2;//每次调用draw,烟花位置上升2    if(tx>=100)//当烟花上升超过100时,烟花绽放,同时烟花中各个点的半径开始减小{px=px-0.1;}if(px<0)//当烟花中各个点的半径小于0,即烟花熄灭时,当前烟花结束,各个变量恢复初始值,等待下一次释放{newone=false;px=5;tx=0;}if(newone)//当newone为true时,调用释放烟花函数{startNew(nx,ny,tx,px,colorChange,fire);        }else//一旦烟花熄灭,重新设置下一个烟花的种类和颜色,并且继续跟踪鼠标位置{colorChange = random(0, 5);fire=random(0,2)noStroke();fill(255,255,255);ellipse(mouseX,mouseY,5,5);}
}

(4)释放烟花函数startNew

function startNew(x,y,tx,px,colorChange,fire){var num = 256; //一发烟花里,有多少个点var xx,yy;xx=x,yy=y;var centerPosition = new p5.Vector(xx,yy);//烟花中心位置var firePosition = [];  //声明储存烟花中各个点的数组  if(fire>1)//fire为0~2的随机数,fire>1时,烟花种类为1{setPosition1(firePosition);}else//fire为0~2的随机数,fire<1时,烟花种类为2{setPosition2(firePosition);}        noStroke();  //p5.js自带函数,绘制图形无边框  if(tx<100)  //烟花上升高度小于100,烟花为一个不断上升的白点{xx=x;y=y-tx;yy=y;fill(255,255,255);ellipse(xx,yy,5,5);}else  //烟花上升高度大于100,烟花绽放{if(colorChange>=4){        //colorChange为一个0~5的随机数,根据数值决定当前烟花颜色fill(255,0,0);    }else if(colorChange>3){        fill(0,255,0);    }else if(colorChange>2){        fill(255,0,255);    } else if(colorChange>1){        fill(255,255,0);    } else {        fill(0,255,255);    } for (var i = 0; i < num; i++) {    //绘制一个烟花中的各个点,点的半径px不断减小直到消失ellipse(firePosition[i].x+xx,firePosition[i].y+yy-tx,px,px);                                }        }
} 

(5)不同烟花种类的各个点的位置设定

function setPosition1(firePosition){var num = 256; //一发烟花里,有多少个点var cosTheta;var sinTheta;var phi;   //角度for (var i = 0; i < num; i++) {        cosTheta = random(0, 1) * 2 - 1;        sinTheta = sqrt(1 - cosTheta * cosTheta);        phi = 0.1*i * PI/11.0; //这是决定烟花形状的主要变量if(phi>360){phi=phi-360;}       firePosition[i] = new p5.Vector((radius+tx) * sinTheta * cos(phi), (radius+tx) * sinTheta * sin(phi), (radius+tx) * cosTheta);  //1发烟花里各个点的位置计算        firePosition[i] = p5.Vector.mult(firePosition[i], 1.12);    }
}function setPosition2(firePosition){var num = 256; //一发烟花里,有多少个点var cosTheta;var sinTheta;var phi;  //角度 for (var i = 0; i < num; i++) {        cosTheta = random(0, 1) * 2 - 1;        sinTheta = sqrt(1 - cosTheta * cosTheta);        phi = i * PI/12; //这是决定烟花形状的主要变量 if(phi>360){phi=phi-360;}       firePosition[i] = new p5.Vector((radius+tx) * sinTheta * cos(phi), (radius+tx) * sinTheta * sin(phi), (radius+tx) * cosTheta);  //1发烟花里各个点的位置计算        firePosition[i] = p5.Vector.mult(firePosition[i], 1.12);    }
}

(6) html文件

<!DOCTYPE html>
<html lang=""><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>p5.js example</title><style> body {padding: 0; margin: 0;} </style><script src="../p5.min.js"></script><script src="../addons/p5.dom.min.js"></script><script src="../addons/p5.sound.min.js"></script><script src="…….js"></script></head><body></body>
</html>

2、手绘

三、总结——编程与手绘的比较

1、工具和载体

码绘的工具是代码、载体时电脑屏幕;手绘的工具是笔、载体是纸张。显然码绘的工具和载体消耗比较小,而且修改也更方便。

2、技法

码绘的技法主要是考验作图者的编程能力,虽然码绘也需要一定的构图能力和审美能力,但如何将想法用代码实现显然是更重要的一项技法;而手绘的主要技法是对画笔的运用和构图,两者在技法上的侧重点有很大不同。

3、理念

码绘的创作理念是从单元结构入手,进行多步骤、多形式的组合,而构图以及整体布局可以在大体框架的基础上后期再做调整、甚至重构,更多的是体现创作者的构思和理念;手绘则讲求现有整体结构再进行细致刻画,整体的协调性大于局部的细致性,而且手绘更多的是创作者情感的表达宣泄,引起观赏者情感上的共鸣。

4、创作体验和呈现效果

码绘注重的是创作结果,这样就有一个很大的问题是,当有新的想法出现时,不能像手绘那样迅速地实现,因为需要考量怎样用代码表现,并且根据脑海中的画面不断调整,才能呈现出来,这个过程比较漫长,很容易中途失掉灵感或者兴趣;手绘则更注重创作过程,创作者和观赏者的感受是大于创作结果的。这就导致码绘的呈现效果更侧重单纯的视觉体验和技术水平的体现,而手绘的呈现效果则更侧重情感和审美的体验。
在动态图的创作中,码绘有着明显的优势,码绘使得平面二维的空间能够对时间这一维度有具体的体现,而手绘动态效果更考验创作者的绘画功底,观赏者也要有一定的想象力和鉴赏能力才能体会手绘动态效果的美感。

5、应用和局限性

码绘的多变和绚丽使得他在视觉传达、数据可视化、沉浸式交互体验等数字媒体中有着广泛的应用,并且再互联网传播中更加高效,但是也因为高度数字化而产生科技的距离感,再情感表达上不是那么有利;传统手绘再情感表达和审美表达方面依然有很大优势,但是技术门槛比较高(要有一定的美术功底),普通人不太能够普及应用。

参考文件

p5.js官方文档(内附详细函数示例)
用p5.js制作烟花特效
0.1 用代码画画——搞艺术的学编程有啥用?
1.1 开始第一幅“码绘”——以编程作画的基本方法
“动态”作品编程示例

码绘VS手绘(二)动态绘图相关推荐

  1. 码绘与手绘——表达动态

    一.手绘表现动态: 这个题目一开始看来 ,手绘是处于非常劣势的地位的,因为电脑上可以实现动态的过程,就是用动画的原理,每秒绘制60帧,不断进行重绘图形,来达到运动的效果的. 而本身来讲,手绘的图片本质 ...

  2. 码绘与手绘的对比——动态

    码绘与手绘的对比--动态 版权声明:本文为博主原创文章,未经博主允许不得转载. 图形学最动人的地方就是可以用代码实现图形的动态效果,之前比较了静态效果下的码绘与手绘,传送门:https://blog. ...

  3. 用p5.js实现的码绘与手绘的比较(动态)

    用p5.js实现的码绘与手绘的比较(动态) 上篇:用p5.js实现的码绘与手绘的比较(静态)https://blog.csdn.net/wangyouxu24/article/details/8433 ...

  4. 码绘VS手绘(二) 如何让让静态图“动”起来

    前言 在上一篇码绘VS手绘(一) 编程与手绘的对比中,我们了解了有关码绘与手绘在静态图方面的比较,本文主要讲解如何分别通过手绘和码绘两种方式来使得静态图"动"起来,码绘使用的是pr ...

  5. 【动态】码绘VS手绘的对比——有点萌的开关

    [动态]码绘VS手绘的对比--有点萌的开关 背景简介 主题 成果展示 前期分析 制作过程 体会与思考 参考资料 背景简介 上一次简单的通过静态的手绘与码绘对两者进行了一些简单的对比,这一次更加好玩了, ...

  6. 码绘与手绘的比较【动态篇】

    圆的面积公式 我们都知道圆的面积公式是π*r^2,但这个公式怎么得来的呢?我们用一种直观的方式来看看这个公式的来历: 接下来我们尝试用码绘和手绘来实现一下第二张图片的动态了. 手绘 额..可以看出手绘 ...

  7. 码绘VS手绘|processing“运动”主题创作——如何让一只沙雕鸟起飞

    目录 一.代码逻辑 二.理论对比 三.参考资料 最终作品效果可以看上传在B站的视频:https://www.bilibili.com/video/av36523799 第一次码绘VS手绘指路:http ...

  8. 对比码绘与手绘——Motion graph

    上一篇博客做的是静态画,那这篇当然要讲讲动态画.同样地,这次我们也是从思路.技术.创作体验.创作偏好等方面来比较码绘与手绘,讨论异同. 首先,展示一下作品: 码绘 利用P5.JS绘制作品 手绘 利用数 ...

  9. 码绘”与手绘比较——静态篇(码绘使用p5.js)

    码绘图 手绘图 先大体说一下码绘图的实现吧 其实实现起来没什么技术难度,就是过程比较繁琐. 背景就是几个不同颜色,不同透明度的四边形和三角形,用quad()和triangle()两个函数搞定,就不贴代 ...

最新文章

  1. linux文本处理工具之grep与正则表达式语法
  2. 深度学习 Deep Learning with MATLAB(懒人版)
  3. [实验教程]网工都要会的IPv6 基础配置
  4. 【数据竞赛】一文看懂CCF BDCI 2020赛题任务与解析
  5. 西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...
  6. Golang语言写99乘法表-双重for循环
  7. python3 pygame 坦克自动移动
  8. php168 discuz论坛贴子调用设置,Z-blog调用Discuz论坛最新帖子的方法
  9. flex C#在线拍照
  10. 【Love2d从青铜到王者】第十六篇:Love2d之动画(Animation)
  11. 使用开源软件FFmpeg将各种格式视频转换成MP4视频格式(最简单方法)
  12. JavaScript实现打字机效果
  13. MATLAB 3d实时,MATLAB 3D 动画制作(三)- 实时随动3D动画设计
  14. 小丁在研究数学问题时遇到一个定义:对于排好顺序的k个数:x1,x2,x3,…,xk,称为数列Ak:x1,x2,x3,xk,其中k为整数且k≥3.定义V(Ak)=|x1-x2|+|x2-x3|+…+|x
  15. js版梅森旋转生成随机数
  16. ASA防火墙之NAT的实例配置
  17. 鸡声茅店月,人迹板桥霜;莫道君行早,更有早行人
  18. 最长回文子串(Java实现)
  19. TestStand-数据类型
  20. 线下餐饮受挫,狂奔的自热速食

热门文章

  1. 服务器虚拟机uefi,为虚拟机启用或禁用 UEFI 安全引导
  2. 富途证券面经(一面挂)
  3. 【内网安全】——数据库提权姿势
  4. 微信小程序软件测试junit,微信小程序兼容性能测试方法
  5. 大数据决策领跑零售业
  6. 在线制作数据库ER模型
  7. 一只会铲史的猫:我开发的软件一览
  8. Rasa 3.x 学习系列-Rasa [3.4.0] - 2022-12-14新版本发布
  9. 全网疯传!微信发原图暴露个人信息?微信高冷回应!真相来了...
  10. 实现链表的插入——头插/尾插