modoのシェーダーノードを使って、カメラのレンズゆがみのような効果を制御する方法が解説されてたので写経してみました。
カメラの回転とShader Inputのレイ方向をそろえた後、レイ方向のXYを任意に編集した結果をRayCastでFinal Color Outputに戻すというのが基本的な流れのようです。
球面
球面のようにレンダリング。
あーそゆーことね、MODOのプロジェクションの数式 完全に理解した ←わかってない pic.twitter.com/bPxkm6i1mj
— クールなびじゅつかん館長 (@TheCoolMuseum) May 16, 2020
ディストーションのカーブ制御
カーブを使用してゆがみ制御。
ピーキー過ぎてオレにゃ無理だ pic.twitter.com/qgudjYkgzi
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
ディストーションのテクスチャ制御
テクスチャを使用してゆがみを制御。
レイ方向を制御する方法はポストエフェクトによるゆがみと異なり、ピクセルが荒くなったりせずシャープな画像を維持できるのがメリットです。しかし、欲しいゆがみを計算で求めるのが難しいです。
シェーダーノードはレンダリングも遅いので、テクスチャオフセットのように、もう少し手軽に使えるような機能があると嬉しいですね。
参考
詳細な解説をしてくれた館長さんに感謝です。
変なカメラを作るときには、パースペクティブ 18mm(フィルム 36mm)で作り始めてます。
これは何かって言うと視野角が90度になるので、上下左右方向に視野がそれぞれ45度となり、キューブの中心にカメラを置いたときに角がピッタリフレームに来るので、思った計算ができてるかわかりやすいんですね pic.twitter.com/DnPlDqHwcC— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
ここでレイZを繋がずに固定値-1(m)を入れるとこんな感じに歪んだ像になります pic.twitter.com/o4GoSzXilF
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
ここでXの方だけZで割ってあげるとこんな感じに縦の線が垂直に等間隔に補正されます pic.twitter.com/SfP1WyxTd8
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
なんでかって言うとZはマイナスの値なのでマイナスで割ることによって反転しちゃってたんですね、なのでZに-1かけて補正します pic.twitter.com/dHcLBn0mWR
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
ふたたび、カメラの画角を18mm 90°に戻しまして、先程Zにかけた-1.0を例えば-0.5にするとどうなるかって言うと、画角が広がった感じになります。これは焦点距離が18mmから9mmになったのと同様の効果があります。3枚目は-0.1に戻してカメラを9mmにしたものです pic.twitter.com/tIg5nT7oVV
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
レイのベクトル(X, Y, Z)がZ=1で表される面上のどこにヒットしたかを考えるとき、(X, Y, Z)がZ=1になるようにするには(X, Y, Z)/Zとすればよく、つまりその座標は(X/Z, Y/Z, 1)と表せると
要するにレイのX,YをZで割ったものは投影面上の座標を表していると言えるというわけです— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
ところで先程X,YをZで割って変換したレイのノードのままカメラを回転すると……すると?……は? ってことが起こってしまうのですね。これカメラを回転したことによってレイのZのプラスマイナスが反転する境界を超えてしまい、そこから計算がおかしくなるわけです pic.twitter.com/2Dy7SA5QnF
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
一体なにが問題なのかというと、カメラの回転や移動とは関係なく、この世界の基準座標を元にしてレイを取り扱っているためです
レイはカメラから出ているのですから、レイの操作は「カメラから見た」座標内で行わないといけません— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
反対に世界空間でのベクトルがこのカメラからみてどちらを向いているかを知るためには、ワールド回転の反対の操作を行う行列が必要です。反対の操作を行う行列は逆行列と呼ばれ、手計算では厄介ですがMODOでは簡単に作成できます
これにワールド空間のレイを入れるとカメラ空間のレイに変換できます pic.twitter.com/ClDlIqw2Qa— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
さきほど説明したとおりワールド回転で変換すると、カメラから見た方向を世界の方向に変換できるので、ワールド回転行列にカメラ空間のレイをかけ合わせてあげると、やっとカメラの方向に正しく追従するレンダリング画像が得られるようになりました。 カメラの画角などを変更しても正しく反映されます pic.twitter.com/aIW5k64n4N
— クールなびじゅつかん館長 (@TheCoolMuseum) May 22, 2020
超魚眼レンズもできた #modo pic.twitter.com/qchtmelNVo
— クールなびじゅつかん館長 (@TheCoolMuseum) May 20, 2020
縦パノラマができると試したくなるアニメのPAN美術風のパースのとり方 pic.twitter.com/b0vNO2MQjt
— クールなびじゅつかん館長 (@TheCoolMuseum) May 16, 2020