🏝️

魚眼カメラの映り方 3

に公開

前回

3D描画

最初の記事と違い、3次元でz座標の考慮が必要になります。

さらに厄介なことに、投影後の重なりが発生しやすくなります。

失敗例

単に順序を考えず描画するとこんな感じ。

なので、順序に気を使います。
今回は回転操作などを終えて投影直前の点群の座標を見て、カメラ中心点から遠い順に描画することにします。おおまかにはうまくいきます↓。

成功例

顔に色を付けるぞ

AIで顔画像を生成し、前の記事で保存した3d_face_dots.pngを重ね合わせ、生成した画像のサイズ合わせを行います。クロップしたりしたうえで、目や鼻、口の位置が大まかに合うようにし、画像のサイズ(最悪横だけでも)が一致するような顔画像に作り変えます。

次のようなフローで無地の3Dモデルを色付きで投影します

3Dのモデルの頂点すべてについて
    頂点をに対応する色を、頂点のx,y座標をもとに、生成+上で編集した顔画像から得る
    ↓
    投影後の座標を計算する
    ↓
    上記の色で描画する

結果

下記に用意しました

https://leafy-quokka-6d90d9.netlify.app/fish_eye_sim_3d.html

以前のコードに加えて足したのは、距離によるsort、zの値を使うぐらいでしょうか。

課題

  • 歪みの影響の組み入れ

魚眼レンズの投影方式だけを意識して計算しましたが、実際にはレンズの歪みの考慮も必要です。

例えば以下で解説されているようなもの。

https://www.mdpi.com/1424-8220/19/5/1218

こういうのまで入れ込めると角度が上がりそうですね。

  • 顔以外の部分

用意が大変なことは棚に上げたとして、3Dモデルさえあれば最終的にはできそうです。が、計算量も増えてしまうので、ブラウザでは限界が来るかもしれません。typed arrayやwasmでどこまで耐えられるのかなど、知見なしです。

  • バグ類
    鋭意更新中

Discussion