1. 程式人生 > >手繪和碼繪兩種方式創作“運動”主題

手繪和碼繪兩種方式創作“運動”主題

藝術的展現形式有多種多樣,繪畫的方式也有很多。這篇文章主要來比較一下手繪與碼繪。

什麼是碼繪?用程式語言即程式碼來畫畫。一般人更多接觸到的是手繪,只有從事或研究相關方面的才會比較瞭解碼繪。聽說現在的藝術生都要學點程式設計呢。

上面兩張就是用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/

的中文學習網站就很不錯

創作體驗:

            手繪創作就很輕鬆啊,可以發揮你的想象隨意創作,不一定要畫的特別像,只要能表達出自己的想法我覺得就可以了,如果只是作為課外興趣的話。

             碼繪就沒想象中那麼簡單了。要考慮畫中物件的線條,位置是否到位,不然機器才不管你想畫什麼,只會跟著程式碼 走。碼繪前要整理好創作思路,有些還需要一些特效來處理。需要對相應程式語言的學習與研究。

呈現效果:手繪通過畫筆的的創作,如果繪畫基礎紮實,那麼應該能比較直觀的表現出東西。當然,如果要實現“動態”效果,那 就需要良好的繪畫技巧,抓取動態中的一個場景,由靜生動,從靜態圖中給人會動的視覺效果。

                    碼繪通過一定的程式設計技巧還是可以展現出比較酷炫的效果的,網上就有很多碼繪的有趣的栗子,可自行搜尋檢視啊。

侷限性:手繪比較活潑,所以很難創作那種的非常規範龐大的作品,即使要畫也是比較複雜費力的,而碼繪編輯好程式碼就可以一                   鍵生成啊。相對的,碼繪比較死板,不能隨意表現出一些深刻的含義。

應用: 手繪的應用還是很常見的,畫家通過作品向世人表達情感嘛。碼繪對藝術生的藝術創作也是很有用的,一些設計師就需                 要用電腦工具來更方便的設計作品。

這篇的動態手繪&碼繪的比較分析就到這吧。。。

參考資料連結: