print_screen.jpg


立体に見える印刷物

 何のことかわかりますか?いや、書いてみて、自分でも意味が通じないです(1^^;)っ。
 えっと、まず、見ていただくのが早いですね。

print_screen.jpg

 昔ブームがあった立方体パズルをレイトレーシングした物です(「立方体パズル」でモデリングしました)。
 何だか、歪んでますよね。この画像を、そのまま、プリンタでプリントアウトします。そうしたら、印刷した紙をテーブルの上において、あらかじめ決められた位置から眺めてみると、アラ、不思議。

printed.jpg

 歪みの無い立方体パズルに見えるではないですか。
 伝わりましたでしょうか?今回のテーマは、「これ」です。

撮影場所の選定

 まず、撮影場所を確定しておきます。後で、印刷した紙を置いて、カメラで撮影するのにちょうど良い広さのテーブルを選びます。実際に、撮影に使うカメラを覗きながら、なるべく単調なテーブルなどの上で、テーブル面だけが映り込むようなアングルを探します。

 撮影場所は、外光が届かない場所を推奨します。太陽光含め、外光(自然光)が差し込むような場所では、時間帯によって光の指し方が変わるし、準備した時と、実際に印刷物を置いて本番撮影に臨む時とで、条件を合わせることが困難です。
 可能であれば、遮光カーテンなどで外光を遮断し、天井灯(蛍光灯)等、限られた人工光だけで照明される状態にすることが望ましいです。

 すべての作業が終わるまで、カメラを固定する必要があるので、小型の三脚などをご用意ください。

 撮影場所を決めたら、色々とやるべきことがあります。

 個々にポイントを解説して行きます。

写真の撮影

 カメラから見える映像を使って、そのまま、テーブルを模したレイトレーシングデータ中の平面にマッピングを施しますので、この時の写真を撮影します。カメラや三脚、撮影者自身の影などが写真に写り込まないように、アングルを調整してください。

table.jpg

 この通り、パースの付いた、カメラで撮影したままのマッピングデータを用意します。普通は、テーブルを真上から撮影した方が、マッピングデータとして使用しやすいのですが、今回は、「投影マッピング(mprj)」を使うので、上の様なデータの方が都合が良いのです。
 以下にテーブルを模した平面(plane命令)に対して、投影マッピング(mprj)を施す様子を示します。

  load $(file)"_table.jpg";
  cmap table, 0,0,fwid - 1,fhei - 1, fwid,fhei;
  attr table=
  {
    diff 1.00,0.00;
    colpix cgreen;
    nmap table;
    //view WW, 0,0,1, 0,0,0, 0,DD,HH, 4;
    mprj 0,0,0, 0,DD,HH, 0,0,1, 2*WW,2*WW/fwid*fhei;
    mreg 0,0, 0,0, -0.5,-0.5;
  };
  plane 0,0,-3*R, 0,0,1;  // テーブルを模した平面


 参考までに、レイトレーシングの視野面を設定するview命令の記述もコメントで参照しておきました。Xi-TRACEのマニュアルで見比べていただくとわかりますが、視野面(view命令)の設定と、投影マッピング(mprj)の設定を同じにしてあります(ただし、パラメータの順番などが異なっていることに注意)。これで、カメラから見たままの映像を平面(plane命令)に投影するように、マッピングすることができました。

撮影位置の固定(マーク)

 すべてが終わるまで、前節で撮影した時の、カメラの位置、アングル、照明の当て方、等を保存する必要があるので、必要な場所にマークを打っておきます。マークは、例えば、セロハンテープをテーブルに貼り付けて、油性ペンで点や矢印などを記入します。……テーブルに直接書き込むわけには行かないので。
 マークする位置は、カメラを固定する三脚の足の位置や、カメラの画角を再現するために必要な点、等です。後者については、すぐに次の節で説明します。

映像空間と光線源の測定

 カメラの画像を見ながら、以下図のようなところにマークします。

photo.png

 カメラの映像を見ながら、テーブルの上に何か目印になる小さな物体を置いて動かしながら、上図の赤と青の●の位置をテーブル上で特定し、マークします。
 最低限、2つの●位置を特定出来たら終了ですが、青破線とカメラのフレームが交差する他の3点の位置も、テーブル上で特定しておくと、うっかりカメラのアングルを変えてしまった時などに、元の状態を回復する手助けになります。

 この時の状態を、今度は真上から見てみます。

meas1.png

 さっき、テーブル上にマークした赤と青の●印に対して、図中の「幅WW」と「距離DD」を定規などで測定して、メモします。
 更に、今度は真横から見ます。

meas2.png

 残る、カメラレンズまでの「高さHH」も計測します。

 これらの計測値より、レイトレーシング空間に、テーブルとカメラの情報(位置関係)を取り込み、再現します。
 赤●で示した点をレイトレーシング空間の原点(0,0,0)、赤●と青●を接続する線分の延長方向をx軸、距離DD方向をy軸、高さHH方向をz軸としますので、この座標軸に従って、天井灯(蛍光灯など)の位置も計測しておいてください。光線源が複数あると、うまく馴染ませることが困難になるので、光線源は1つに絞った方が無難です。
 以下の様にして、計測したデータをレイトレーシング空間に再現します。

  var WW=125;  // 画角幅[mm]
  var HH=130;  // カメラ高さ[mm]
  var DD=170;  // 距離[mm]
  var LX=600;  // 光線源の位置[mm]
  var LY=-300;
  var LZ=1900;

  loc LX,LY,LZ, 200, 0.60,0.60,0.60;  // 天井灯を模した局所光線源
  view WW, 0,0,1, 0,0,0, 0,DD,HH, 4;  // カメラのアングル


 loc命令で天井灯などの光線源、view命令でカメラのアングル等をエミュレートしています。

印刷サイズの測定

 もう少し準備作業が続きます。
 まず、最終的に印刷する紙の大きさを決めます。ここでは、印刷する紙の縦と横の長さの比だけを決定すればOKです。最終的には、Windowsの印刷機能を使って、用紙サイズに合わせて画像を印刷するので、用紙サイズとピッタリ同じ大きさにする必要はありません。
 作者は、1,600×1,920[ドット]の少し縦長で、A4用紙に印刷しようと考えました。

 では、決定した画像サイズで以下図の様な図形を描画した画像データを用意します。

frame.png

 上図は、正方形で作っておきましたので、これを所望のサイズに拡大・縮小して作成すればOKです。
 作成した画像をWindowsで選択して、「右クリック ⇒ 印刷」を選択します。

prnset.png

 用紙サイズなども、ここで選択します。最後の本番データも、同様に印刷しますので、その時の印刷と同じパラメータを設定してください。
 印刷できたら、印刷物の横幅(1,600×1,900[ドット]なら、1,600ドットの方に相当する図形のサイズ)を定規などで測定します。

  var PS=202/2;  // 印刷横幅[mm]

 A4普通紙にプリントしたところ、図形の横幅が202mmでしたので、上の様にして、レイトレーシングのデータに取り込みました。

印刷投影面の設定

 さて、実は、公開されているXi-TRACEの機能では、今回みたいなレイトレーシングは、実行できないのです。
 今回は、Xi-TRACE R13から実装されていた非公開機能のprojto命令を使って、印刷投影面と言う物を設定し、紙に印刷するためのレイトレーシングデータを生成します。

  projto <pref_x>,<pref_y>,<pref_z>, <pnn_x>,<pnn_y>,<pnn_z>,
        <ptop_x>,<ptop_y>,<ptop_z>, <pwid/2> [, <option>] ;

 view命令を使って、通常の投影視野面を決定します(以下図、紺色文字のパラメータ)。ここまでは、通常のレイトレーシングと同じ、何も変わり無し。

xman_projto.png

 その投影面内に印刷用紙を設定し、投影面に写る映像を印刷面に再投影するのが、projto命令の役割です。
 印刷投影面(projto命令)で指定すべきパラメータは緑色文字にしてあります。screen命令で指定する、レイトレーシング画像サイズに連動しているので、有効なscreen命令の後で、projto命令を実行してください。

位置決め

 まずは、印刷投影面の位置を決めます。projto命令の<option>に、"visible"をつけてレイトレーシングすると、projto命令で設定した印刷用紙が実際に目で見て確かめられるようになります。

  attr gray=
  {
    diff 1.00,0.00;
    colpix cgray;
  };
  projto 0*R,-6*R,-3*R + 0.1, 0,0,1, 0,-1,0, PS, visible;


visible.jpg

 計算すると、丁度良いサイズを求めることができるかもしれませんが、色々考えるより、試行錯誤で適当にパラメータをいじって合わせ込んだ方が、きっと早いです。上図の様に、対象物体がすっぽりとグレイの印刷用紙内に入り切るように、prjto命令のパラメータを調整してください。グレイの用紙範囲に入った部分だけがレイトレーシングされますので、物体が印刷用紙の四辺のどこかと交差してはみ出すようでは、印刷した時にその部分が紙の外へはみ出してしまいます。
 図中、黄色い○と⇔で示したように、対象物体が、このアングルの見た目で、印刷用紙の外にはみ出さないようにします。

 パラメータの調整が終わったら、"visible"をコメントして、いよいよ、本番レイトレーシングです。

  projto 0*R,-6*R,-3*R + 0.1, 0,0,1, 0,-1,0, PS;  //, visible;

 以下の様にしても同じです。

  projto 0*R,-6*R,-3*R + 0.1, 0,0,1, 0,-1,0, PS, visible=0;

プリンタで印刷

 レイトレーシングした画像は、普通は歪んで見えているはずです。この画像ファイルを選択、「右クリック ⇒ 印刷」として、プリンタで印刷します。「印刷サイズの測定」の時と同じパラメータで印刷してください。

 印刷した紙をテーブルの上に置き、カメラを覗いて、歪みの無い立体に見えるかどうか確認しましょう。ここまでの手順を誤りなく実行できていれば、きっと、想定通りに見えたはずです。
 問題なければ、カッタやハサミなどを使って、立体だけを切り出します。

 この時点で気が付いたのだけど、意外と、「影」の部分の扱いが難しいですね。できれば、影が見えないようなアングルでレイトレーシングできると良いのだけど……。今回は、影の部分も含めて、何とか合わせ込んでみました。

写真用紙に印刷する

 もう一回、ご覧に入れる(下図)と、さすがに、A4普通紙への印刷では、色も褪せてしまうし、人間の目をごまかすのは難しそうですね……。

printed.jpg

 そこで、写真用の専用紙に印刷してみました(下図)。

xman_projto3.jpg

 A4の写真用専用紙が有ったら良かったのだけど、手持ちがありませんでした。そのため、「L判」と呼ばれているサイズの専用紙に印刷しました。サイズはずいぶんと小さくなってしまいましたが、A4普通紙に比べると、色合いなど、相当良い感じ。
 ここまで精密にサイズを取りながら作業してきたのに、用紙サイズが小さくなってしまったことで、今までの苦労は何だったの?って、感じですが、まあ、この程度の変更は何とかごまかせるでしょう(1^^;)。

完成した印刷物の評価

 写真用専用紙にプリントした立方体パズルを切り抜いて、実物のコインと並べてみました。

xman_projto4.jpg

 静止画でこのサイズだと、良い感じですね。中央の立方体パズルは、紙の印刷物なんですよ!

※写真をよく見ると、テーブルの上にセロハンテープを貼って、油性ペンでマークしてあるのが見えます。


完成データ

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

Xi-TRACEデータ print_screen.xitr
マッピングデータ print_screen_table.jpg (各自ご用意ください)

 本文中で参照したような小さな写真では、そこそこ本物らしく見えているのですが、ちょっと画質を上げて、動画にしてしまうと、さすがに違和感が……。ただ、スマホとかの小さな画面や、限られた通信速度による、劣化した画質でご覧になっている場合は、本物っぽく見えると思われます。
 皆様の目でご確認ください。



※スマホで動画を撮影したのですが、途中でオートフォーカスが入って邪魔くさいですね……。

 レイトレーシングする時は、Xi-TRACE R13以上が必要です。ダウンロードコーナから最新版をダウンロードしてお使いください。


home

download

gallery