物理的なカメラを利用したことがある人は分かるかと思いますが
一般的に現実で真っすぐなものを撮っても レンズの歪みで画像で直線にはなりません。
補正する方法は色々あるようですが Blenderの利用して補正データ作成する例を考察したいと思います
歪み画像による画像マッピング
3Dでのテクスチャを張り付けるのUVマップを使うかと思います
これは「3D面上のここに 画像のここを対応づける」という情報ですが
画面の大きさを1.0とした割合の値の座標(UV座標)で表されます。
また、色の画像データもBlender内では各色0-1.0の値として扱われています
ここでUV座標指定に色画像を挟むと・・・
色情報をUVの座標値と解釈した座標の色を取得した画像が作成され 歪んだ画像を作ることができます
これ自体を「UVマッピング」と言ったり「STmap」と言ったりするようです
(画像左下が挟み込んだ画像で 圧縮で乱れていますがもっと滑らかな画像です)
ここではBlenderでの用語ではないですが歪ませるための画像を STmap と呼称します
このSTmapをうまく作れれば レンズの歪みの補正ができそうです
今回は広角のアクションカムでの撮影画像で試してみます
補正データのマッピング
こちらが補正をするために市松模様を撮影した画像です
周辺部分が特に大きく歪んでいますね
撮影時に市松模様の実際の大きさとカメラの距離を計測しておいて
3Dソフト上でこれと全く同じものをモデリングして
正確に対応付けされたSTmapを作れれば 理論上は歪みが補正できることになります
まずはグリッド間隔と同じメッシュを作成して
UVマッピングで撮影画像の市松模様とメッシュのUVを合わせる作業をします
3Dビューのテクスチャマッピングで市松模様が真っすぐになれば終了です
STmapの出力
撮影画像と同じカメラ位置からレンダリングすることで補正用のSTmapを作成します。
まずはレンダリング解像度とカメラの画角を設定です
このカメラビューに映った範囲が最終出力に映る範囲ということで これが補正後の画像の出力解像度や範囲に関係します。
画像がボケたり 市松模様が欠けている部分は利用できないので 撮影画像よりレンダリング範囲は狭くなります
今回は横方向の画角70度 4000*2000の解像度に設定しました
メッシュのマテリアルでこのようにUVマップの位置ベクトルを色情報として入力する設定にすると
メッシュ上の点がどのUV座標を利用しているかを表す画像になります
標準では1つピクセルに対して僅かにずらした位置をサンプリングして滑らかにする処理が
入っているので値を0にすることでオフにしています
これをレンダリングしてOpenEXRで保存します。
STmapの利用
コンポジターのノードには色の対応付けで歪める利用できるUVマッピングノードがあります
UVマッピングの 「画像」の入力に変形させたい画像を「UV」の入力にSTmap画像を接続します
出力画像の解像度はSTmapの大きさになります。
ここで画像ビューアーのエディタを表示しておいて表示画像をViewer Nodeにすると
変換結果が表示されて 結果画像の保存もできます
また、Node Wranglerアドオンを利用している場合にはサイドバーのノードタブに
「Save This Image」のボタンが出るので そこからアクティブなビューアーノードの画像を保存する操作もできます
また、Blenderでは冒頭のようにシェーダー上でUV値を歪めることができるので
私は 以前に記事にした カメラプロジェクションアドオン を併用して
カメラから見た方向が正確な位置へ投影してデリングのガイドとすることができます
こちらについては いずれ別の機会に解説したいと思います
個人的な手順の整理のために書いたニッチな内容ですが
何かのお役に立てば幸いです。