Blenderでカメラ位置合わせ(1点透視)

今日から3回(ぐらい)に分けて、Blenderでのカメラ位置合わせについて記事を書きたいと思います。以前、人物のシルエットを使ってBlenderで影を描く方法を説明しましたが、カメラの位置を求めるのが意外と大変でした。

今回はカメラの位置をBlenderのUI操作だけで求めるのが趣旨になります。もちろん電卓等は必要なく、直感的な操作法だけで行います。

とはいえ透視図法としての理論は使いますので、消失点の発生原理やSP(ステーションポイント=カメラの位置のこと)と消失点の位置関係については知っていることが望ましいです。(透視図法の理論はパースフリークスで説明しています)

 

1.2Dイラストと3DCGの合成

下の左図はアナログとペイントソフトで描いた2Dのイラストです。 真ん中はBlenderレンダリングした同一シーンの3DCGであり、右図はそれらを重ね合わせたものです。

f:id:reminica:20160417203030j:plainf:id:reminica:20160417203035j:plainf:id:reminica:20160417203039j:plain

Blenderによる3DCG画像は今回新たに作ったものであり、左の絵を描いた時点では存在しませんでした。さて、この画像を作るには1つ解決しなければならない問題があります。それは3次元の物体に対する正確なカメラの位置と向きを知ることです。

今回の説明では2D画像としてイラストを使いますが、写真の場合も消失点の位置さえ分かれば同じ手順が通用します。写真とCGを合成したい方も参考にしてください。

 

2.1~3点透視の分類

透視図法には1点透視、2点透視、3点透視という3つの分類があります。いずれに分類されるかは、絵を構成している直交座標系の3軸XYZのそれぞれについて、消失点を持つか否かを調べれば良いです。

f:id:reminica:20160417205358j:plain

この絵の場合、3軸は上図のようになっており、赤と青の軸は画面上で平行線となっています。すなわち消失点を持ちません。これに対し、緑の軸は1点に収束しているため、消失点を持ちます。消失点は1つしかありませんので、1点透視図になります。

今日は1点透視図におけるカメラの位置合わせを行います。2点および3点透視図については後日行います。

 

3.視心と距離点の作図

透視図法的アプローチでカメラ位置を求めるには、消失点の位置が必須要素となります。しかし 1点透視図は視心(Visual Center)が唯一の消失点であり、この1点だけでは情報が足りません。そこで距離点(Distance Point)も求めるものとします。距離点とは正方形の対角線の消失点のことであり、絵の上に正方形が描かれていれば、下図のように作図的にその位置を求めることができます。

f:id:reminica:20160417210049j:plain

以上が準備となります。2D上でここまでの作図が完了していれば、あとはBlenderの操作のみでカメラ位置を求めることができます。(上図では水平線も描かれていますが、これは単に視心と距離点を直線で結ぶだけですので、必須要素としては視心と距離点の2点だけになります)

 

4.Blenderの基本操作

毎回説明している気もしますが、念のため簡単にUIの説明をしておきます。(説明が不要な方は「6.下絵の表示」まで飛ばしてください)

下図はBlenderの初期画面です。今回は現時点の最新版2.77を使います。初期状態でプロパティシェルフは表示されませんが、3D View上でNキーを押すと表示されます。

f:id:reminica:20160417210836p:plain

Blenderの操作は効率化のため、キーボードが多用されます。マウスで行える操作であっても、キーボードの方が迅速な処理が可能だからです。しかし、注意すべき点があります。キーボードによる操作は、マウスカーソルの位置に依存する場合が多々あります。例えば、オブジェクトを全選択する際はAキーを押しますが、これは3D Viewウィンドウにマウスカーソルが乗っていることが条件になります。

f:id:reminica:20160417211052p:plain

上図に示すようにプロパティシェルフ上でAキーを押すと、そのパネル全体が折りたたまれ非表示になります。もう1回Aキーを押すと表示されます。(パネルとは▼をヘッダとする項目のことです。上右図ではTransformやGrease PencilやViewがパネルになります)

キーボードを使う際には、マウスカーソルの位置に注意を払ってください。

 

5.レンダリングエンジンによる違い

もうちょっとだけ余談を挟みます。Blenderでは何種類かのレンダリングエンジンを切り替えて使うことができます。レンダリングエンジンとは3DCGの画像を作るためのコアとなる機能のことで、ここを切り替えると出来上がる画像がガラッと変わります。

下の上図はBlenderの標準レンダリングエンジンによる画像で、下図がCyclesという新しいレンダリングエンジンで作った画像です。両者は同一シーン同一設定ですが、Cyclesの方がより本物っぽい描写となっています。

f:id:reminica:20160418114025p:plain

両者の切り替えは画面上部(下図参照)で行うことができます。注意すべきは、この設定を変えてしまうと、一部の画面の構成が変わってしまうことです。例えば、Propertyウィンドウ内のマテリアル設定画面は下図のように大幅に変化します。よって、説明する側としても、Blender RenderとCycles Renderで説明を分けるか、どちらかのレンダリングエンジンに絞って説明する必要が出てきます。今回の解説では適宜必要に応じて、レンダリングエンジン毎の説明を行いたいと思います。(多くの場合、両者は共通の設定なので、それほど心配は要りません)

f:id:reminica:20160417211727p:plain

 

6.下絵の表示

さて、ここからが本題です。最初の問題として、下絵となる画像をBlender上に表示させる方法を考える必要があります。代表的な方法として、Background Imagesパネルの利用が挙げられますが、特定のビューでしか下絵が表示されないなど扱い難い部分があるため、今回はパスして別の方法を取ります。

f:id:reminica:20160417213124p:plain

今回はEmptyというオブジェクトを使います。このオブジェクトは名前が示す通り空っぽのオブジェクトであり、自身はレンダリングの対象になりません。しかし他のオブジェクトを制御することができるので、使い方次第で表現の幅が広がります。

f:id:reminica:20160417213627p:plain

3D Viewウィンドウのヘッダで[Add]-[Empty]-[Image]を選択してください。(AddメニューはShift-Aキーでも表示することができます)

Emptyオブジェクトは立方体(Cube)や球(Sphere)など8種類の表示形態があり、その1つが画像(Image)になります。どれを選んでも3D View上での表示が変わるだけの話でEmptyオブジェクトとしての性質は変わらないのですが、今回はその表示が重要であるため、画像を選びます。

生成したばかりのEmptyオブジェクトはまだ画像が設定されていないため、ただオレンジの正方形が表示されるだけです。画像を設定するには上図に示す通り、Propertyウィンドウ上のOpenを選択します。画像選択ダイアログが表示されるので、視心と距離点を作図した1点透視図を選んでください。

 

ここまでで下図のような表示となります。オレンジの枠に画像が表示されますが、位置や向き、大きさを調整しましょう。

f:id:reminica:20160417214511p:plain

設定はすべてPropertyウィンドウで行うことができます。OffsetXを-0.5に設定すると画像の横方向中央がEmptyオブジェクトの原点になります。あとで再調整するので必須というわけではないですが、左右均等の方がなにかと作業しやすいので、一応手順に加えておきました。ちなみにOffsetYを-0.5にすると、上下も均等になりますが、今回は画像の下端をZ=0にしたいので、OffsetYは0のままにしておきます。

あとはTranformパネルで回転角Xに90°を設定して、画像を起こします。言い忘れていましたが、この画像は透視図法における画面(PP)に相当します。水平構図の1点透視図におけるPPは地面に対して直交しますので、画像は地面と直交する向きに置く必要があります。

最後に画像のサイズを調整します。あとで再調整するので、必須工程ではありません。そのままでもいいですし、お好みのサイズにしてください。

 

7.カメラはどこに置く?

最初にやるべき目標を確認しておきます。3D Viewにおけるカメラは初期状態で下図の位置にあります。

f:id:reminica:20160417215945p:plain

テンキーの0を押すか、3D Viewヘッダで[View]-[Cameras]-[Active Camera]を選択すると、カメラ視点に切り替わります。下図のオレンジの枠はカメラに映る範囲をさしています。つまりレンダリングすると、この枠の中だけが描画されるということです。しかしEmptyオブジェクトはレンダリングの対象にならないので、現在表示されている画像はレンダリングしても映りません。

f:id:reminica:20160417220000p:plain

カメラが最終的に置かれるべき位置は視心の真正面です。なぜなら、視心とは視界の中心であり、カメラの真正面にあるはずの点だからです。さらに距離点とはカメラから見て45°方向にある点ですので、結果としてカメラー視心―距離点を結ぶ三角形は下図のような直角二等辺三角形にならなければなりません。

つまり、この画面上での視心から距離点までの距離を測れば、あとは同じ距離を視心を始点として取るだけでカメラの位置が求められることになります。しかし今回は極力計算的なことをしないという制約を設けていますので、別のアプローチを取ることにします。

f:id:reminica:20160418112914p:plain

 

8.アイレベルと視心の位置調整

せっかく手作業でシーンを作るのですから、視心を変な位置に置くより、原点の真上に置きましょう。その方が座標が分かりやすい数値になりますので。

またアイレベルもよくわからない高さにするより、現実の単位に合わせた方が管理がしやすいです。そこでまずはUIに表示される単位の変更を行います。

Propertyウィンドウのシーン設定でUnitsパネル内のMetricを選択してください。これでUI上の座標や長さがメートル法による表記になります。(この設定は必須ではないです。標準のBlender Unitの方が良いようでしたら、そのままでも構いません)

最初にアイレベルの設定を行います。アイレベルとは地面を基準としたカメラの高さのことであり、透視図上では水平線と一致します。水平線の位置が判明していれば、描かれている人物その他から推測して大よその高さが判明します。今回の絵は水平線が人物の首付近を貫いていますので、地面から約130cmの高さにあることが分かります。そこで、アイレベルを130cmとして以降の設定を進めます。

まず準備として3Dカーソルを原点の真上かつアイレベルの高さに置きます。3D Viewのプロパティシェルフ内に3D Cursorというパネルがありますので、X=0、Y=0、Z=1.3mに設定してください。

f:id:reminica:20160417220026p:plain

3D Viewが移動しました。ここでViewを平行投影かつ正面図に切り替えます。テンキーの1または3D Viewヘッダで[View]-[Front]を選んでください。下図のような表示に変わります。

f:id:reminica:20160417220035p:plain

f:id:reminica:20160417220045p:plain

Emptyオブジェクトを選択した上で、PropertyウィンドウでEmptyオブジェクトの設定を開きます。まずSizeを増減させて、水平線が3Dカーソルと重なるようにします。続けてOffsetXを増減させて、視心が3Dカーソルと重なるようにしてください。いずれの値も赤枠内にマウスカーソルの載せて左ボタンで左右にドラッグすれば連続的に増減させることができます。

 

ここまでで下図のような表示となったはずです。これで画像の位置と大きさの調整は完了しました。

f:id:reminica:20160417220053p:plain

 

9.カメラの位置合わせ

いよいよ最終工程です。カメラの位置と向きを合わせます。まずはカメラを移動させましょう。Outlinerウィンドウまたは3D ViewでCameraを選択してください。(Outlinerウィンドウ上では左クリックですが、3D View上では右クリックで選択します)

続けて3D View上でShift-Sキーを押してください。または3D Viewヘッダから[Object]-[Snap]とたどっても構いません。表示されるメニュー項目のうち、Selection to CursorまたはSelection to Cursor (Offset)のいずれかを選んでください。直前で選択したカメラが3Dカーソルの位置、すなわち視心に移動します。(3Dカーソルは視心の位置にあると仮定しています)

さらにカメラの向きも設定します。3D ViewのプロパティシェルフTransformパネルでRotationをX=90°、Y=0、Z=0に設定してください。これでカメラはY軸正方向、すなわち画像のある方向を向きます。

最後に3D View上でカメラの緑のハンドルをドラッグして画像の手前側に移動させます。正確な位置調整はこのあと行いますので、ここでは適当な位置に置いてください。

f:id:reminica:20160417220101p:plain

 

カメラの画角を変更します。カメラを選択状態にしてPropertyウィンドウのカメラ設定を開きます。下図の1でHorizontalを選択したあと、2でField of Viewを選択し、3で90を入力します。これでカメラの水平画角は90°になります。Field of Viewとは画角のことです。パースフリークスではAOV(Angle of View)という略語を多用していましたが、3DCGの世界ではFOV(Field of View)の方が一般的な表現のようです。

f:id:reminica:20160420154321p:plain

このあとの作業のため、テンキーの0を押してビューをカメラ視点に切り替えてください。3D Viewの左上にCameraと表示されていれば、カメラ視点に切り替わっています。

 

画角を90°に設定した理由ですが、画角が90°のとき、カメラから見て45°方向はギリギリ視野に入ることになります。(それが画角の定義ですので)

すなわち距離点は視界の端に存在しなければなりません。この性質を利用して、カメラの位置を求めようというわけです。といってもカメラビューのままカメラを動かすのは少々難しいです。しかし良い方法があります。3D ViewのプロパティシェルフTransformパネルでLocation Yの値を変更してください。マウスカーソルを下図赤枠内の置き、左ボタンで左右にドラッグすれば値を増減できます。

f:id:reminica:20160418115256p:plain

長い道のりでしたが、これでカメラの位置と向きは完璧です。調整は終わりましたので、画角は任意の値に変更しても構いません。90°のままでは広角すぎて外周部が歪みますので、60°以下にすることをお勧めします。

あとはこのビューを使って、下絵として表示された画像に合うようオブジェクトを配置していくだけです。もちろんそれらのオブジェクトはGlobal座標系のXYZ軸に沿いますので、複雑な回転等を掛ける必要はありません。

今回はアイレベルをGlobal座標の単位系に合わせているため、物体を実寸法指定で作成できるというメリットがあります。地面はZ=0になります。物体を置く説明も後日行いたいと思います。次回は2点透視図の説明を行います。