自分へのメモも兼ねて、カメラ周りについてのハマった内容とその対処法を記録しておきます。
調査環境
UnrealEngine 5.1.1
発生した問題
あるアクターの中をカメラが横切る場合に、カメラではNearクリップより前はレンダリングされず、ぶつ切りされます。
下の画像だと、カメラに当たってNearクリップが突き抜けている箇所はレンダリングされません。この挙動はゲームエンジンとしては正しい挙動です。
しかし、Mayaや3DSMaxなどのDCCツールでは、正確にレンダリングされる為、ゲームエンジンでは描画されないこの領域もレンダリングされ、レンダリング結果が一致しないという事が発生します。
ゲームであれば、カメラが特定のアクター(オブジェクト)をすり抜けたり、オブジェクトに埋まるっという事は、演出として採用していなければ、不具合だと思われる為、まず起こりえない状況になるかと考えられます。
しかし、映像系のコンテンツになると、話は変わり、カメラがオブジェクトをすり抜けるというカメラワークが作成されることもあります。
例えば、以下のようなケースがが考えられます。
- キャラクターを追いかけている最中に障害物があり、追いかける疾走感を損なわないように、カメラがそのままのスピードで障害物の中を突っ込むカメラワーク
- 建造物の大きさを表現するかのように、カメラゆっくりと建物の中を映していき、壁をすり抜けて、最後に俯瞰で空から全体像を映すカメラワーク
回避方法
UnrealEngineでこれを回避するには、『SetNearClipPlane』という設定を変更します。
コンソールコマンドの場合は、アウトプットログか『ExecuteConsoleCommand』から、以下のコマンドを実行してください。
r.SetNearClipPlane 1
すると、以下の画像のようにNearクリップによって、レンダリングされない領域がレンダリングされるようになります。
SetNearClipPlaneは何をやっているのか
SetNearClipPlaneで何をやっているのかと言うと、ニアクリッピングプレーンを設定し直すという事をしています。単位は、cmになります。
実装は、下記だと思われます。
UnrealEngine-5.1\Engine\Source\Runtime\Engine\Private\UnrealEngine.cpp
注意点として、起動時にリセットされる為、レンダリング前にコンソールコマンドを投げるのが良いかと思います。
また、DefaultEngine.iniに、書いてみたところ、コマンドの置き替えに失敗し、エディタがクラッシュしました。
その為、コンソールコマンドから設定した方が安全そうです。
最後にもう一つ、注意点として、カメラのNearクリップの位置を変更しているだけなので、カメラが壁に
の中に埋まって横切る場合などは、中を作っておかなければ、ポリゴンが無い空間が表示されてしまいます。