(広角レンズというよりも)リアルレンズのシミュレーション

kataho2006-08-22

実際のカメラのレンズや目玉によってもたらされる視野は扇型を視線を軸に回転させた回転体なのだが、コンピュータ上では計算の簡略化のためか上下面が平らな錘台の形で扱われている。このため特に視野の端の方でリアルとのゆがみが大きくなり、違和感が生じてしまうのだ。自分は3D酔いの原因の大部分はこれなんじゃないかと思っている。

vertex shaderを使って頂点を扇形の視野で得られる位置へ移動させることで補正を試みた。


(視野角60度の場合)

world、view行列による変換を済ませた頂点pにおいて、線分aの長さはこの頂点座標のz値。線分bの長さはa/cos(fov*0.5):(fovは視野角度)。これは扇形上の点における共通のカメラからの距離である。projection変換時にxyはこの扇形まで射影した頂点座標をつかうがzwは元々のz座標を使う。

float Fov;
float4x4 ViewMat;
float4 ProjKeys; // (proj._11, proj._22 proj._33, proj._43)

float4 fisheye_transform(float4 in_pos)
{
  float4 out_pos;
	
  out_pos = mul(in_pos,ViewMat);

  float alpha = (out_pos.z / cos(Fov * 0.5f)) / length(out_pos);

  // apply projection matrix
  out_pos.w = out_pos.z;
  out_pos.x = alpha * out_pos.x * ProjKeys.x;
  out_pos.y = alpha * out_pos.y * ProjKeys.y;
  out_pos.z = out_pos.z * ProjKeys.z + ProjKeys.w;

  return out_pos;
}


アニメでよくある広角レンズ風表現もこのとおり (スッパダカなのは気にしないように) (視野角90度)

参考になるかもしれないページ
http://members2.jcom.home.ne.jp/ssm2438/anime/anim04.html