dot_pict_3d.jpg


3Dドット絵

 「チーズ好きのねずみ」では、ねずみをナノブロックでモデリングしたのですが、そのデータは、PLYファイルと言う、形式で提供しました。今回は、そのPLYファイルの作り方についてのレクチャです。

3Dドット絵を描くツール

 ナノブロックの様な、直方体をベースとしたモデリング、と言うことで、まずは、ドット絵が頭に浮かびました。ドット絵と言えば、普段Windowsでプログラムを作っていると、「アイコンエディタ」みたいなもので、アイコンを作っています。
 これを三次元(3D)に拡張した物は無いものか?と探したところ、ソフトウェアがいくつか見つかりました。その中から、操作が直感的でわかり易かったことや、Xi-TRACEで読み込み可能なテキスト形式のデータでエクスポート可能だった、MagicaVoxelというソフトウェアをダウンロードしてインストールしました。

  MagicaVoxelを検索する(別ウインドウが開きます)

 起動すると、以下の様な感じです。

magicavoxel.jpg

 小さくて恐縮ですm(1__)m。

 画面には、メニューと言ったものは無く、左・右のパレットにあるツールを選択しながら、中央の画面でエディットして行く感じです。最初は少し慣れが必要ですが、ドットを削ったり、付け足したりが容易にできます。ミラー編集やコピー&ペーストもできて、一通り必要な機能はすぐに使いこなせるようになります。
 作者が見る限り、説明書の類は見つからなかったので、ツールの名称や、実際に使ってみて、どのような動きになるのか?を確かめながら、探っているところです。

 手探り状態で作ったデータのサンプルをいくつかご覧に入れます。以下、画像の下に、簡単なコメントを挿入して行きます。

smpl1.jpg

 作者の落款です。2Dのデザインを立体化してみました。


smpl2.jpg

 カド消しです。って、所有はしていないので、イメージで作りました。書き物はボールペン派なので、消しゴムは使いません。


smpl3.jpg

 拙作ソフトウェアOlive+のアイコンを立体化してみました。普通に、二次元でアイコンの形状をなぞった後で、厚み方向にブロックを盛り付けることで簡単に立体化することができました。


smpl4.jpg

 今度は、Xi-TRACEのアイコンです。旧バージョン(X-TRACE)のアイコンなのですが、現バージョンでも16×16[ドット]のミニアイコンは、このデザインです。
 元々、三次元空間に球体を3つ配置した画像を、二次元に落とし込んでいた物なので、三次元のイメージのまま、モデリングしました。1つ前のOlive+のアイコンの時とは、全く異なるアプローチです。


smpl5.jpg

 電子工作で嵌まっている、Arduino UNOというマイコンボードをモデリングしてみました。実物を横目に眺めながら、正に、ブロックを積み上げて組み立てて行く感覚で作りました。


smpl6.jpg

 最初からある程度の大きさで組み立てようとすると結構大変なので、最初は163ドット程度の粗いデータ(上図)から作成します。これを縦横奥行き方向に引き伸ばして、角を取ったり細かい部分を作り込むなど、形を整えると以下図の様になります。

smpl7.jpg

 段々大きく引き伸ばしながら作業して行くと、全体のイメージがつかみ易くて楽でした。

データをXi-TRACEで読み込む

 MagicaVoxelで作成したデータは、「Projectパレット ⇒ Exportコマンド」でエクスポートすることができます。いくつかの形式を試してみたのですが、仕様不明なバイナリデータでは、Xi-TRACEにインポートするのは不可能です。テキスト形式で出力できたのは、OBJファイルとPLYファイルでした。

OBJファイルを試す

 Wavefront社OBJファイルは、Xi-TRACEが標準でサポートしているファイルなので、データを取り込んでレイトレーシングが可能です。実行してみたところ、ちゃんと形状は表示されたのですが、色が付きませんでした。
 「色情報ファイル(MTLファイル)も一緒にエクスポートされているのに、変だな〜」と、思ってMTLファイルを見てみたところ、マッピングデータがPNGファイルではないですか。Xi-TRACEはPNGファイルの読み込みに対応していないので、これが原因ですね。

※MTLファイルはOBJファイルから取り込まれています。Xi-TRACEは、MTLファイルの取り込みにも対応しているので、本来は色付きでレイトレーシングされるはずです。

  ======== MTLファイル
  # MagicaVoxel @ Ephtracy
  newmtl palette
  illum 1
  Ka 0.000 0.000 0.000
  Kd 1.000 1.000 1.000
  Ks 0.000 0.000 0.000
  map_Kd dot_pict_3d.png
  ← ここを.bmpに書き換える

 Microsoft PaintでPNGファイルを読み込んで、BMPファイルでセーブしました。続いて、MTLファイルをテキストエディタで開いて、ファイル名".png"となっているところを".bmp"に書き換えて、OBJファイルをXi-TRACEで読み込ませたところ、以下の様にレイトレーシングできました。

expt_obj.jpg

 MODELAデータから、wobj命令を使ってインポートすれば、好きな照明で照らしたり、背景など、他のデータと組み合わせて使用することができるようになります。

 でも、コレジャ無い……(1x_;)。OBJファイルは、ドットデータではなくて、ポリゴンデータとしてエクスポートされてしまっています。各ドットをナノブロックなどに置き換えて、モデリングに使いたいので、ポリゴンデータを出力してくるOBJファイルは、ちょっと違います。

PLYファイルを試す

 もう一つのPLYファイルを見てみました。
 PLYファイルはOBJファイルと同様に、1)頂点データを定義、2)頂点データを繋いでポリゴンデータを定義、という形式で、ポリゴンデータを定義できるフォーマットらしいと解りました。
 と、言う事は、OBJファイルと同様、ポリゴンデータが出力されてしまっているのか?と、思いきや、頂点データだけをエクスポートするコマンド(Export ⇒ point)がありました。これこれ!

 PLYファイル(頂点データのみ)の構造を、以下のサンプルを使って説明します。対応するデータを表示して、その下に解説を加えて行きます。

  ply
  format ascii 1.0
  comment : MagicaVoxel @ Ephtracy


 ヘッダとコメントです。

  element vertex 514

 頂点(vertex)データの要素(element)数が514個だよ、と言う宣言です。

  property float x
  property float y
  property float z
  property uchar red
  property uchar green
  property uchar blue


 頂点データの意味を宣言しています。頂点データは、空白(スペース)区切りで、x座標 y座標 z座標 R強度 G強度 B強度、の順に並んでいるようです。

  end_header

 ヘッダの終わりを示しています。この後、頂点データが514個(行)出力されています。

  2 0 20 204 255 51
  3 0 20 204 255 51
  6 0 20 204 255 51
  7 0 20 204 255 51

    : 514行分

 同じPLYファイルのエクスポートでも、OBJファイルと同様に、ポリゴンデータをエクスポートする場合も確認できました。Xi-TRACEで取り込む場合は、「Projectパレット ⇒ Export ⇒ point」でエクスポートしてください。「Projectパレット ⇒ Export ⇒ ply」というのもありますが、こちらは、OBJファイルと同様、ポリゴンデータを出力してしまいます。

 と、Xi-TRACEでは、PLYファイルのサポートは無いので、どっちにしても読み込めないじゃん、と、なるわけですが、そんなに難しい形式ではないので、MODELAのプログラムで読み込んでしまいましょう。

  procedure load_mv_ply $$fply, $$pnam
  {
    // PLYファイル$(fply)からデータを読み込み、
    // 各ドットにプロシージャ$(pnam)を定義する。
    // 「procedure $(pnam) x,y,z, r {…}」であることが必要。

    :
    : (省略)
    :
  }

 コード自体は、そこそこのボリュームになるので省略します。後ほどリンクする完成版データでご確認ください。手続きload_mv_plyに、PLYファイル名と、1ドットを定義する手続き名を指定するだけで、取り込めるように作ってあります。

  attr load_mv_ply=
  {
    refl 0.20,4,0.3;
    diff 0.80,0.00;
  };
  load_mv_ply "sample.ply", cuboid;


 上の様に実行すると、PLYファイル"sample.ply"を読み込んで、ドットが立方体(cuboid)となるように、Xi-TRACEデータを作成します。cuboidの代わりにsphereを指定すると球面、手続きnano_blkを指定するとナノブロックでデータが生成されます。
 属性load_mv_plyは、ドットの色以外を指定するデフォルト属性です。お好みで、反射率や透過率など、共通の属性を定義しておくことができます。オプションではないので、何かしら、定義しておかないと、エラーになります。

作成したデータをレイトレーシングしてみた

 「チーズ好きのねずみ」で使ったねずみのモデリングを×23倍に引き伸ばして、細部を作り込んだデータです。

nezu_cubo.jpg

 MagicaVoxelでエクスポートしたデータをちゃんと読み込めて、レイトレーシングできました。
 ドットをナノブロックに置き換えると、こんな感じです(↓)。

nezu_nano.jpg

 ドットが細かくなった分、小さい画像だと、ナノブロックが良く見えませんね……。Xi-TRACEでもっと大きくレイトレーシングして、ご確認ください。「チーズ好きのねずみ」のモデリングデータと比べて、ドット数が×23倍近くに増加しているので、レイトレーシングには時間がかかります。

メタボールでモデリングしてみる

 ドットをメタボールで置換した結果、以下図の様になりました。

dot_pict_3d.jpg

 予想外に、メタボールとの親和性が高かったみたいです。制御が難しくて、中々使い所の難しいメタボールだったけど、これ、良いかも?


完成データ

 完成したデータをリンクしておきます。

1) Xi-TRACEデータ dot_pict_3d.xitr
2) サンプルPLYデータ dot_pict_3d.zip

 2)は、MagicaVoxelでエクスポートした、3Dドット絵のデータです。1)のデータから読み込んでいます。ZIP圧縮してありますので、解凍して1)と同じディレクトリに置いてください。
 Xi-TRACEでレイトレーシングする場合は、1)をXi-TRACEに実行させてください。



 ドットを細かくすると、ナノブロックみたいに作り込んだ形状では、細かすぎて視認できませんでした(ナノブロックとわかり難い)。ナノブロックにする時は、163ドットくらいの粗さがちょうど良いかも知れません。


home

download

gallery