1年と半年かかった「the nature of code」の最後の課題が終わったところで、(正確には終わってないんですが・・最終課題の生態系プロジェクトがまだノータッチ)、
いままで書いたブログ記事へのリンク、課題を作って知って楽しかったこと・さっぱりわからなかったことなどまとめておこうと思います。
英語版はこちら
で読めます。
日本語版はこれ
Nature of Code -Processingではじめる自然現象のシミュレーション-
- 作者: ダニエル・シフマン,Daniel Shiffman,尼岡利崇,鈴木由美,株式会社Bスプラウト
- 出版社/メーカー: ボーンデジタル
- 発売日: 2014/09/16
- メディア: 大型本
- この商品を含むブログを見る
私はどちらも読みつつやりました。
はぁ楽しい本だった!
帯に「一番簡単な世界の作り方」と書いてあるんですが、言いえて妙。
canvas(sketch)の中で自分の書いたルールが、いきいきと、動く!
そしてシフマン先生が大好きになりました。
↓シフマン先生(この動画の最初で拾い上げているのがthe nature of codeです)
次はcoding rainbowやろうかなぁ。 ・・今見たらcoding[Undefined]になってる!商標権の問題だそうな。笑ってしまった
読んでいた時の自分なりのルール
- 本を読んで、そのあとprocessingのサンプルコードを読んで、課題はjavascriptで書く、p5.jsは使わない。
これは単に「書いたことがあるのがjavascriptしかないから」という理由なので特に大した意味はない縛りだったのですが、 おかげでprocessingは描画に特化した言語なんだと気づいたり・processingにある機能を使いたいなぁ〜と思ったら自分で書くしかなく、その結果ES2015を知ったりするきっかけになったりして振り返ると結構よかったかも。
- わからなかったらやめる・脱線する
「高校生や大学生はお休み中にさくっとやってしまってもいいですね」的な紹介をどこかでされていたため、さくっとできるかと思ったら、 全然そんなことはなく・・・。特に序盤よくつまずき、もう軽い気持ちでやることにしました。
課題のリンクとメモ
1~4章をやっていた頃はブログを書いてなかったので課題のリンクなしです。
無生物編
物体が動くのをシュミレートできるようになる
Chapter 0 はじめに
- アニメーションはパラパラ漫画みたいにちょっと動かして・消してを繰り返すと作れる
- 「ちょっと動かして」のルールをどう定義するかが大事
- random()に頼ることは有機的なデザインの解決にはならない。
- 擬似ランダムに偏りを持たせる方法
- 格率を高くしたい数値を多めに用意してそこから選ぶ
- 最初に選択肢を決めるランダム値の範囲を偏りのある状態で定義しておく
- ランダム値を2つ使う(1つ目はただのランダム値・二つ目は1つ目を使うか破棄するかの判別用)
- 平均値付近に多く分布させたい時はガウス分布が使える
- より自然なランダム値を生成するパーリンノイズというものがある
Chapter 1 ベクトル
- 座標を扱うときはxとyをまとめて扱えるベクトルとして使うと楽
- 位置 = 位置 + 速度
- 場所の変化の割合(速度)
- 速度 = 速度 + 加速度
- 速度の変化の割合(加速度)
- processingにはベクトルの計算のセットPVctorがある(javascriptにはないので自分でつくる)
- 移動オブジェクトが持つべきデータは何か?機能はなにか?ということを考えてオブジェクトをつくる
processingにはstatic関数と非static関数がある。(javascriptだとES21015で使えるようになる)
static関数がわからない
javascriptで書こうとするとPVectorを自作しないといけない
Chapter 2 力
- オブジェクトに力を適用(積算・すべての力を合計)するには 質量で割って、加速度のベクトルに力を加算する。 このときの加速度は瞬間ごとなので、フレームを次に進める前に0にする必要がある
- 物理の公式を使ってシミュレーションしたいとき
- 2章では摩擦や抵抗や重力をやってみた
- 重力の課題でオブジェクト間の対話についてでてくる。どっちに力を計算する機能をもたせるか?で結構迷った。
- 割り算の記号(/)を見たら0で割ることがないように注意する
Chapter 3 振動
- radian(孤の長さ = 半径のときの角度) = 2 * PI * (度数 / 360)
- 角度 = 角度 + 角速度
- 三角関数をつかってベクトルの大きさや方向などを調べたりできる
- 極座標とデカルト座標の変換は結構でてくる
- 単振動などは三角関数を使うと簡単に再現できる
- 波は単振動をずらしてアニメーションさせると作れる
- 波は足すことができる
Chapter 4 粒子系
- 粒子のような多くのものをスケッチするときには、複数のクラスや他のクラスのインスタンスのリストを保持するクラスをつくるとやりやすくなる
- 粒子をつくるときは存続期間のプロパティをつける(粒子が増えすぎると停止しちゃうので永続させない)
粒子には普通エミッター(粒子の初期速度・位置などの設定ができる発生源)がある
processingではArrayListをつかって粒子のリストを管理してこれをエミッターとする。
- processingのArrayListはiteratorオブジェクトを作れる。 (反復処理中に要素を削除したり追加したりしても2回参照したりスキップしたりせずにすべての要素に処理ができる!便利!) (hasNext()で次があれば実行させることができる!便利!)
ES2015の配列でもiteratorオブジェクトが作れる
粒子を管理する粒子系・粒子系を複数管理するクラス、を管理する・・・と、どんどん入れ子にして複雑にできる
- オブジェクト指向の基本原則(継承・ポリモーフィズム・カプセル化)がでてくるけれどここの部分はついていけてないのでまた絶対読み返す
継承を使うと他のクラスから特性と機能を受け継ぐことができる。
ポリモーフィズムが何か全然わからない・・
Chapter 5 物理ライブラリ
Box2Dをつかってみる
・・・の途中で脱落。
あとで読む
- 積分
- toxiclibs
生物編
環境に応じて動きを決められるようになる
Chapter 6 自律エージェント
複雑系のルールベースの技法を学んで、複雑な動きをつくれるようになる
- 自律エージェント = 環境ないでどう行動するかをリーダーや全般的な計画を受けずに自分で選択すること
- 自律エージェントの構成要素
- 環境を認識する「限られた」能力がある
- 環境からの情報を処理して行動を計算する
- リーダーを持たない
- 課題ででてくる「vehicle」は「模型は心を持ちうるか」という論文から。
- 作者: ヴァレンティノブライテンベルク,加地大介
- 出版社/メーカー: 哲学書房
- 発売日: 1987/06
- メディア: 単行本
- 購入: 1人 クリック: 33回
- この商品を含むブログ (12件) を見る
- レイノルズ(boidの人)の理想的なvehicle(仮想的な乗り物)
- 行動選択:環境の注意を向けて環境に応じて行動を計算する
- 操舵:行動を選択したら次の動きを計算する
- 移動運動:これは課題ではあんまり出てこないが、行動するときの動きを決める(足を左右交互にだすとか)
- 操舵力の式:操舵力 = 必要な速度(現在の位置から目標地点までの位置ベクトルを最大の速度などで適宜制限したもの) - 現在の速度
- 最大速度などの変数をいろいろあてて特定の動きのシュミレートができる
目標に近くなるにつれて減速させたり・・・必要な速度は自分で好きなように決めることができる
- 前方の点から円を描いて円周上のランダムな点を目標地点にする
- 壁の近くに来たら壁の反対方向へ最大速度ですすむ
- 流れ場などで環境から与えられる力に沿わせる など
経路追従の課題ではベクトル内積が活躍した
群れ
boidを描いて、処理速度をあげるにはどうするか考えた
Chapter 7 セル・オートマトン
- 単位を最小(ビット・0か1か)に絞って仕組みを考える
時間の経過とともに状態を変化させるやり方をセルオートマトンで見てみる。 すごく単純な系であっても洗練された形状をつくることができる!
2次元のセルオートマトンは世代をフレームで表してアニメーションにしていた
近隣と自分のセルの組み合わせで次の世代が0か1か決めるとき、必要な3つの数字を文字列にしてくっつけて3桁の数字にして、2進数に変換するというのをやっていた、これ思いつかないなぁと思った
Chapter 8 フラクタル
- 自然法則をコーディングするなら、丸や四角よりなどの理想化された形状だけでなく、複雑なパターンを作る必要がある(そのためにフラクタルを学ぶ)
- フラクタルとは、自己相似性のある形状(きりとった一部が、全体を縮小した複製になっている・小さい尺度の構造がある・再帰性がある)
- 株価の変動グラフなどは確率的フラクタル
再帰関数には終了条件が必要
L-system フラクタルを管理するメカニズム 文字列でルールを表して、タートルグラフィックで描写する、とルールと表現が切り離されてるのが面白かった
知能編
生物の進化の法則を使ってオブジェクトを進化させる
Chapter 9 遺伝と進化
- 今までの課題は初期化するときランダム性や考えた結果としてオブジェクトに特性を割り当てていたが、進化の過程にまかせてみても面白い
- 結果がわかっているときに総当たり的なアルゴリズムを組んで解こうとするのはよくない
-
- 遺伝子の型と表現を切り離してつくる
- 適応度を評価する関数を自分で設計する
- 評価の高い遺伝子を次の世代に拾われやすいようにする
でも突然変異させるのも必要
表現と遺伝子を切り離してつくるといろいろ応用できる
適応度関数を変化させるとこんなことも
適応度関数の部分を人力でやってもいい(対話的選択) もっとも人気のあった作品に似た作品を次の世代に残しやすくするとか
Chapter 10 ニューラルネットワーク
- 脳の機能の概念をヒントにより環境に適応できる動きを作ってみる
- 機械学習の初歩の初歩の部分を作ってみる
教師あり学習(正解がある)
強化学習(環境に適応する)
パーセプトロンは線形分離可能な問題しか解決できない。でも複数のパーセプトロンを組み合わせたら解決出来る(多層パーセプトロン)
アニメーションで多層パーセプトロンをイメージする
脱線して読んだ(読むつもり)の本
- 作者: 三井秀樹
- 出版社/メーカー: NHK出版
- 発売日: 2000/03/01
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 11回
- この商品を含むブログ (8件) を見る
自然物の美しさはフラクタルの美しさだった・・・!おまけに黄金比もフラクタルの美しさ。ああフラクタル!
[普及版]ジェネラティブ・アート―Processingによる実践ガイド
- 作者: マット・ピアソン,Matt Pearson,久保田晃弘,沖啓介
- 出版社/メーカー: ビー・エヌ・エヌ新社
- 発売日: 2014/11/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
- 作者: 井庭崇,福原義久
- 出版社/メーカー: NTT出版
- 発売日: 1998/06/01
- メディア: 単行本
- 購入: 4人 クリック: 60回
- この商品を含むブログ (26件) を見る
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/03/24
- メディア: 大型本
- 購入: 41人 クリック: 707回
- この商品を含むブログ (387件) を見る
- 作者: 近藤滋
- 出版社/メーカー: 学研プラス
- 発売日: 2013/09/13
- メディア: 単行本
- この商品を含むブログ (8件) を見る
アンモナイトも、結晶の螺旋も、しましま模様も、なんでできるか解説がわかりやすく書かれててスッキリとした気持ちに。 植物の茎の先端の「中央部分の連続した拡大と周囲の相似形の構造」が黄金比の長方形そのものだ! コッホ曲線を単なる座標を再帰関数で扱う書き方からクラスを使う書き方へ変換する課題をやっていたときに、この本を思い出したりした。 あと後ろの方の自伝が胸熱。
私は美術館とかにいったら絵画の細部を眺めるのが好きで、 直線を描いてる部分だったらマスキングテープの剥がれる部分のちょっと絵の具が引っ張られて固まった感じとかすごく綺麗だなって見てしまうんですが、 それって8章に出てきた自己相似性のある形が好きとも言える。 このサイトはかなり高解像度の作品が収容されてるので信じられないくらい拡大できて細部が眺められる。あぁ欲が満たされる・・。