PHP で 3D plot

GIF 画像合成では減色処理が必要になるので、減色アルゴリズムの検証として
色んな画像ファイルに対して、 R,G,B ヒストグラムを 3D にマッピングしてみようかと、
軽く 3D plot 処理を考えていたところ、以下の PHP ライブラリを紹介してもらいました。

早速実験。

$x_axis = $world->createObject('cube', array(128, 4, 4));
$x_axis->setColor(new Image_3D_Color(255, 100, 100));
$x_axis->transform($world->createMatrix('Move', array(64, 0, 0)));
$y_axis = $world->createObject('cube', array(4, 128, 4));
$y_axis->setColor(new Image_3D_Color(100, 255, 100));
$y_axis->transform($world->createMatrix('Move', array(0, 64, 0)));
$z_axis = $world->createObject('cube', array(4, 4, 128));
$z_axis->setColor(new Image_3D_Color(100, 100, 255));
$z_axis->transform($world->createMatrix('Move', array(0, 0, 64)));

うーん。とりあえず軸を書いてみたのですが、使うのめんどいし、
スケールが把握できないです。。(64 の値は探って見つけた値。。)
線(という考え自体ダメダメですが ^^;)をひくにも、ココからココって
指定できなくて、物体を置いた後に移動(必要なら回転も)しなきゃだし。

そもそもオーバースペックな感じがします…

自分で作っちゃえ

イメージ図。(図の d は微分ではなく、distance の頭文字です。ごめんなさい)

簡単なグラフを書くのが目的なので、

  • ワイヤーフレームのみで Zバッファ無し
  • 座標変換は世界座標へのオイラー角回転のみ
  • カメラ位置決めうち = (0, 0, $distance_to_eye)
  • その他、一般的な 3D API は殆ど(一切といっていいかも)無し

という究極の手抜きっぷりの簡易3Dライブラリを作ってみました。

仕様は↓こんな感じ。

  • スケールは全て pixel 単位
  • モニタ表面から自分の目までの物理距離は明示的に指定
  • 画像の中央を (0, 0, 0) の原点として計算する
  • x軸は右方向、y軸は上方向、z軸は手前方向。(右手座標系)
  • 一応、原点を中心とした回転は出来る。(x軸, y軸, z軸 の順で適用)
  • 任意の色で点を打てる。任意の色で線が引ける

自分の用途にはこれで十分。これ位なら 30分で作れますし。:-)