Vectors

nature of codeをちゃんとやろうと思った。何となく読んだりコード書き換えてみたりはしてたんだけど、いくつか勉強しておきたい項目を取り上げて書くつもり。まずはVectorsから。実はVector3Dクラスが何をしてるのかとかよく理解してなかった。

motion 101のメインになる部分(hellomotion.pde)とThingクラスの余計なところを削って円の動きだけに注目。Vector3Dクラスを使うにはVector3D.javaをAdd File...でスケッチフォルダに追加するかライブラリを入れてimport noc.*;と書いておく必要がある。

vec3dmotion.pde

Thing t;
void setup() {
  t = new Thing(new Vector3D(0.01, 0.01), new Vector3D(0, 0), new Vector3D(0, 0));
}

void draw() {
  background(204);
  t.go();
}

Thing.pde

class Thing {
  Vector3D loc;
  Vector3D vel;
  Vector3D acc;
  
  Thing(Vector3D a, Vector3D v, Vector3D l) {
    this.acc = a.copy();
    this.vel = v.copy();
    this.loc = l.copy();
  }
  
  void go() {
    update();
    borders();
    render();
  }
  
  void update() {
    vel.add(acc);
    loc.add(vel);
  }
  
  void borders() {
    if(loc.x > width) {
      loc.x = 0;
    }
    if(loc.x < 0) {
      loc.x = width;
    }
    if(loc.y > height) {
      loc.y = 0;
    }
    if(loc.y < 0) {
      loc.y = height;
    }
  }
  
  void render() {
    ellipse(loc.x, loc.y, 10, 10);
  }
}

位置は点(Points)であり、速度/加速度はベクトル(Vectors)。コーディングをシンプルにするために、これらを全てベクトル(大きさと方向)として扱う。

setup()メソッドの中でThingクラスのインスタンスを作る時に、Vector3Dのインスタンスを生成して値を渡してるんだけど、この時の引数が2つ(new Vector3D(x,y))だと2次元、3つ(new Vector3D(x,y,z))だと3次元になる。実際には2つの場合はzに0が入るというだけなのでVector3Dのインスタンスは常にx,y,zで3次元の値を持ってるんだけど。

Thingクラスのコンストラクタではcopy()メソッドを使って、先ほど生成されたVector3Dクラスのインスタンス変数からThingクラスのインスタンス変数に値をコピーして格納してる。

加速度から速度を導いて、速度から位置を導く、という流れ。

Vector3D使わないとすればこうなる。
normalmotion.pde

Thing t;
void setup() {
  t = new Thing(0.01, 0.01, 0, 0, 0, 0);
}

void draw() {
  background(204);
  t.go();
}

Thing.pde

class Thing {
  float x;
  float y;
  float vx;
  float vy;
  float ax;
  float ay;
  
  Thing(float ax, float ay, float vx, float vy, float x, float y) {
    this.ax = ax;
    this.ay = ay;
    this.vx = vx;
    this.vy = vy;
    this.x = x;
    this.y = y;
  }
  
  void go() {
    update();
    borders();
    render();
  }
  
  void update() {
    vx += ax;
    vy += ay;
    x += vx;
    y += vy;
  }
  
  void borders() {
    if(x > width) {
      x = 0;
    }
    if(x < 0) {
      x = width;
    }
    if(y > height) {
      y = 0;
    }
    if(y < 0) {
      y = height;
    }
  }
  
  void render() {
    ellipse(x, y, 10, 10);
  }
}

これはこれでわかりやすい。けど多分後々Vector3Dが効いてくるんだと思う。

ベクトルとかの数学的な概念とか、コード使ったアニメーションで勉強になるのは『ActionScript 3.0 アニメーション』。
スクリプトだけで全部やるからflash持ってなくても動くものが作れる。flex環境のセットアップとかも丁寧に書いてあるしその辺は検索すれば出てくる。値段は高いけど、夏休み(もう大分過ぎてますが)にこれ1冊やると思えばどっか遊びに行くより楽めるし安い。続編も出るらしいし。

processingとActionscript3.0の行き来はそれほど苦ではないと思うので、両方読み書きできるといいと思う。既に使えるソースコードが沢山公開されてる訳だし。

今までは使えそうなコードを集めて勘でプログラミングしてたんだけど、細かい調整できるようにそろそろスクラッチでも色々ちゃんと書けるようになりたい。DJからトラックメイカーへ。

自前のblog環境整えないとな、と思う。かゆいところに手が届かないストレスで投稿が減ってるってのもあるから、何とかしたい。