p5.jsでビジュアルコーディングしてみる。

#◆p5.jsとは
![p5.js_01.png](https://qiita-image-store.s3.amazonaws.com/0/66295/8e8f43e9-6d6a-cacd-bd77-2670a9e2d8c4.png)

processingをjavascriptに移植したものです。
javascriptなので環境を作らなくてもすぐにコードを書くことができます。
さらに拡張機能をライブラリとして使用可能で、サウンド、3D、グラフィックス、htmlやDOMの直接操作することもできます。
図形やグラフィカルな描画に特化しているので、アーティストやデザイナにも取っ付きやすいビジュアルコーディングツールになってます。ありがたや…

#◆環境を整える
- http://p5js.org/
公式ページからCDNのリンクをHTMLに貼付けるだけで環境設定終了。

- codepenでのプログラミングが便利！
http://codepen.io
打ち込んだコードが即反映されるので試し書きしたいときに。


#◆描画してみる

↓p5.jsは下記のサイトで基本的な流れを学ぶことができます。
ドットインストールp5.js入門
http://dotinstall.com/lessons/basic_p5js

###setupとdraw
p5.jsの基本はfunction setupという最初に呼ばれる関数と、function drawというフレーム毎に読み込まれる関数です。

```
function setup(){
  createCanvas(windowWidth, windowHeight);//描画領域を指定
}

function draw(){
  background(0);//毎フレームごとに黒色描画
}
```
###p5.jsが3Dにも対応したとのことなので、参考コードみながら作ってみましょう。
参考コード:Sine Cosine in 3D
https://p5js.org/examples/3d-sine-cosine-in-3d.html

>![p5.js_01.gif](https://qiita-image-store.s3.amazonaws.com/0/66295/b6a18e22-8cf1-4ed9-1a46-5fb7f4081df0.gif)
http://codepen.io/minamooon/pen/ZbRKKB
上記サイトの参考コード+ドラッグでも視点が移動できるようにしました。


setupは描画するキャンバスを作るだけです。
2Dのときはwidthとheightの指定のみでしたが3Dの場合は＋WEBGL表記します。

```
function setup(){
  createCanvas(windowWidth, windowHeight, WEBGL);
}
```

drawには上にのせる3Dオブジェクト、アニメーション、ライトの設定、ドラック対応などを書きます。

```
function draw(){
  background(0);

  
  /*ライトの設定。マウスの位置で光の方向が変化*/
  const locY = (mouseY / height - 0.5) * (-2);
  const locX = (mouseX / width - 0.5) * 2;

  ambientLight(100, 80, 80);
  pointLight(200, 200, 200, locX, locY, 0);
  
  /*Yを少しずつ回転。*/
  rotateY(frameCount * 0.0001);
  //ドラック対応
  orbitControl();

  for(let j = 0; j < 10; j++){
    push();
    for(let i = 0; i < 100; i++){
      translate(sin(frameCount * 0.001 + j) * 200, sin(frameCount * 0.001 + j) * 300, i * 0.1);
      rotateZ(frameCount * 0.002);
      push();
      /*プリミティブの作成*/
      sphere(2, 10, 100); 
      pop();
    }
    pop();
  }
}
```

背景色を毎フレームごとに描画

```
background(0);
```

オブジェクトにあたるライトの指定をします。
マウスの位置によって光の方向が変化させているのですが、オブジェクト自体が白くて小さいのでみえないですね。。。

```
  const locY = (mouseY / height - 0.5) * (-2);
  const locX = (mouseX / width - 0.5) * 2;

  ambientLight(100, 80, 80);
  pointLight(200, 200, 200, locX, locY, 0);

```

 カメラ視点を少しずつ回転させます。orbitControlでドラックしても視点が動くようにします。この辺three.jsと似ていますね。

```
 rotateY(frameCount * 0.0001);
  //ドラック対応
  orbitControl();

```

メインオブジェクトの描画です。Sineの動きを使うことで規則的で面白いアニメーションを作ることができます。
オブジェクトは今回sphere(球体)で作成しましたがplane(板ポリ)、box(立方体)などの数種類のプリミティブにすることも可能です。
http://p5js.org/examples/examples/3D_Geometries.php

```
for(let j = 0; j < 10; j++){
    push();
    for(let i = 0; i < 100; i++){
      translate(sin(frameCount * 0.001 + j) * 200, sin(frameCount * 0.001 + j) * 300, i * 0.1);
      rotateZ(frameCount * 0.002);
      push();
      /*プリミティブの作成*/
      sphere(2, 10, 100); 
      pop();
```

#◆p5.js,processing関連参考サイト、書籍など
####**学習する**

・Youtube
processingの中の人であるDaniel Shiffmanさんの動画講座です。
https://www.youtube.com/playlist?list=PLRqwX-V7Uu6Zy51Q-x9tMWIv9cueOFTFA

・learningprocessing
Daniel Shiffmanさんのサイト
EXERCISESがたくさんあります。
そして動画にもなっているので初心者にうれしいです。
http://learningprocessing.com/

・Processing 学習ノート
http://www.d-improvement.jp/learning/processing/

####**デザインを鑑賞する**

・codepen
コードも確認できるので勉強にもなります。
http://codepen.io/search/pens?q=p5.js&limit=all&type=type-pens

・tumblr
processingで検索すると…
https://www.tumblr.com/search/processing

・OpenProcessing
http://www.openprocessing.org/

・codedoodl.es
描画される形、アニメーションともに洗練されていてかっこいい！
デザインのインスピレーションにも。
http://codedoodl.es/

####**参考書籍**

![alt](http://ecx.images-amazon.com/images/I/61k1xhWPs0L._SX391_BO1,204,203,200_.jpg)
[Processing](http://www.amazon.co.jp/gp/product/4861009502/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4861009502&linkCode=as2&tag=aoiro0a-22)
2015年に日本語翻訳版が発売されました。
基礎からprocessingについて学べます。

![alt](http://ecx.images-amazon.com/images/I/5105-gv-%2B9L._SX352_BO1,204,203,200_.jpg)
[NATURE OF CODE](http://www.amazon.co.jp/Nature-Code-Processing%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E8%87%AA%E7%84%B6%E7%8F%BE%E8%B1%A1%E3%81%AE%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%80%E3%83%8B%E3%82%A8%E3%83%AB%E3%83%BB%E3%82%B7%E3%83%95%E3%83%9E%E3%83%B3/dp/4862462456/ref=pd_bxgy_14_img_2?ie=UTF8&refRID=0EWQMV82TB8C1WJG7C01)
物事の基本的な動き、自然界の物理的なルールをコード書きつつ学べます。コードをweb上でDLできたり、著者であるShiffmanさん解説動画がyoutubeに上がっていたりと、内容難しめですがとっつきやすいです。
・サンプルコード
https://github.com/shiffman/The-Nature-of-Code-Examples
・youtube
https://www.youtube.com/playlist?list=PLRqwX-V7Uu6YVljJvFRCyRM6mmF5wMPeE

![alt](http://ecx.images-amazon.com/images/I/41Eq81vSVPL._SX412_BO1,204,203,200_.jpg)
[ジェネラティブ・アート―Processingによる実践ガイド](http://www.amazon.co.jp/%E6%99%AE%E5%8F%8A%E7%89%88-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88%E2%80%95Processing%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E3%83%9E%E3%83%83%E3%83%88%E3%83%BB%E3%83%94%E3%82%A2%E3%82%BD%E3%83%B3/dp/4861009634/ref=pd_sim_14_3?ie=UTF8&dpID=41Eq81vSVPL&dpSrc=sims&preST=_AC_UL160_SR132%2C160_&refRID=04W0R3ACG9ZA41RYKNN7)
processingのコードだけではなく、processingの歴史、ジェネラティブアートの考え方など読み物としてもとても楽しめる一冊。コードを写すけでも美しい形や、動きができ初心者でも楽しみながら学ぶことができます。

![alt](http://ecx.images-amazon.com/images/I/51JdWtC96TL._SX356_BO1,204,203,200_.jpg)
[Generative Design ―Processingで切り拓く、デザインの新たな地平](http://www.amazon.co.jp/Generative-Design-%E2%80%95Processing%E3%81%A7%E5%88%87%E3%82%8A%E6%8B%93%E3%81%8F%E3%80%81%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%96%B0%E3%81%9F%E3%81%AA%E5%9C%B0%E5%B9%B3-Hartmut-Bohnacker/dp/4802510136/ref=sr_1_1?s=books&ie=UTF8&qid=1458021184&sr=1-1&keywords=processing)
フルカラー重量1.9kgという大ボリュームの一冊！美しい作品が見開きいっぱいに印刷されているので眺めているだけでもものすごく楽しいです。コードはすべてwebからDLできるので、プログラム初心者でもサンプルコードをいじりながら原理を学んでいくことができます。
・サンプルコード
http://www.bnn.co.jp/support/generativedesign/code/

![alt](https://images-na.ssl-images-amazon.com/images/I/51rJK31rMKL._SX394_BO1,204,203,200_.jpg)
[Processing クリエイティブ・コーディング入門 - コードが生み出す創造表現](https://www.amazon.co.jp/Processing-%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E7%94%9F%E3%81%BF%E5%87%BA%E3%81%99%E5%89%B5%E9%80%A0%E8%A1%A8%E7%8F%BE-%E7%94%B0%E6%89%80-%E6%B7%B3/dp/4774188670)
クリエイティブ・コーディングの第一人者、田所 淳さんの本。
SFCでの講義ノートは無料で読めます。

https://yoppa.org/sfc-design21


![alt](https://images-na.ssl-images-amazon.com/images/I/61S08Me5AXL._SX394_BO1,204,203,200_.jpg)
[数学から創るジェネラティブアート - Processingで学ぶかたちのデザイン](https://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%81%8B%E3%82%89%E5%89%B5%E3%82%8B%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%82%A2%E3%83%BC%E3%83%88-Processing%E3%81%A7%E5%AD%A6%E3%81%B6%E3%81%8B%E3%81%9F%E3%81%A1%E3%81%AE%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-%E5%B7%B4%E5%B1%B1-%E7%AB%9C%E6%9D%A5/dp/4297104636)
数学のアイデアをデザインやアートに応用したい。
数学からのアプローチでジェネラティブアートを作ってみたい方向けの本です。



![alt](https://images-na.ssl-images-amazon.com/images/I/51m7zcdhX9L._SX353_BO1,204,203,200_.jpg)
[Generative Design with p5.js](https://www.amazon.co.jp/Generative-Design-p5-js-p5-js%E7%89%88%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%86%E3%82%A3%E3%83%96%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-%E2%80%95%E3%82%A6%E3%82%A7%E3%83%96%E3%81%A7%E3%81%AE%E3%82%AF%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0/dp/4802510977)
待ちに待ったp5.js版ジェネラティブデザインの本です。
上記大型本「ジェネラティブ・アート―Processingによる実践ガイド」の基礎パートのみを抜き出し、p5.jsに対応した再編集版。



![alt](http://ecx.images-amazon.com/images/I/41oWnX8VL1L._BO2,204,203,200_PIsitb-sticker-v3-big,TopRight,0,-55_SX324_SY324_PIkin4,BottomRight,1,22_AA346_SH20_OU09_.jpg
)
[Getting Started with p5.js](http://www.amazon.co.jp/Getting-Started-p5-js-Interactive-JavaScript-ebook/dp/B016VF1G3W/ref=sr_1_cc_1?s=aps&ie=UTF8&qid=1453136295&sr=1-1-catcorr&keywords=p5.js)
p5.js本ですが、英語版のみの発売です。