0

これは私のカメラクラスです

public class Camera
{
    public Matrix View { get; private set; }
    public Matrix Projection { get; private set; }
    public Viewport Viewport { get; private set; }

    public Camera(Viewport viewport, Vector3 position, Vector3 lookAt)
    {
        this.Viewport = viewport;
        this.Update(position, lookAt);
    }

    public void Update(Vector3 position, Vector3 lookAt)
    {
        this.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, this.Viewport.AspectRatio, 1, 500);
        this.View = Matrix.CreateLookAt(position, lookAt, Vector3.Up);
    }
}

左目用と右目用のカメラを作成しました。すべてが機能しており、Oculus はそれぞれの目に個別の画像を表示しています。問題は、Oculus がぼやけていて、私の脳が 2 つのビューを 1 つの画像に「マージ」していないことです。右目の画像をわずかにオフセットしようとしていますが、両目の正しい位置を見つけることができません。誰でも助けることができますか?

4

3 に答える 3

2

ディストーション シェーダーが適切に配置され、機能していると思います。これがないと、Oculus Rift で適切に収束する画像が表示されないからです。

ゲーム世界の単位の 1 つが対応する実世界の測定単位を決定する必要があります。これは、グラフィック エンジンの作成者であるあなただけが知ることができるものです。ゲーム世界のオブジェクトは、ここで手がかりを与えることができます. ゲームに車があり、そのうちの 1 台が 5.0 ゲーム ワールド ユニットの長さであるとします。これは、ゲーム世界の 1 単位が現実世界の 1 メートルに相当するという指標になります。これは、5 m の長さが (より大きな) 車の妥当な値であるためです。

ここでやらなければならないことは、プレイヤー (またはあなたの) IPD (瞳孔間距離) によって左右のビュー方向をオフセットすることです。SDK ドキュメントで概説されているように、人間の IPD は 54 mm から 72 mm の間であり、最も頻繁な値は 62 mm です。1.0 ワールド単位 ~ 1 メートルの場合、1 mm ~ 1.0 / 1000.0 = 0.001 ゲーム ワールド単位。したがって、IPD が 62 mm の場合、vec3 (0.062, 0.0, 0.0) (左目) と vec3 (-0.062, 0.0, 0.0) (右目) だけ、前方ビュー ベクトルを画面の中心に向かってシフトする必要があります。

射影行列に別のシフトを適用する必要があることに注意してください。これを行うには、射影行列に、Rift SDK によってシフトとして配信される射影オフセットを持つオフセット 行列を掛けます。これは、SDK ドキュメントでも説明されています。正しい順序で行列を乗算するようにしてください。;)

于 2013-09-21T00:09:29.913 に答える
2

2 つの画像が結合しないことによる複視効果は、モデルビュー マトリックスとは関係ありません。モデルビュー マトリックスの分離により、2 つの画像がわずかに異なるため、奥行きが感じられますが、分離がなければ、Oculus を介したビューは理想的には、非 3D モニターを見つめているのと非常によく似ているはずです。

二重に見える理由は、2 つの画像を各ビューポートの中央に配置しているためです (それぞれの目のビューを個別にレンダリングするため、左目を覆うビューポートと右目を覆うビューポートがあります) . プレイヤーの真正面にあるものが視野の中心にある場合、視聴者は常に二重に見えます。これは、各レンズがディスプレイ パネルの半分の中央に配置されていないためです。代わりに、それらは中心に向かってオフセットされています。

Rift でコンテンツを適切に表示するには、このオフセットを考慮する必要があります。これを行うにはいくつかの方法があります。最善の方法は、射影行列を変更して、錐台の中心が真正面に向かないようにすることです。これは、SDK サンプルで使用されるメソッドです。

もう 1 つの方法は、射影行列をそのままにして、代わりに各目のレンダリング ビューを画面の中心に向かって押し込むことです。これが最善のアプローチではない理由は、ビューポートの外側に押し出された画像の内部エッジの一部をトリミングすることになるからです (これは実際にはビューの問題ではなく、主にパフォーマンスの問題であり、トリミングされたピクセルをレンダリングするために、パフォーマンス予算の一部を既に費やしているためです)。また、ディスプレイの外縁にある画面の一部がまったくレンダリングされないことも意味します。これにより、レンダリングされたシーンの全体的な視野が狭くなります。

于 2013-11-26T22:43:53.467 に答える