0

私はこの奇妙なユースケースを持っています。

これらの変数は既知です。

  • カメラのズーム (または fov)

  • Y 軸と Z 軸を中心としたカメラの回転 (向き)= 0

ここで、地平線(水平位置) を特定の2D 高さ "YY"= (0,0,Infinite)で画面に描画したいと考えています。水平線が "YY" に描画されるようにするには、カメラの X 軸の回転はどのようにする必要がありますか?

なぜこれが必要なのかと尋ねるかもしれません: カメラのズームを変更すると、画面上の水平線の位置が変わります (X 軸の回転を除くすべての場合= 0)。カメラのズームを変更し、水平線を (2D 位置に対して) 変更しないようにする必要があります。私の知る限り、これは X 軸の回転を適宜変更することによってのみ達成できます。

4

1 に答える 1

2

明確に定義された対称ビュー フラスタムの場合、ソリューションはいくつかの単純なジオメトリで見つけることができます。

問題の可視化

YY正規化されたデバイス座標 (-1 から 1 の範囲)にあると仮定します。ピクセル座標の場合は、変換する必要があります。

投影面をカメラから 1 ユニット離れた位置に選択しました。しかし、他の距離でも同様に機能します。すると、距離y'は単純に

y' = YY * H/2

H/2は画面の半分の高さで、次のように計算できます。

H/2 = tan (fovy/2)

fovyカメラの垂直方向の視野です。

回転の角度を見つけたいとしalphaます。これは単純です:

tan alpha = y' / 1 = YY * tan(fovy / 2)
    alpha = atan(YY * tan(fovy / 2)

方向に注意してください。正の値は下向きの回転を指定します。


任意の射影の場合、この問題は解析的に解決できます。

P射影行列とビュー行列があると仮定するとV、次のことを解きたいと思います。

w-clip(P * V * (0 0 1 0)^T) = (... YY ...)

カメラの x 軸を中心とした移動と回転のみを許可する必要があるためV、次の形式になります。

    / 1  0           0          tx \
V = | 0  cos alpha  -sin alpha  ty |
    | 0  sin alpha   cos alpha  tz |
    \ 0  0           0          1  /

これにより、次の式が得られます。

YY = (p23 * cos alpha - p22 * sin alpha) / (p43 * cos alpha - p42 * sin alpha)

は- 番目の行と- 番目の列にpijある のエントリです。Pij

お気に入りのシンボリック ソルバーを使用して解を取得するalphaと、ビュー マトリックスを再計算できます。

于 2015-01-30T12:39:47.997 に答える