chr2ply.jpg


文字を3Dデータに変換する

 レイトレーシングデータ中に、何らかの文字列を配置したい場合、3D空間に配置したオブジェクトに文字をマッピングデータとして貼り付ける等の手段を使ってきました(例えば、以下図)。

thermometer.jpgcandy_pot.jpg

 上の例では、IHヒータの天板にプリントされた文字や、キャンディポットにマジックで書かれた文字など、違和感はありません。

 この応用で、3D空間中に文字を浮かせてクルクル回転したり移動させたりすることは可能なのですが、如何せん、マッピングは「シール」みたいなものなので厚みがありません。回転させて真横から見てしまうと、ただの一本の線にしか見えません。
 ちょっと、3Dデータとしては残念な感じです。

ドット絵の応用

 これまでに、2Dのアイコンをレイトレーシング空間に表示したことがありました(下図)。

dot_pict.jpg

 更に、MagicaVoxelを使って作成した3DデータをPLYファイルという形式で保存して、Xi-TRACEで読み込んでレイトレーシングしたことも(下図)。

magicavoxel.jpg

 これらの応用で、アイコン ⇒ 文字列と読み替え、グラフィック画面に描画した文字列データからドットデータを拾って3D座標データを生成、PLYファイルに書き出して3Dデータとして使用できるようにして見ようと思います。PLYファイルについてはこちらで解説済みです。Xi-TRACEを使ってPLYファイルから頂点データを読み込み、3Dドットデータに変換してレイトレーシングする方法についても記載してあります。
 MODELAでPLYファイルを読み出して3Dデータを定義したら、厚みのある3Dデータを回転させたり動かしたりすることが可能となります。

PLYファイルの生成

 では、今回のレイトレーシングデータの中から、文字列をPLYデータに変換する部分の手順をご紹介しておきましょう。まず、以下の様にしてグラフィック画面を初期化し、symbol命令で文字列を描画します。

  ginit 512,256,32;
  symbol 0,0,fwid - 1,fhei - 1, $(fnt),HH, cblack,$(str);


 マクロfntにフォント名を設定しておくと、指定したフォントを使って文字列を描画します。変数HHは文字列を描画する時の文字の高さをドット単位で指定するものです。横幅はフォントによって異なります。後は、描画する色(cblack)と、文字列をマクロstrに設定しておきます。

 文字列を描画したグラフィック画面の任意座標からピクセルを読み出し、前景/背景を判定します(以下)。

  getpix ix,iy, pc;
  pix2lum pc,lum;
  if (lum<TT)
  {
    // black
  }
  else
  {
    // white
  }


 PLYファイルは単なるテキストデータなので、拾った座標データを書き出したら完成です。

  // PLYファイル書き出し
  var fout;
  fopen fout,$(file)"_out.ply","w";
  // ヘッダ
  fprint fout,"ply"$,;
  fprint fout,"format ascii 1.0"$,;
  fprint fout,"comment : "$(file)"."$(ext)$,;
  fprint fout,"element vertex #"$,,cnt;
  fprint fout,"property float x"$,;
  fprint fout,"property float y"$,;
  fprint fout,"property float z"$,;
  fprint fout,"property uchar red"$,;
  fprint fout,"property uchar green"$,;
  fprint fout,"property uchar blue"$,;
  fprint fout,"end_header"$,;
  // データ
  ix=0;
  while (ix<cnt)
  {
    fprint fout,"# # # # # #"$,,
      ax#(ix),sq (1 - fp2)*ay#(ix),az#(ix), RR,GG,BB;
    // 継続
    ix=ix + 1;
  }
  // ファイルを閉じる
  fclose fout;


 レイトレーシングの素材として使いたい文字をPLYデータに変換して持っておくと、そのデータを使ってレイトレーシングすることが可能です。
 わざわざPLYファイルに変換して持っておかずとも、毎回レイトレーシングする度に、上の手順を使って文字列→3Dドットデータ変換を実施してもOKです。ただ、今回のプログラムを実行してみるとわかりますが、変換には少し時間がかかります。
 文字サイズを大きくしたり、長い文字列を変換しようとするとなおさらです。
 これを毎回実行するのは処理時間的に不利です。変換済みのPLYファイルを読み込んで処理した方が、少しは処理時間の節約になります。

 また、Windows 10マシンとWindows 8.1マシンを混在して分散レイトレーシングする時、各々のマシンでデフォルトフォントを使ってしまうと、完成した文字がブレてしまいます。どうやら、Windows 10のデフォルトフォントと、Windows 8.1のデフォルトフォントが微妙に異なっているのが原因みたいです(もしくは、描画ルーチンのバージョンによる違いかもしれない)。
 どちらかのマシンでPLYファイルを作っておき、同じPLYファイルを読み込んでレイトレーシングすれば、このような問題は生じません。


完成データ

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

Xi-TRACEデータ chr2ply.xitr

 Xi-TRACEで実行すると、データ先頭付近のマクロstrに設定した文字列を3Dドットデータに変換して、chr2ply_out.plyと言うファイルに書き出します。適切にリネームして使ってください。

 ちなみにデータ自体は、生成した3Dドットデータを使って3D化した文字列がアニメーションするように作ってあります。以下、その動画です。



 上の動画は、「目に見えない脅威が現実のものとなり、それに打ち勝って撲滅して行く様子」を表現したものです。今は兎に角、皆が予防・対策をしっかりと実施して被害を最小限に留め、事態が早く収束することを願います(執筆時2020/04/29)。


home

download

gallery