#memo

indiedev太郎

UE4でカメラ実装: シャッタースピードの実装3

https://i.gyazo.com/00989f34afbdb2bd6741561e0fd2072e.gif


UE4でカメラ実装: シャッタースピードの実装2 - #memo
続き

ソース画像を0として、指定角度と長さのブラーをかけられるようになった
45°, 50
https://i.gyazo.com/3af3f02ec130410c5f3382c4e0ea987f.png

const int Length = 50;
const double Angle = 45.0;
const double Scale = 0.70;

// 回転
Point center( img.cols/2, img.rows/2 );
Mat affine_matrix = getRotationMatrix2D(center, Angle, Scale);

warpAffine(img, img, affine_matrix, img.size(), INTER_LINEAR, BORDER_REFLECT_101);

// カーネル作成
float data[Length];
for (int i = 0; i < Length; ++i)
	data[i] = 1;

Mat kernel(Length, 1, CV_32F, data);
normalize(kernel, kernel, 1.0, 0, CV_L1);

// ブラー処理
filter2D(img, img, -1, kernel, Point(0, 0));

// 回転(元の角度に)
affine_matrix = getRotationMatrix2D(center, -1 * Angle, 1 / Scale);
warpAffine(img, img, affine_matrix, img.size());

回転すると切り詰められるのはスケールとBORDER_TYPEをBORDER_REFLECT_101にしてごまかしているけど、完全にもっといい奴がある気がする


次にプレイヤーカメラの情報からLengthとAngleを渡す部分

シャッター開閉時間にテクスチャの更新を行うtnの間隔があって
tiのときに、ti-1のテクスチャに対して処理を行う
このときにCameraManagerのRotationの差を渡す

https://i.gyazo.com/59afb9b44d279126b7ddeaaa61f1dab7.png

RotationのYawは、例えば10回左に回転すると-3600になるので、差をとってやれば移動方向がでる

この角度を、テクスチャ上で何ピクセルの移動に相当するかの変換をする
回転は移動量とみなせるので(みなしていいのか!?)、アークタンジェントで処理角度と、ピタゴラスの定理から長さが取得できる

移動量の倍率は、よくわからないですね…
テクスチャサイズに依存しているような気がしないでもない

とりあえず現段階で現像を行ってみる

https://i.gyazo.com/ac082cc2c13a5f377f2f2304097b5829.png

わぁ!?ええんちゃう!?

現時点の問題(やっていないこと)が、
・ブラー距離倍率の数学(適当に5倍にしている)
・光量の数学
・画像合成の数学(スクリーンもなんか微妙)
・画像の光量を各スパンで統一としてしまっているけど、最後だけは違うのでおもみを変えないといけない
・プレイヤーの移動がブラーに反映されない
・オブジェクトの移動がブラーに反映されない
・カメラのRollがブラーに反映されない(操作できるようにするのか未定)