手繪和碼繪兩種方式創作“運動”主題
藝術的展現形式有多種多樣,繪畫的方式也有很多。這篇文章主要來比較一下手繪與碼繪。
什麼是碼繪?用程式語言即程式碼來畫畫。一般人更多接觸到的是手繪,只有從事或研究相關方面的才會比較瞭解碼繪。聽說現在的藝術生都要學點程式設計呢。
上面兩張就是用processing作的動態圖和靜態圖,是不是覺得神奇又有趣呢。深入瞭解才能知道碼繪中的奧祕。
碼繪一般用processing,p5.js。processing是一個互動程式設計軟體,java語言發展而來。而且動畫效果是跑在processing專門的模擬器上。 接下來展示用processing編寫煙花特效。
完整程式碼
ArrayList<Fireworks> fireworks=new ArrayList<Fireworks>(); void setup () { fullScreen(P3D); //全屏顯示 frameRate(50); hint(DISABLE_DEPTH_TEST); blendMode(ADD); imageMode(CENTER); } void draw () { background(0,0,40); for(int i=0;i<fireworks.size();i++){ Fireworks art=fireworks.get(i); if(art.centerPosition.y-art.radius>height){ fireworks.remove(i); } art.display(); art.update(); } } void keyPressed(){ //按下空格產生煙花 fireworks.add(new Fireworks(80));//80為煙花初始半徑 } PImage createLight(float rPower,float gPower,float bPower){ int side=64; float center=side/2.0; PImage img=createImage(side,side,RGB); for(int y=0;y<side;y++){ for(int x=0;x<side;x++){ float distance=(sq(center-x)+sq(center-y))/10.0; int r=int((255*rPower)/distance); int g=int((255*gPower)/distance); int b=int((255*bPower)/distance); img.pixels[x+y*side]=color(r,g,b); } } return img; } //煙花 class Fireworks{ //煙花的數量 int num=512; //煙花中心的初期位置 PVector centerPosition=new PVector(random(width/8,width*7/8),random(height/2,height*4/5),random(-100,100)); //煙花中心的初始速度 PVector velocity=new PVector(0,-22,0); //重力 PVector accel=new PVector(0,0.4,0); PImage img; float radius; PVector[] firePosition=new PVector[num]; Fireworks(float r){ float cosTheta; float sinTheta; float phi; float colorchange=random(0,5); radius=r; for (int i=0;i<num;i++){ cosTheta = random(0,1) * 2 - 1; sinTheta = sqrt(1- cosTheta*cosTheta); phi = random(0,1) * 2 * PI; firePosition[i]=new PVector(radius * sinTheta * cos(phi),radius * sinTheta * sin(phi),radius * cosTheta); firePosition[i]=PVector.mult(firePosition[i],1.12); } //調整煙花隨機顏色,使其更亮麗 if(colorchange>=3.8){ img=createLight(0.9,random(0.2,0.5),random(0.2,0.5)); }else if(colorchange>3.2){ img=createLight(random(0.2,0.5),0.9,random(0.2,0.5)); }else if(colorchange>2){ img=createLight(random(0.2,0.5),random(0.2,0.5),0.9); } else { img=createLight(random(0.5,0.8),random(0.5,0.8),random(0.5,0.8)); } } void display(){ for (int i=0;i<num;i++){ pushMatrix(); translate(centerPosition.x,centerPosition.y,centerPosition.z); translate(firePosition[i].x,firePosition[i].y,firePosition[i].z); image(img,0,0); popMatrix(); firePosition[i]=PVector.mult(firePosition[i],1.015); } } void update(){ radius=dist(0,0,0,firePosition[0].x,firePosition[0].y,firePosition[0].z); centerPosition.add(velocity); velocity.add(accel); } }
效果圖如下:
還是很美麗酷炫的!
然後是我的煙花手繪:
畫的不是很細緻,畢竟技術生hhh.......
下面從不同角度來比較手繪與碼繪的特點
工具:手繪是用畫筆,可以用真正的畫筆,或者電腦上的繪畫軟體中的畫筆,當然電腦的畫筆不太好操控;
碼繪是用程式設計軟體,我用 的是processing;
技巧:手繪需要紮實的繪畫技巧,就比如速寫課上 所學的,不一定每一筆都畫到位,學會取捨,讓畫面看起來更加完整美觀;
碼繪需要一定的程式設計技能,網上有很多資料網站可供學習,如processing的http://iprocessing.cn/
創作體驗:
手繪創作就很輕鬆啊,可以發揮你的想象隨意創作,不一定要畫的特別像,只要能表達出自己的想法我覺得就可以了,如果只是作為課外興趣的話。
碼繪就沒想象中那麼簡單了。要考慮畫中物件的線條,位置是否到位,不然機器才不管你想畫什麼,只會跟著程式碼 走。碼繪前要整理好創作思路,有些還需要一些特效來處理。需要對相應程式語言的學習與研究。
呈現效果:手繪通過畫筆的的創作,如果繪畫基礎紮實,那麼應該能比較直觀的表現出東西。當然,如果要實現“動態”效果,那 就需要良好的繪畫技巧,抓取動態中的一個場景,由靜生動,從靜態圖中給人會動的視覺效果。
碼繪通過一定的程式設計技巧還是可以展現出比較酷炫的效果的,網上就有很多碼繪的有趣的栗子,可自行搜尋檢視啊。
侷限性:手繪比較活潑,所以很難創作那種的非常規範龐大的作品,即使要畫也是比較複雜費力的,而碼繪編輯好程式碼就可以一 鍵生成啊。相對的,碼繪比較死板,不能隨意表現出一些深刻的含義。
應用: 手繪的應用還是很常見的,畫家通過作品向世人表達情感嘛。碼繪對藝術生的藝術創作也是很有用的,一些設計師就需 要用電腦工具來更方便的設計作品。
這篇的動態手繪&碼繪的比較分析就到這吧。。。
參考資料連結: