0.ファイルのダウンロード
こちらです。
https://miku-challenge.up.seesaa.net/image/camera_shift.zip
↑最新版(version 1.10)
https://miku-challenge.up.seesaa.net/image/camera_shift100.zip
↑初期版
1.これは何をするツールか?
MMDの動画データにあるカメラワークを変換して、立体視用のカメラワークモーションデータを作成するツールです。
基本的に、あらゆるMMDファイルを立体視変換可能です。Excelマクロで組まれているので、Excel2000以降が必要です。OpenOfficeその他の互換アプリケーションで動作するかは未確認です。
このツールを活用することで、例えばこんな動画が比較的簡単に作成できます。
2.そもそも立体視とは何か?
という疑問を持つ人はそもそもこのページにこないんじゃないかと思いますが、立体視というのは左目と右目に異なる画像を提示することによって、平面図から擬似的に立体感を作り出す画像処理のことをいいます。
もともと、私たちが日常、左目で見ている風景と右目で見ている風景は目の位置が違うことによってわずかに異なります。その違い(両眼視差)は、私たちが外界の奥行き(立体感)を知覚する際の重要な手がかりとなっていると考えられます。「立体視」では、この両眼視差をもった2つの画像を左目・右目それぞれに別々に提示することによって、立体感を感じさせる仕掛けになっているわけです。
立体視画像で、左目・右目に異なる画像を提示する方法として、次のような方法があります。
(1)アナグリフ
特定の異なる色で左目用・右目用の画像を同じ平面上に描画し、左右で異なる色のついたメガネを通して画像を見る方法。いわゆる赤青の3Dメガネを使って赤と青の重なった画像を見る、古典的な方法。3Dメガネが必要なことと、フルカラー画像が作れないという難点があるが、特別な訓練なく立体視ができる。
(2)裸眼立体視(平行法・立体法)
左目用・右目用の画像を左右に並べて、それを左目・右目で別々に見る方法。左側に左目用、右側に右目用の画像をレイアウトして、画像を見るときの視線が画面に対して平行になる「平行法」と、左側に右目用、右側に左目用の画像をレイアウトして、画像を見るときの視線が交差する「交差法」がある。
フルカラー画像が作れ、特別な道具が必要ないというメリットがあるが、ある程度訓練しないと立体視ができない。
(3)その他の方法
より特殊な道具を使う方法として、左目用・右目用の画像を交互に表示し、それと同期させて左目と右目それぞれに交互にシャッターが下りるという「シャッター式」のメガネを通して見る方法や、左から見た場合と右から見た場合とで異なる画像が表示できる特殊なディスプレイ機器を使う方法などもありますが、省略します。要は、「左目と右目に、同時に異なった画像を提示する」ことが、立体視のキモということです。
3.このツールだけですぐに立体視動画ができるのか?
いいえ。このツールは、MMDのカメラ用のモーションデータをCSV方式で変換するだけです。
このツール以外に、MMDのモーションデータとCSV形式との相互変換を行なう、「VMD Converter」が必要です。また、変換後のカメラ用モーションデータをMMDに戻して(インポートして)、動画を作成(左目用・右目用の2つ)したうえで、左目用・右目用の2つの動画から、1つの立体視用動画を生成するアプリケーション(例えば、「むっちゃんのステレオワールド」さん配布の「ステレオムービーメーカー」)を使って立体視動画を作ることになります。
<立体視動画作成・実際の流れ(例)>
MMDでオリジナル動画作成 → カメラワークをVMD形式でエクスポート → VMD ConverterでCSV形式に変換 → このツールで立体視カメラワークを作成 → VMD ConverterでVMD形式に変換 → MMDに「左目用カメラワーク」をインポート → MMDで左目用動画を作成 → MMDに「右目用カメラワーク」をインポート → MMDで右目用動画を作成 → ステレオムービーメーカーで2つの動画を合成して立体視動画を作成
4.具体的な作業の手順は?
以下、MMDのver4.0をベースに説明します。
(1)まず、立体視させたいMMDの動画を、完全な状態で開いてください。
(2)「モデル操作」パネルのドロップダウンボックスで「カメラ・証明・アクセサリ」を選択し、フレーム操作パネルに「カメラ」を表示させます。
(3)フレーム操作パネルのノードが選択されていない状態で、メニューから「フレーム編集→カメラフレームすべて選択」を選び、カメラフレームのみ全選択の状態にします。
(4)メニューから「ファイル→モーションデータ保存」を選び、カメラフレームをVMD形式で保存します。
(5)出力されたVMDファイルを「VMD Converter」のアイコンにドラッグ&ドロップし、同名のCVSファイルに変換します。
(6)Excel2000以降で、本ツール「shift_camera.xls」を開きます。開く際にマクロの有効・無効のダイアログが出た場合は「有効にする」を選択します。
(7)(5)で作成したCVSファイルを、(6)で起動したExcelで開きます。
(8)Excelのメニューから、「ツール→マクロ→マクロ」を選択し、マクロ一覧を表示します。
(9)「Camera_Shift」というマクロを選択し、実行します。実行時に「Binocular Paralax」という値が設定できますが、これは「両眼視差」のことです。適切な設定値については後述します。
(10)(5)のCVSファイルと同じ位置に、(5)のCVSファイル名に「_l」「_r」がついた2つのCVSファイルが作成されます。それぞれ「左目用」「右目用」です。
(11)(10)の2つのCVSファイルをそれぞれVMD Converterにドラッグ&ドロップし、VMDファイルに変換します。
(12)MMDに戻ります。フレーム選択パネルのフレーム位置が「0(ゼロ)」になっていることと、「モデル操作」パネルのドロップダウンボックスで「カメラ・証明・アクセサリ」が選択されていることを確認してください。
(13)メニューから「ファイル→モーションデータ読込」を選び、(11)で作成した2つのVMDファイルのうち、「_l」がついているほうを読みこみます。
(14)動画を作成してください。これが左目用の動画になります。
(15)同様に、「_r」がついているほうのモーションデータを、フレーム0の位置で読みこみ、動画を作成します。これが右目用の動画になります。
(16)生成された2つの動画を、「ステレオムービーメーカー」等を使用して合成します。(詳細は使用するアプリケーション側で確認してください)
※注意:左目用・右目用のカメラワークを読み込んだ状態でMMDファイルを保存すると、本来の位置から視点がズレてしまいます。誤ってこのような状態で保存してしまった場合、上記(4)で作成したオリジナルのVMDファイルを読み込んで、カメラワークを元に戻してください。
5.視差はどのくらいの値が適切?
複数のキャラクターを同時に映しているような、引いたカメラワークが中心の場合は、デフォルトの1.0~1.2くらいが適切です。一方、キャラクターが1人の場合など、寄ったカメラワークが中心の場合は、0.7~0.9あたりで調整してみてください。視差が小さすぎると立体感に乏しくなり、大きすぎると目がついていけず立体的に見えなくなります。
6.技術的なことについて
このマクロが行なっていることは、MMDのワールド座標系で、(x, y, z) = (±両眼視差/2, 0, 0) という「視差ベクトル」を、カメラワークノードごとに設定された「カメラの回転」と同じ方向に回転させて、そのカメラワークノードに設定された「カメラ位置座標」に加算しているだけです。ノード間の補完等については一切いじっていません。また、回転に使っている計算式は以下のとおりです。
y軸のシフト量 = -sinz * cosx * (±両眼視差/2)
z軸のシフト量 = siny * cosx * (±両眼視差/2)
x軸のシフト量 = ( cosy * cosz + sinx * siny * sinz) * (±両眼視差/2)
y軸のシフト量 = (-sinz * cosx) * (±両眼視差/2)
z軸のシフト量 = ( siny * cosz - sinx * cosy * sinz) * (±両眼視差/2)
(ここで、式の右側にあるx,y,zはMMD座標系におけるx,y,zそれぞれの「回転パラメータ」を指します。)
※randolfさんのアドバイスを参考に、計算式を修正しました。
7.その他
アナグリフにせよ裸眼立体視にせよ、立体視動画は想像以上にビットレートを食いまくるので、600~1000kbpsの枠内に収めるのは相当苦労します。
既知の問題として、ノード間補間がないため、中間ノードなくカメラを90度以上回転させるようなシーンではうまく変換ができません。
そういった恐れのあるシーンを検出するために、変換時に生成されるExcelファイルの一番右の「元ファイル名_Calc」というシートの2列め「Caution」の列を見てください。ここに数字が表示されている場合は、当該ノードと直前のノードとの間の回転量が大きいことを示しています。数字が大きいほど回転量が大きいことになります。
このような場合、元のMMDのカメラワークを編集して、大回転モーションの途中にいくつかダミーのノードを打って回転を「刻む」と変換がうまくいきます。
8.関連グッズ
↑3Dメガネを自作できるセロファン紙と、3Dメガネのついた本
http://www.jc.u-aizu.ac.jp/10/opc03_cgs.html
↑3Dメガネの作りかた(型紙あり)
x軸のシフト量 = cosy * cosz * (±両眼視差/2)
y軸のシフト量 = -sinz * cosx * (±両眼視差/2)
z軸のシフト量 = siny * cosx * (±両眼視差/2)
ですが、視差の前の部分を2乗して加えたものが定常的に1になるようにしないといけませんよね。
例えば、
x -> cos y*cos z
y -> cos y*sin z
z -> -sin y
とか
x -> cos y*cos z
y -> cos x*cos y*sin z+sin x*sin y
z -> sin x*cos y*sin z-cos x*sin y
とか(あとの奴は正しいか不安ですが)
で、それがいろいろあるのは、X軸、Y軸、Z軸の回転をどの順番でするかによるからです。
前者はX->Y->Z、後者はY->Z->X軸の順(のはず)です。
回転の順番が判らないので、サンプルのデータでテストするしかないと思います。
MMDでは、Z->X->Yのような気がするのですが、どうでしょう。
だとすると、
x -> cos y*cos z+sin x*sin y*sin z
y -> cos x*sin z
z -> -sin y*cos z+sin x*cos y*sin z
さっそくの情報提供ありがとうございます。
2つめのコメントでいただいた数式ですが、MMDってZ軸の回転がデフォルトの視点からみて時計回りがプラスのはずなので、2つめのyの式にマイナスが、3つめのzの式にプラスがつかないでしょうか?
それであれば、後半の比較的値が小さくなりそうな部分だけが違うということで「だいたい合っている」という現状ともつじつまがあうので、「正解」になるのかな、という気がするのですが・・・。
つぎの様に決めていると思います。
Z軸周りの回転
→X軸、Y軸を含む面に沿った回転
→X軸からY軸に向かって回転するのをプラス
回転行列はWebで適当に探したので、角度の取り方や回転のさせ方によっては、sinの前の符号が逆転すると思います。
で、ここいらの内容はMMDのソースか技術資料をみるか、作者に聞かないと判らないと思うんです。
ということで、「正解」に近いようなら、たんちゃん氏の考えでよいのではないでしょうか。
ありがとうございます。
いろいろ調べてみて、とりあえず以下の式だとだいたい妥当な結果が出ているように思われましたので、この式を採用しようと思います。(長さは常に1になるようになりました)
x -> cos y * cos z + sin x * sin y * sin z
y -> -cos x * sin z
z -> sin y * cos z - sin x * cos y * sin z
また、非常に重要なポイントとして、このマクロではノード間の補間をしないので、ぐるーっと90度以上中間ノードなしで回転させるようなカメラワークでは、正しい立体視カメラワークにならないことにも気づきました。
これを改善するには、長いカメラワークでは適当に途中にノードを挟んでやればいいので、新しいマクロではそういう「長く回すカメラワーク」があった場合に警告を出す機能もつけてみようと思います。
ちなみに、新しい計算式で長さは常に1になるようになったのですが、角度によっては微妙に「あれ?」と思われるような立体感になる場合があります。
これが計算式にまだ何か考慮もれがあるからなのか、MMD側の投影法との相性の問題なのかは、よく分かりません。
http://miku-challenge.seesaa.net/article/128759756.html