くすぐり漫画を3D仮想劇場で読む

 昨年3月、くすぐり漫画を3Dスマフォで読むで、ミニメロン作の立体視対応くすぐりコミックをNTT docomoのSH-01Dで読むための方法を紹介しましたが、それから約半月後に、ソニーの3D対応仮想映画館でありますHMZ-T1が届きました。
 いわゆるヘッドマウントディスプレイという、頭に装着する表示装置でありますこの製品、発売当初から極端な品薄状態となっていたらしく、注文したのが2012年1月中旬、届いたのが4月の初めなので、納期としては3ヶ月近くもかかった事になります。
 ネット情報によれば、2011年の9月頃の注文が2012年4月になっても届かないケースもあったようなので、納期3ヶ月は短い方だったと思います。
 もともとBDレコーダーに繋いで3Dテレビの代わりに使おうと思って購入したのですが、現在3Dテレビ用のコンテンツがどのような状況にあるかと言えば、地上波では3D番組など放送されず、CSでも3D専門局が放送を終了してしまいました。3Dブルーレイも2Dのそれに比べて数が大幅に限られているのが実情で、特にくすぐりビデオなどがブルーレイ3Dで提供されるには至っておらず、当サイトにとって非常に残念な状況となっています。
 しかしながら、HMZは「3D対応」以外に「仮想大画面」という大きな特徴を持っており、例えば映画館に行かなくても狭い自室に居ながらにして映画を大画面で見る事ができたり、くすぐりビデオやおもらしビデオを映画館並みの大画面で見る事ができたりといった、従来とは異なる映像体験を提供してくれます。
 そのような事もあってか、HMZシリーズは順調に進化を続けており、現在T3及びT3Wが販売されています。
 また、最近ではHMZ以外にも様々なヘッドマウントディスプレイが発表されており、それらが今後どのような新しい映像体験をもたらしてくれるのか、非常に興味深い所であります。

 さて、購入からだいぶ経ってしまったHMZ-T1、今までBDレコーダー等に接続して使っていたのですが、ディスプレイなので当然PCに接続してもよいはずで、最近私の所でもようやくそれが可能になりました。
 HMZを装着した状態でキーボードを操作し、ネット動画などを検索するというのは、攻殻機動隊のイシカワさんとかになったような、なかなかサイバーな気分です。
 それはそれで良いのですが、このような環境になったからには、当サイトとしてぜひとも検討しなければならない事があります。
 それは、ミニメロン作の立体視対応くすぐりコミックをHMZで読む事です。
 その方法として誰もが思いつくのが、「普通にブラウザで表示させて、平行方法や交差方で読む」という事ですが、それではHMZを使う意味がありません。
 また、HMZの仮想大画面では、通常のPC用ディスプレイに比べ、ステレオペア画像の平行方での鑑賞が著しく困難です。
 スマホやデジ額の時のように、SPMなどで画像を加工すればHMZの左右分割方式3D表示機能で鑑賞できるようになりそうですが、今回は別な方法を試してみる事にしました。
 それは、DirectXを使って専用ビューワを作るという事です。
 普通に考えられる中で最も難しいと思われる方法ですが、実は現在私の手元にはHMZ以外にもう一つ、全く異なる設計思想で作られたヘッドマウントディスプレイがあり、それに関して同様の検討をする準備も兼ねて、あえてこのような難易度の高い方法を取りました。

 DirectXを使って何かを作るためには開発ツールを入手する必要があります。
 マイクロソフトの開発ツールは昔は有償だったのですが、幸い現在は無料でダウンロードする事ができます(ユーザー登録が必要なので、多少面倒ではありますが)。
 また、http://code.msdn.microsoft.com/Direct3D-Tutorial-Win32-829979ef からDirectX11のチュートリアル用サンプルプログラムをダウンロードする事ができるので、それを参考にしながら、板ポリにミニメロン作立体視コミックの画像を張って並べる画像ビューワを作ってみました。
 今回作成したビューワは、皆さんにも以下の手順で動かすことができると思いますので、HMZとDirectX11対応のPCをお持ちの方は試してみて頂きたいと思います。
 また、私は確認できないのですが、HMZ以外に3Dテレビでも使えるはずなので、お持ちの方は試してみられるのもよろしいかと思います。

1、http://www.microsoft.com/ja-jp/dev/express/からVisual Studio Express 2012 for Windows Desktop をダウンロードする(要ユーザー登録)。
2、Visual Studio Express 2012 for Windows Desktop を起動する。
3、新しいプロジェクトの作成(ファイルメニュー→新しいプロジェクト→「Win32プロジェクト」を選択し、下の方のボックスに名前と場所を入力→OKボタン→次へボタン→追加のオプションの「空のプロジェクト」をチェック→完了ボタン)
4、ここからビューワ本体を含むZIPファイルをダウンロードし、解凍してできたDX11test1.cpp及びtest.fxというファイルをプロジェクトフォルダ(プロジェクト作成時に指定したフォルダの下にある、プロジェクト名と同じ名前のフォルダ)に置く。
5、DirectX Tool Kit を http://directxtk.codeplex.com/ からダウンロードし、解凍してできたファイルのうちpch.hとPlatformHelpers.hとWICTextureLoader.cppとWICTextureLoader.hをプロジェクトフォルダに置く。
6、DX11test1.cppとpch.hとPlatformHelpers.hとWICTextureLoader.cppとWICTextureLoader.hをプロジェクトに追加する(プロジェクトメニュー→既存項目の追加)。
7、実行(デバッグメニュー→デバッグなしで実行)。
8、フォルダ選択ダイアログが表示されるので、表示するフォルダ(ミニメロンの立体視コミック(体験版でも可)に含まれる、pagesという名前のフォルダ)を選択する。(OKを押す前に9を行う)
9、画面解像度を1920×1080に変更する(デスクトップを右クリック→画面の解像度)。
10、フォルダ選択ダイアルグボックスのOKをクリック
11、HMZを左右分割方式3D表示モードにする。

 以上の手順により、目の前の空間に作品画像の貼られた板が並びます。
 HMZ自体の解像度は1280×720ですが、上記の手順のとおり、画像が表示されている時だけは画面の解像度を1920×1080に変更した方が、フキダシの文字がはっきりと見えます。
 右矢印キーでページ送り、左矢印キーでページ戻し、スペースキーでフキダシ有無の切り替え、Qキー又はESCキーで終了です。
 なお、動作確認はNVIDIAのグラボを搭載したWindows8PCでしか行っておりませんので、それ以外の環境ではもしかしたらうまく動かないかもしれません。

 DirectXに関しては、既にいくつかのサイトで解説等がされておりますので、今回プログラムの中身の詳しい説明はしませんが、これからDirectXで何か作ろうと思っている方への参考の為、以下にチュートリアルと異なる点や、作成中悩んだ事とか考えた事などをまとめてみたいと思います。

・全画面表示
 DirectX11のチュートリアルのサンプルは小さなウィンドウに画像を表示する物ですが、今回作成のビューワでは全画面での表示が必要です。その為、AdjustWindowRect関数及びCreateWindow関数に渡す引数として設定してあったWS_OVERLAPPEDWINDOWを、2箇所ともWS_POPUPに変更しました。
 また、画面の縦横のドット数を取得するのにGetSystemMetricsを使用し、それによって得られた数値をもとにウィンドウを生成しています。
 本当の全画面モードというわけではないようですが、一応これで全画面に表示できるようになったので、今回はこれで良しとする事にしました。

・フォルダ選択ダイアログ
 WindowsのAPIにSHBrowseForFolderという関数があり、これを使ってユーザにフォルダを選択させる事ができるのですが、使用方法があまり単純ではないようです。
 http://dss.o.oo7.jp/cgi/PT.cgi?VCPP/API/SHBrowseForFolder に使用例があったので参考にさせて頂きました。

・ステレオ立体視表示の実現
 NVIDIAのグラボであれば、NVIDIA 3D VISIONという機能を使って立体視表示ができるらしいのですが、赤外線エミッタが別途必要らしいのと、NVIDIA以外では使えないと思われるので、今回はサイドバイサイド表示を採用しました。
 その為、右目用・左目用の画像を描画する前に、描画先のエリアをRSSetViewportsにより指定しています。
 その際描画先の幅は画面解像度の半分としていますが、射影変換行列生成関数XMMatrixPerspectiveFovLHに渡す第2引数(アスペクト比)を通常どおり全画面の縦横ドット数に基づいて算出する事で、横方向二分の一圧縮表示を実現しています。
 また、板ポリに貼り付けるテクスチャ画像を指定する際、右目用・左目用の画像をそれぞれ指定する事により、右目と左目に異なるテクスチャを見せています。

・PNG画像の読み込み
 チュートリアルでは、テクスチャとして使用する画像の形式はDDS形式です。
 しかし、今回板ポリに貼るテクスチャとして使用したい画像はPNG形式です。
 ネット検索した所、PNGファイルをDirectXで使う方法としてD3DX11CreateShaderResourceViewFromFileを使う方法が見つかったのですが、Windows8ではその方法は使えなくなったようです。
 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476283(v=vs.85).aspx では代替案として、DirectXTK又はDirectXTexというライブラリを使う方法が紹介されています。
 今回はDirectXTKを使用しました。
 DirectXTKを実際にダウンロードしてみて分かったのですが、チュートリアルで使われているCreateDDSTextureFromFile関数も実はこのライブラリで提供されている物のようです。
 PNGファイルはCreateWICTextureFromFile関数により、テクスチャとして読み込む事ができます。

・板ポリの表示
 チュートリアルでは、描画単位であるポリゴンは全て三角形です。
 しかし今回のビューワで表示するのは長方形です。
 ネットで調べてみると、DirectX11で4角形や5角形を直接描く事も可能らしいのですが、今回はあえて3角形ポリゴンを2つ組み合わせる事で、1枚の長方形板ポリを表示しています。
 DirectXではポリゴンの頂点の並び順により面の向きが判定され、自分の方を向いている時だけ表示されます。
 自分の方を向いていなくても表示させるように設定する事も可能らしいのですが、今回はあえて通常設定としています。
 今回はインデックスバッファを使用するので、インデックスで指定される頂点が自分から見て時計回りになるようにインデックスバッファの内容を設定します。

・板ポリを並べて表示
 今回、作品画像を貼った板ポリは、円周状に並べて表示し、ページ送り・戻し時に配置位置を回転させるようにしています。
 円周上の位置を求める為には本来なら三角関数を使う必要があるのですが、チュートリアルでは立方体を回転させたりする例でも三角関を使った式はソース上に存在せず、その代わりにXMMatrixRotationY等の回転行列生成関数を使用しているので、本ビューワでの板ポリの位置決めについてもそれに倣いました。
 これにより、三角関数の公式を思い出さなくても何とか理解できるようなソースにはなっているかと思います。

・What is the Matrix?
 今回使用したHMZという製品は、ヘッドマウントディスプレイと呼ばれる種類の物です。
 HMZは映像を見る為の製品ですが、もともとヘッドマウントディスプレイは仮想現実を実現する為の最重要デバイスとして研究されていた物でした。
 仮想現実と言えば、今から10年ほど前、仮想現実の世界を舞台とした映画の三部作が大ヒットしました。
 その映画の登場人物は、仮想現実世界の事をマトリックスと呼び、映画のタイトルもまた「マトリックス」となっていました。
 それでは、この意味不明な横文字のタイトルを、あえて日本語に訳すとしたら、どのような語がふさわしいのでしょうか。
 ネット検索をしてみると、実は英語のMatrixという単語はラテン語の「母」を意味するmaterから派生した語で「子宮」の意味がある他、「ミトコンドリアの内膜の内側」といった意味もあるようです。
 映画では裸の人間が培養液に浸されているシーンがあったり、それが人間を機械のエネルギー源とするためであると説明されていた為、上記二つの意味のどちらか、あるいは両方が、この映画のタイトルの由来であるというのが、世の中では有力な説のようです。
 しかし、それらの説は本当に正しいのでしょうか。
 実は、映画「マトリックス」に影響を与えたとされる小説「ニューロマンサー」でもコンピュータによる仮想現実世界の事をマトリックスと呼んでおり、その理由は培養液に浸された人間とか、人体をエネルギー源にして動く機械とは無関係のはずなのです。
 映画「マトリックス」で主人公が「マトリックスとは何か」を知るために取った方法は、モーフィアスから渡された赤いカプセルを飲む事でした。
 私たちの手元にモーフィアスの赤いカプセルがあるわけではありませんが、マトリックスが仮想現実の事であるならば、それを実際に作ってみれば、なぜマトリックスと呼ぶのか、そしてマトリックスの正体が何なのかも分かるはずです。
 そして今回、DirectXという3DCGライブラリを使って仮想現実というよりも単なる画像ビューワを作成しようとしただけで、既にソースの中にはこのMatrixなる語が20個ほど存在していますし、参考にしたチュートリアルにももちろん存在します。
 実はこのMatrixは、私たちが高等学校の数学で習った「行列」という物なのです(2012年度より高校の学習指導要領から削除されているらしいので、これから高校生になる方は習わないと思います)。
 今までに高校を卒業された方は、2次の正方行列を使って座標平面上での回転拡大縮小等の変換操作(一次変換)が実現できる事を教わったかと思います。
 3DCGでは変換対象の座標が3次元であり、更に一次変換ではない平行移動をも同時に実現するため、4次の正方行列を使います。
 コンピュータの中に作られた仮想の3次元空間を人間の目に見える形に変換する為に、行列は昔から使われており、そのような意味で仮想現実世界と行列との間には密接な関係があると言えます。
 また、3DCGで使う代表的な座標変換には名前が付けられており、その一つにワールド変換があります。
 もちろん、それに使う行列は「ワールド変換行列」とか、あるいは「変換」を省略して「ワールド行列」と呼ばれたりします。
 この言葉をいきなり聞かされれば「(コンピュータの中では)行列は世界を変換するのか?」とか「(コンピュータの中の)世界は行列なのか?」などと思ってしまうわけで、この事もまた一部のSF作家に仮想現実世界をマトリックスと呼ばせる一因ではないかと私は思うのです。
 映画「マトリックス」では、プラグを外された一握りの人間のみが、マトリックスの存在を知っていました。
 現在世の中ではゲームにもネット動画にも3DCGが多く使われていますが、その舞台裏にMatrixが存在する事を知る人間は、映画「マトリックス」と同様に、ほんの一握りなのかもしれません。


戻る