見出し画像

Blenderで 全天球写真(正距円筒図)⇄6面写真 変換

当noteは、拙著『Blender 4 制作テクニック大全』

に書ききれなかったネタを書き連ねていきます。


使用バージョン4.3.2

概要

まず、全天球とはこういうやつです。

Googleストリートビューとかでもおなじみのやつですね。
かつてはGoogle純正カメラアプリでも撮ることが出来たので身近な存在でしたが、2023年5月頃何故か消滅しました。
ゆえに、RICOH THETAのような全天球カメラを持っていたり、わざわざ全天球カメラアプリを入れていなければ撮影できなくなってしまったため需要がニッチすぎる気がしてこのネタは本には載せませんでした。


こういった全天球の画像は、実際にはこのような平面画像として保存されています。これは、正距円筒図と呼ばれます。

この写真は自分で撮影したものですが、うっかり部屋の隅に荷物を置いたままで撮ってしまい、これでは作品に使用したりGoogle Mapに載せたりというのはなんだか憚られます。
こういう場合は『消しゴムマジック』や画像生成AIのi2i等で消したいところですが、今のところそういった機能は全天球写真には対応していません。
この例の荷物のような箇所であれば何度も試せば上手くいくこともありますが、三脚のように真下にあるものはご覧のように正距円筒図ではかなり歪められてしまっているので全く上手くいきません。

そこで、正距円筒図をBlenderでこのような前後左右上下6枚の通常写真へ一発で変換してしまうような仕組みを作っておいてしまえば、『消しゴムマジック』やi2i修正等なんでもやりたい放題になります。

こちらであれば真下にある三脚もたいへん消しやすそうな姿をしています。

つまり
正距円筒図→6面写真 変換
写真をAIで修正
6面写真→正距円筒図 逆変換
という手順をやりやすくするよう、Blenderに変換と逆変換の部分を担わせようという魂胆です。

概念的には、正距円筒図を球体の内側に球座標変換して貼り付けたものを、画角90°の6方向に向かせたカメラで撮影する感じです。

見やすくするためにカメラの距離は離していますが実際には全カメラは同じ一点(球の中心)に配置しますし、やはりこれはあくまで概念図であり、実際にこうやって作るわけではなく全て数式で済ませます。

全天球→6面

単純な平面オブジェクトを配置し、それを撮影するカメラ(平行投影)を設置。出力はアスペクト比1:1にしておき、1~6フレーム範囲としておきます。

ノードのほとんどは『Blender 4 制作テクニック大全』の143ページ、球座標化のノードそのものです。
が、最後の[XYZ合成]の直前でX、Yともに[度へ]を通して180で割り、Xだけ加算0.5しています。
これは、直交座標から極座標への変換ではどうしてもπの要素が絡んでしまうのでそれを補正するためのものです。
また、座標は[生成]から取り、その直後に[マッピング]ノードを挿入して移動及び回転をさせています。


概念的には、単位立方体に外接する球に貼り付けるよう正距円筒図から球座標へ変換したテクスチャをその単位立方体の方へ貼り付け、それに回転と移動を施すことで単位平面へ投影しているのと同じことにしている、という感じ。

概念動画。

単位立方体にするためπの補正が必要だったのと、この立方体の回転と移動を[マッピング]ノードが担っています。
なので、[マッピング]ノードへの数値入力のみでこの立方体のどの面を単位平面へ投影するかを操作することが出来ます。

1フレーム目(正面)
移動 X:1 Y:-0.5 Z:0.5 回転 X:90 Y:180 Z:-90

2フレーム目(背面)
移動 X:-1 Y:0.5 Z:0.5 回転 X:90 Y:180 Z:90

3フレーム目(右面)
移動 X:0.5 Y:1 Z:0.5 回転 X:90 Y:180 Z:0

4フレーム目(左面)
移動 X:-0.5 Y:-1 Z:0.5 回転 X:90 Y:180 Z:180

5フレーム目(上面)
移動 X:0.5 Y:-0.5 Z:-1 回転 X:0 Y:0 Z:90

6フレーム目(下面)
移動 X:-0.5 Y:-0.5 Z:1 回転 X:0 Y:-180 Z:-90

というキーフレームを打てば、アニメーションレンダリングすることで自動的に前後右左上下面の画像が連番で出力されるというわけです。

もちろんどういう順番でも良いですが、後で逆変換する時のために順番は覚えとかないといけません。

あとはAIなり手描きなりで修正したい箇所を修正。ただし画像端にかかる部分を弄ってしまうと繋がりがおかしくなってしまうので気をつけてください。

6面→全天球

まずは読み込んだ6画像を立方体(正六面体)に貼り付ける作業です。

読み込んだ画像を[マッピング]ノードで良き位置、良き角度に調整し(それを×6)、軸の[符号]なんかを利用して作ったマスクでそれら全部を[カラーミックス]するだけという、難しいことはしてないけどただひたすらめんどくさいだけのノードを組みます。ここが今回のヤマかもしれません。がんばってください。0001~0006の画像のどれが前後左右上下のどれにあたるかをきちんと把握していなければいけません。

そのノード(左端の[テクスチャ座標]を除く)を、[正六面体座標]という名でグループ化しました。

[生成]座標を[積和算]でXラジアン360掛け、Yラジアン180掛けしてZ+1しときます。その後に球座標から直交座標への変換ノードを挟んで[正六面体座標]ノードに繋ぎます。[球座標から直交座標]の中身は本の226ページの球座標のものと全く同じです。
あとは貼り付ける平面メッシュとレンダリング解像度を2:1のアスペクト比にしてレンダリングするだけです。

無事、余計なものを消すことが出来ました。

6面画像の境界線の部分は修正できないという弱点があるので、それを克服するため座標を回転させて境界線位置をずらす、という仕組みも考えられますがこれ以上ややこしくして付いてきてくれる人がいるのかというのと、付いてこれるような人なら自分で作れそうな気がするので割愛します。

完成品.blendファイルをnoteの有料エリア(?)機能を使ってアップしちゃおうかとも思いましたがこれが人生初note書きなのでまだ機能がよくわかってなくて出来ないです><

また、3DCG方面でこれが真に必要となるような人はおそらくHDRIを求めるでしょうが、Blenderによる変換だけならば問題ないのですが生成AIの方にまだHDRIに対応しているものが無いので現時点ではやはり誰に需要があるのかわからないネタとなっております。
(HDR合成やt2iのパノラマはちらほら噂を聞くので色々と時間の問題のような気はしますが)

いいなと思ったら応援しよう!