7

遠近法カメラ マトリックスを使用して、一連の 3D ポイントを画面に投影しようとしています。私はワールド空間を持っていません (またはそれを恒等行列と見なします)、私のカメラにはカメラ空間がありません (またはそれを恒等行列と見なします)。私はオブジェクト空間に 4x4 行列を持っています。

オブジェクト マトリックスを取得し、次のメソッドで生成されたカメラ パースペクティブ マトリックスを掛けています。

Matrix4 createPerspectiveMatrix( Float fov, Float aspect, Float near, Float far )
{
    Float fov2 = (fov/2) * (Math.PI/180);
    Float tan = Math.tan(fov2);
    Float f = 1 / tan;

    return new Matrix4 ( 
        f/aspect, 0, 0, 0,
        0, f, 0, 0,
        0, 0, -((near+far)/(near-far)), (2*far*near)/(near-far),
        0, 0, 1, 0 
    );
}

次に、ポイント [x, y, z, 1] を取得し、それを遠近行列とオブジェクト行列の結果の乗算で乗算します。

次の部分は私が混乱している場所です.-1と1、または0と1の範囲内でこれらのポイントを取得する必要があると確信しています.最初の値のセットがある場合、次に、画面座標の x 値と y 値の画面の幅と高さをそれぞれポイントに掛けるか、値に画面の高さ/2 と幅/2 を掛けて、同じ値をそれぞれのポイントに追加します。

これがどのように達成されるか、またはこれのどこで間違っている可能性があるかを段階的に教えていただければ、非常に高く評価されます!! :D

皆さん、よろしくお願いします!

PS恒等/変換マトリックスの例では、私のモデルのマトリックス形式は次のとおりです。

[1, 0, 0, tx,
 0, 1, 0, ty,
 0, 0, 1, tz,
 0, 0, 0, 1 ]
4

2 に答える 2

7

問題は、パースペクティブ分割を実行するのを忘れていることです。

パースペクティブ分割とは、ポイントの x、y、および z コンポーネントをその w コンポーネントで分割することを意味します。これは、各コンポーネント x、y、または z が -1 と 1、または 0 と 1 の間にあるHomogeneous 4D SpaceからNormalized Device Coordinates System (NDCS) にポイントを変換するために必要です。

この変換の後、ビューポートの変換を行うことができます (画面の幅、高さなどでポイントを掛けます)。

Foley の著書 (Computer Graphics: Principles and Practice in C) には、この変換パイプラインがよく示されています。ここで確認できます。

http://www.ugrad.cs.ubc.ca/~cs314/notes/pipeline.html

于 2010-09-09T20:28:32.540 に答える
4

このような質問については、優れたリソースをお勧めし ます 。これらは、カメラ、カメラ レイの構築などのトピックに関する追加のレッスンです。掘り下げる必要があります。

于 2013-09-22T22:49:49.330 に答える