概要
UnityでVR対応のどこでもドア実現を目指す その2 Oblique Near-Plane Clipping編の補足を記載します。
Oblique Near-Plane Clipping
細かい計算式やロジックについては複雑な話になるため今回はイメージのみを記載します。
なぜ平面の方程式を渡すかは、次回あたりに説明するかもしれません。
以下の逆三角がカメラ空間の視錐台とします。本来は3次元ですが説明はxz空間の2次元で行います。
- 青領域が描画対象内
- 赤色が描画対象外
- 青と赤の境界の斜線が Clip Plane
そして以下が上記の視錐台を描画対象範囲であるクリップ空間に変換したものです。
Oblique Near-Plane Clipping は上記の境界の斜線に伸びる矢印のように
x,y軸の値は変更せず、z軸の値のみを操作してClip Plane上のzの値をDepth Bufferの最小値にする
というテクニックです。
Oblique Near-Plane Clipping の注意点
Far-Planeが不安定になる
上記のクリップ空間の上部が画像からはみ出ていますが、これは意図的に表現しています。
というのも一度Oblique Near-Plane Clippingを設定するとFar-Planeに以下の現象が起きます。
- Far-PlaneはNear-Planeと非平行化
- UnityのCameraのFarの値は正確に作用しない
- ただし本来のFar-Planeより手前のメッシュは描画対象のまま
- Far-Planeより外のオブジェクトは意図しない形で描画対象となる可能性がある
UnityのCameraについて
一部メソッドの扱うパラメータはカメラ空間準拠
今回UnityのCamera
クラスに渡すメソッドに触れてみて気づいたのですが、
一部はカメラ空間でのパラメータを扱うものが含まれています。
ドキュメントには、コアな部分を触る人には当たり前なのかメソッドによってはどの空間準拠で渡すかは明記されていません。
以下カメラ空間準拠のメソッド例です。
CalculateObliqueMatrix
worldToCameraMatrix
- property
projectionMatrix
Camera.worldToCameraMatrix のように言及してくれているものも有ります。
自分のようにグラフィックエンジンに慣れてない人からすると困惑するポイントだと思いますので、
Cameraのメソッドに渡すオブジェクトに迷ったときは、このことを意識するといいことがあるかもしれません。
Unityのカメラ空間は左手系
普段扱っているUnityのTransformは右手系ですが、カメラ空間は左手系(OpenGL準拠)のようです。
Camera.worldToCameraMatrix
などを直接使用して座標変換するなら意識する必要はありませんが、
もし独自にカメラに渡すパラメータを作る場合は注意が必要です。
僕の場合、はじめ
* Transform.InverseTransformPoint
* Transform.InverseTransformDirection
Cameraインスタンスの上記メソッド(Transformのため右手系のまま)を使用して平面の方程式を計算したためうまくいかず貴重な日曜日がさよならしました(笑)。
いろいろ探っているときにCamera.worldToCameraMatrix
の説明を見つけてなんとか解決できました。
普段はあまり使わない知識かもしれませんが参考までに。
今回のまとめ、雑感
補足編が遅くなってしまいごめんなさい。
実はどこでもドアの実装における描画において、かなり迷ったり、行き詰まってしまっているため遅れてしまいました。。。
でも迷っているなりに楽しく感じていますのでまだまだ頑張っていきたいです。
いつも通りご指摘やコメントなどお待ちしています。
また、知識不足もありますが質問などあれば遠慮なくコメントにてください。
答えられる範囲であれば回答させていただきます!!!