1年位前に、工場案内のリーフレットと航空写真を併用して3Dモデルを起こしてみたことがある。しかしテクスチャ貼り付けの手作業が多くけっこう時間はかかった。今回は手間をかけずに、目安1時間以内に写真から物流倉庫の3Dモデルを起こしてみた。
A 3D model is created from a rough sketch of a photograph of a distribution center building, and the photograph is projected on the wall as a texture.
About a year ago, I tried to make a 3D model using a leaflet of factory and an aerial photograph. However, it took a long time because of a lot of manual work to put textures on the model. This time, I made a 3D model of a logistics warehouse from a photo within an hour.
埼玉中央物流センターの写真を下絵にする
物流センターの画像を検索して、適当な写真を入手した。これを下絵にする。
カメラオブジェクトのオブジェクトデータプロパティで下絵を設定できる。
しかし下絵にしただけでは、写真のXYZ座標軸(パース)と Blender のカメラオブジェクトからみたXYZ座標軸(パース)が合わないため、この状態から3Dモデルを起こすのは大変である。
カメラの位置を特定する fSpy を使えばよい
写真が撮影されたときに、どの位置に実際のカメラがあったのかを逆算して、その位置に Blender のカメラオブジェクトを配置すればよい。fSpy というツールが定番だ。
- スタンドアロンのツール。
Windows の場合、ダウンロードした fSpy-1.0.3-win.zip を適当なフォルダに展開して、本体 fSpy.exe を起動すればよい - Blender 向けのアドオン。
ダウンロードした fSpy-Blender-1.0.3.zip を [編集]-[プリファレンス]-[アドオン] からインストールすればよい
fSpy の画面に画像をドラッグ&ドロップするか、ファイルを開く Open Image ことで画像が取り込まれる。
画像が取り込まれた。少なくとも2つの軸の消失点を特定すれば、カメラの位置が特定できるので赤の X軸、緑の Y軸を写真に写っている建物の縁に位置合わせする。
建物の天井と、搬出口のひさしの部分と、側壁の接地部分の縁に合わせた。
X軸、Z軸の方向が逆になっているので、左上の消失点の軸 Vanishing point axes で X軸をマイナスX (-x) に修整する。
軸の方向を合わせ損ねると、この後 Blender でモデルが天地逆さまになるので気を付けた方が良い。
保存すると、埼玉中央物流センター.jpg.fspy という拡張子 .fspy のファイルが出来た。
Blender に戻り [ファイル]-[インポート]-[fSpy (.fspy)] でインポートする。
写真のXYZ座標軸(パース)と Blender のカメラオブジェクトからみたXYZ座標軸(パース)が合った状態で、写真を下絵にした新しいカメラオブジェクトが自動生成される。
このカメラ視点で見ている限り、少なくとも座標軸があっているので、この状態で3Dモデルを起こす。
3Dモデル作成は単なる Blender の操作となるが、多少のコツはある
立方体 Cube と写真の下絵の位置合わせを行うのだが、通則としては
- つい辺や頂点を動かしたくなるが、それをやると平面的には簡単だが立体的には崩壊するので、なるべく面同士で合わせる
面の大きさを変える以外に方法がない場合には、辺を動かしてもよい - 原則として [g][x]、[g][y]、[g][z] などで座標軸を固定する
それでできない操作もあるので、そのときだけは [g] のみで面を移動させる - 面の選択はどのような視点から行っても構わないが、位置合わせは fSpy から取り込んだカメラ目線 [0] でのみ行う。なるべく拡大すること。
- 見えない部分が歪んでいても気にしないで進めること。
なるべく平行になっている辺同士で、まず一辺を合わせる
最初の操作はオブジェクトモードでメッシュごと動かす方法で構わない。
- いい加減に動かすのではなく、[g][z]で Z軸固定して動かす
垂直方向 Z軸に動かしたことで、見かけ上、建物の上辺 X軸に立方体上辺 X軸が合わせられた。
X軸を固定して、いま合わせた一辺の長さを調整する
これ以降の操作は編集モードで、基本的には面を動かす方法で行っていく。
- いい加減に動かすのではなく、[g][x]で X軸固定して動かす
まず右上のX位置を合わせ、次に左上のX位置を合わせる。
編集モードに切り替え [Tab] 面選択モード [3] にしてから、立方体の右側面を選択する。
X軸を固定しているので、何か気持ちいい操作感で上辺を合わせることができた。
建物の底面を接地させる
底面を選択する。
- 何となく動かすのではなく、[g][Z]で Z軸固定して動かす
メッシュは直方体なのだが、見た目はだいぶ歪んでいる。
直方体の左辺が垂直になっていないので、底面を右に動かして垂直にする
底面が見づらいので、カメラ目線を外し [0] 、ワイヤーフレーム表示に切り替えて、隠れている面を選択する。
その後、カメラ目線 [0] に戻し、
- 何となく動かすのではなく、[g][x]で X軸固定して動かす
前面は合っているが、背面は歪んでいるようだ。
底面をスライドさせたので、もはや直方体とはいえず只の六面体となった。
六面体の右辺が垂直になっていないのを、辺選択で垂直にする
底面はもともと右に飛び出していたが、先ほど底面を右に動かしたせいで、さらに飛び出したはずだ。もう面の位置調整だけでは是正できないだろう。
底面の右端の辺を左に移動させて底面の幅を狭くすることで、飛び出していた部分を引っ込める。
- 何となく動かすのではなく、[g][x]で X軸固定して動かす
六面体の奥行き Y軸 を合わせる
まだ Y軸方向に伸ばしていないので奥行きがほとんどない。
裏面を引っ張って奥行きをつけたいが、裏面が見づらいので、カメラ目線を外し [0] 、モデルを回転させるなどして隠れている裏面を選択する。
- 何となく動かすのではなく、[g][y]で Y軸固定して動かす
歪むので、上下の隅のどちらか奥行きが長くなる方で合わせる。
六面体の右奥の右辺が垂直になっていないのを、辺選択で垂直にする
いま歪んだ右奥の右辺を治す。しかし直接に右辺を軸固定で操作すると、下を直すと上がズレることになるので、底面の裏側の下辺を操作する。
- 右辺を選択するのではなく、下辺を選択する。
- 何となく動かすのではなく、[g][x]で X軸固定して辺を左に動かす
裏側がおかしい部分を直す
建物右手の屋根が高い部分の正面だけは見かけ上、作成できた。
しかし実は背面の左辺が斜めになっているなど、裏側は怪しい状態となっている。
モデルをよく見ていくと、実は床底面が天井面よりも奥行きが狭くなっているが、見えない部分はどうしても直す必要がある場合を除き放置でよい。
屋根が低い方の部分を作成していく
左側の屋根が低い部分を作成してくのだが、別の立方体を置くと面倒なことになるので、左側面をループカットで3階部分と2階以下部分に分け、2階以下部分を伸長する。
まずは何とかして左側面を選択状態にしてから、ループカットを発動する。
[選択] Select -[ループ選択] Select Loops -[辺ループ] Edge Loops でループカットの四辺を選択し、[g][z]で高さを合わせる。もとの六面体が台形であるため高さを合わせると正面や奥行きが歪む。
- ループカットの四辺で構成される面の位置を修正 [g][x]、[g][y]
- 大きさ自体を修正
したりして押し出し開始位置の角の部分を合わせる。
押し出し面を選択して、X軸方向に固定して押し出す [e][x] と
底面が天井より広いため、左端の壁が少し斜めになっている。
底面の左辺を選択して、X軸固定で移動 [g][x] させると、左端の壁の傾きは治る。
背面は怪しいままだが、正面だけは下絵とぴったり合っている。
3Dモデルをマテリアルプレビューモードで見ると、白箱となっている。
写真の画像は下絵であって、モデルに貼られているわけではない。
3Dモデル(メッシュ)に下絵と同じテクスチャを貼る
これまではfSpy で追加したカメラ視点の写真を下絵にして、モデリングをしてきた。
しかし下絵はあくまでも下絵であり、3Dモデルの方ではなくカメラのレンズに貼り付けられているような代物に過ぎない。
3Dモデルに同じ写真をテクスチャとして貼るには、少なくとも3Dモデルの描画(シェーディング)のさいに写真をテクスチャとして使うように指定せねばならない。
現時点でどうなっているかシェーディング Shading ワークスペースの下半分(シェーダーエディター)で確認すると、プリンシブルBSDFがベースカラー:白を出力している。
少なくとも写真をテクスチャとして使うように指図するには、
- 画像テクスチャ -> 放射 -> マテリアル出力
のような感じにノードを組み合わせる。
- [追加]-[シェーダー]-[放射]でノードを追加し、マテリアル出力のサーフェスと接続
- [追加]-[テクスチャ]-[画像テクスチャ]でノードを追加し、リンクする画像を閲覧(開く)して下絵の画像ファイルを指定し、カラー同士を接続
これで一応は画像テクスチャを出力するようになったが、現在のところ UVマッピングが適当なので、めちゃくちゃなテクスチャが表示される。
3Dモデル(メッシュ)のUVマッピングをカメラ下絵と同じにする
UVマッピングを行う方法は幾つもあるが、ビューから投影という手法を使うと、見たままの配置でモデルにマッピングされる。
UV Editing ワークスペースに切り替えると、既定では画面の左半分が UV エディター、右半分が3Dビューポートとなっているが:
- 右半分の3Dビューポートで、[選択]-[すべて]などで3Dモデルの全体(すべての面)を選択する。
左半分の UVエディターを見ると、素直過ぎるUV展開となっているのが分かる。
- 右半分の3Dビューポートが fSpy のカメラ目線になっていない場合、まずカメラ目線に切り替え [0]、[選択]-[すべて]などで3Dモデルの全体(すべての面)を選択し直す。
- 右半分の3Dビューポートで [UV]-[ビューから投影] を実行する。
そうすると左半分のUVエディターに、見たままの UVマッピングが反映される。
一見良さそうに見えるが、拡大すると歪んでいる。
サブディビジョンサーフェスを適用して歪みを減らす
オブジェクトモードに変更して、モディファイアープロパティからサブディビジョンサーフェスという種類のモディファイアーを追加する。
[シンプル] Simple へと切り替え、[ビューポートのレベル数] Leves Viewport を増やすと歪みがとれる。
写真で見えていた部分だけはそれなりに正しいモデルが出来た
写真で見えていなかった部分は適当にUVマッピングされているが、見えていた部分はもっともらしくなっている。
実際には3Dモデルもいい加減で、正面からメッシュを観察すると歪んでいる。
写真に写っている範囲についても、
ので、斜めに写った写真がそのまんま出力されてしまっている部分は不自然だ。
3Dモデルを修正する場合には、シェーディング設定を元に戻す
放射とのノード接続を切って、プリンシブルBSDPに繋ぎ直すと、元の下絵を再表示できる。
少なくとも見えている範囲は作りこんでおいた方がいいだろう。そのように思って、さらにループカットをやり始めたところ、所要時間は1時間どころではなくなった...
元の写真のパースも歪んでいたようだ
がんばって修正しようとしたが、裏返しになった台形のようなモデルになってしまっているため難しかった。
元の写真のパースを fSpy で再度確認してみると、X軸Y軸の消失点を発見できているが、そのときのZ軸は真下を向いていなかった。
Blender でのカメラ位置を確認すると、かなり寄りで見上げるように撮っているので、そのせいかもしれない。fSpy の 3Dガイドとして Box を表示させると明白である。
NTTロジスコ名古屋物流センターの写真に変更
この写真では難しいと分かったので、もう少し引いて撮影された別の物流センターの写真を探してきた。
この写真では、Z軸がほぼ鉛直真下方向になっていた。全く同じ手順で、正面・側面・上面のどこから見ても歪みのない3Dモデルを作ることが出来た。
3Dモデル
天井のテクスチャは修正していないので、いい加減な割り当てになっている。しかし写真で見えていた部分のテクスチャは概ね妥当である。
正面
テクスチャに多少歪みがあり、庇のテクスチャが壁にも張られていたりするが、モデルは真四角であり、台形になってはいない。
側面
巻き線コイルのテクスチャが壁にも張られていたりするが、モデルは真四角であり、台形になってはいない。
上面
サブディビジョンサーフェスをモデル全体に欠けた副作用で、膜のような屋根が左端にできてしまった。左端にあった側壁のようなものを、押し出しで作ったのだが、同じメッシュ内に含めることに無理があったようだ。
そもそも本当はどういう形状なのか、Google Maps の航空写真で確認した。
工場のモデリングと同様に航空写真を使ったほうがよさそうだ。
NTTロジスコ名古屋物流センターの公式サイトの写真を使ったが、物流センターのような巨大な建物の下絵にするには撮影範囲が狭すぎた。天井のテクスチャがないというのも困る。
結論としては工場のモデリングと同様、航空写真や Google Street View の写真などを下絵に使った方がよさそうだ。
カメラ目線の写真を下絵を設定してモデルを起こす手法の方は、以前の工場モデリングでは使っておらず、今回初めて試したが、慣れると10分くらいで3Dモデルを起こせたので、併用するとかなり生産性が上がりそうだ。