作者宅の浴室を巻尺で採寸して、モデリングしてみます。
基本は、「作者宅の浴室」です。巻尺を片手に浴室とPCの往復しながら、1=1[cm]で採寸して行きました。デジカメも一緒に持って行って、キーとなる物体の写真も撮っておきました。採寸だけでは、「あれ、あそこの形状どっなってたっけ?」と、なった時に、また浴室まで走らないとならないので……。
浴室床面の中央に原点を置き、正面に見える鏡の付いた壁がy軸正方向、その位置から左右がx軸方向、天井がz軸正方向と決めてモデリングを進めます。浴室の形状、浴槽、ドア、鏡、シャワーヘッド、水栓、と、モデリングしてきて、手が止まりました。「シャワーのホース、どうしよう?」
水栓とか、かっちりした形は良いのですよ。
もちろん、デフォルメも含めて、ですが、二次曲面の形状に当てはめながらモデリングすることができます。しかし、ホースの様な、つかみどころのない、二次曲面にも当てはまらない形状はモデリングし難い。
思い当たったのは、「真珠のネックレス」でネックレスの形状指定に使用したテクニックでした。「真珠のネックレス」では、二次元グラフィックで描画した画像データをトレースしてネックレスの形状を定義しました。ホースの形状も、以下図の様なグラフィックの黒線をトレースして生成しようと考えました。
シャワーヘッドにつながる部分の座標sp=(-90, 40, 88)と、水栓につながる部分の座標tp=(-40, 48, 35)を押さえておき、上図灰色枠の下端が浴室の床面の高さ(z=0)とします。シャワーヘッドにつながる部分が一番高い(z座標が大きい)ので、その点が画像の上端とします。
画像の縦方向を、浴室の高さ方向(z軸)に割り当てているわけですね。先ほど示したtp、spのz座標については、画像の縦方向の位置に正確に反映する必要があります。上図の灰色の部分がx−y平面に対して垂直に立っていると想定し、シャワーヘッドと水栓につながる部分の座標が合う様に一次変換をかけることにします。
さて、ここまで決まったら、黒線部分をトレースして、座標を拾うスクリプトを作りましょう。「真珠のネックレス」で使ったスクリプトから抜き出してきて、ほぼ、そのまま使いました(完成したのがbathroom_hose_pos.xitrです、後ほどリンクしてあります)。
でも、「真珠のネックレス」では、真珠に見立てた球面を数珠つなぎに配置しただけですよね?今回はホースなのですが、「同じで大丈夫?」
大丈夫ですよ。今回は、隣り合う2つの座標点を拾ってきて、2点を円柱面でつなぎます。「ドラゴン曲線を描画する」で使用したような形状(下図)を使うのです。
完成したホースがこちら(↓)。
いや、こんなに派手ではないですよ……(1^^;)。1つ1つの円柱面がわかりやすいように、交互に色を変えてレイトレーシングした結果です。赤い部分と青い部分が、別々な円柱面になっているのですが、意外と、わかりませんよね?結構粗めに分割したつもりだったのですが、これ以上細かく分割する必要は無さそうです。
細かく分割した方が、滑らかになりますので、もし、カクカクが気になるようでしたら、座標を拾うスクリプト(bathroom_hose_pos.xitr)の中のRRという変数を調整してください。設定値を小さくすると、より細かく分割するようになります。ただ、RRを半径とした円周上で黒線を探索しているので、小さくし過ぎると、うまく探索できなくなってしまいます。その場合は、使用する画像の方を大きくしてください。分割の細かさは画像サイズとRR設定値の相対的な関係で決まりますので、「RR→小」と「画像→大」は、どちらも分割を細かくする方向に働きます。
浴室全体をモデリングしましたので、色々と確認したい場所(前も後ろも、右も左も、天井も床も、……)があるのですが、良い手があります。環境視野を使って、一気にレイトレーシングしてしまいましょう。
環境視野は、360度画像をレイトレーシングした時に何度か使っています(「バレリーナが回るオルゴール」「フラクタル正四面体」「YouTubeのCardboardで360度3D動画を鑑賞する」「YouTubeの360度動画を生成する」などの解説をご覧ください)。ステレオ立体視にも対応しておきましたので、後ほど御覧に入れる動画では、360度3D動画をお楽しみいただけます。
環境視野だと、ぐるっと360度が1枚の画像に収まる代わりに、画像が歪んでしまいます。「正距円筒図からのトリミング」で解説したように、Olive+の機能を使うと、360度画像から、任意の方向を通常の視野で眺めた時の画像を切り出すことができるようになります。
正面上の方に白い球体が2つ見えますが、これが光線源です。実際の浴室にも、この位置にランプがついています。
実は4方向の壁の色は全て同じ色に設定してあるのですが、正面の壁だけ、だいぶ暗く表示されてしまいます。「バグか?」とも思ったのですが、そうではなさそうです。光線源に対して角度が浅いため、あまり明るく照明されず、周りの壁に比べて暗くなっている模様。
天井も、浴槽と同じ色合いに設定しているのですが、同じ理由でだいぶ黒い……。実際の浴室はそんなことは無く、みんな明るく照明されています。とは言え、バグではなさそうなので、レイトレーシングの限界?特性?として、受け入れるしかないようです。
周りの壁も、天井も、結構明るいアイボリなので、実際の浴室では間接照明によって、まんべんなく明るく照らされているのだと思われます。
これでもまだいろいろと端折っていて、手すりとか、タオルかけ、棚、ドレイン、湯沸かしのコントローラ、など、作り込むべき物体は山ほどあるのですが、「一旦、完成」としておきます。ここまでですでに疲れました(1^^;)。浴室と言う狭い空間なのに、忠実に作り込もうとすると、大変なものですね……。
巻尺だけでなく、デジカメも持って浴室に行き、形状の把握に必要な写真に加えて、マッピングデータに使う素材写真も撮ってきました。例えば、床の写真がこちら。
これをそのままマッピングデータに使うのは、問題があります。それは、Olive+で読み込ませてから、「フィルタメニュー ⇒ 変形 ⇒ スクロール」で、画像の半分ほど、縦・横にスクロールさせてみると分かります。
普通に写真に撮った画像は、こんな風に、不連続な線(中央に十字)が見えてしまうのです。「撮った写真を、そのまま床面全体に1枚だけ貼り付ける」ケースであれば、気にする必要はありませんが、1枚の小さなマッピングデータを、連続して繰り返し貼り付ける場合は、この不連続線を消しておく必要があります。
ここから先は手作業なので、なかなか、解説のし様もありませんが、作者は、Olive+の簡易編集機能を使って、不連続な線がなくなる様に、全てのマッピングデータを加工しました。完成データは、後ほどリンクしておきますので、ご覧になってみてください。
完成したデータと動画です。
1) | Xi-TRACEデータ | bathroom.xitr |
2) | マッピングデータ | bathroom_floor.jpg |
bathroom_frosted.jpg | ||
bathroom_stone.jpg | ||
bathroom_wall.jpg | ||
3) | 座標データ | bathroom_hose_pos.txt |
4) | 座標計算スクリプト | bathroom_hose_pos.xitr |
5) | 座標計算用画像 | bathroom_hose_pos.xpic |
6) | 正距円筒図からのトリミング | equiview.olv |
1)〜3)でレイトレーシングを実行します。4)と5)は、3)の座標ファイルを生成するスクリプトです。座標ファイルをご自身で生成しない場合は不要です。
6)は、「正距円筒図からのトリミング」の時に、フラクタルキューブの環境視野レイトレーシング画像から切り出して、視野を変えながら動画を生成した時のスクリプトです。
VR動画ですので、ご自身で操作して、色々な方向を眺めてみないと、正面の映像が見えているだけ、になってしまいます。水栓、シャワーヘッド、ホースなど、気になる部分に注目してご覧になってみてください。
360度3DのVR動画になっていますので、スマホ+CardBoardでの視聴がお勧めです。
6)のスクリプトをそのまま実行(あらかじめ、6144×3072[ドット]でレイトレーシングした画像をOlive+で表示しておきます)して完成したのがこちらの動画です(↓)。
フラクタルキューブ用の切り出し設定のまま、なので、浴室のデータに適用すると、ちょっと不自然な場所に注目したりしてますが……(なんで、ドアの取っ手にそこまで近づくのやら??)。まんべんなくぐるりと周囲を眺められていたので、OKとしました(1^^;)。
Xi-TRACE R14のリリースに伴い、新設された環境光線源(envl命令)の設定を追加しました。データファイル(bathroom.xitr)、先頭付近の変数epowに0より大きい値を設定すると、環境光線源が設定されますので、R14以降のリリースバージョンで実行してください。
解説は「環境光線源を使ってみる」でご覧ください。