1

視錐台に 256x256 のテクスチャがあり、テクスチャが実際のサイズで画面上に複製される z 位置に移動する必要があります。

私がこれまでに持っているものは次のとおりです。

    const float zForTrueScale = -((itemSize/2) / tanf(DEGREES_TO_RADIANS(fieldOfView/2)) ) * 2;     

ここで、itemSize はワールド空間でのテクスチャのサイズ (2.0 単位) です。これは、itemSize/2 (反対側) が 1.0 の場合に、Z (隣接) が何であるかを計算するためのものです。これはうまくいくと思いました。

この式は、使用する FOV に関係なく、テクスチャが一貫して約 10% 小さすぎることを示しています。

ありがとう

編集: 3D 空間で画像を移動していますが、正しい z 距離へのシームレスな移行が必要です。正角投影は使用できません。視錐台に配置する必要があります。

4

4 に答える 4

6

必要な情報が射影行列に直接保持されているため、視野をいじるよりも簡単にこれを行うことができます。

したがって、射影行列は次のようになります。

xScale     0               0                     0
0        yScale            0                     0
0          0     -(zf + zn)/(zf - zn)  -(2 * zf) / (zf-zn) 
0          0              -1                     0

z-Far (zf) と z-Near (zn) の xScale と yScale は既知です。

正しい Z 深度を選択するには、w が最終的に 1 になることを確認することから始めます。このように、w で割っても何も変わりません。

幸いなことに、w は非常に簡単に取得できます。これは単に入力 z の負の値です。したがって、z に -1 を入力すると、1 の aw が返されます。

1024x768 の解像度を使用しており、適切なスケールで必要なテクスチャは 256x256 であると仮定します。

さらに、長方形は左上が -1, 1 の位置にあり、右下が 1, -1 の位置に設定されていると仮定します。

それでは、これらを接続して z を計算してみましょう。

以下を使用する場合:

-1, 1, -1, 1
1, -1, -1, 1

次のように何かを取得します。

1 / xScale, -1 / yScale, someZThatIsn'tImportant, 1
-1 / xScale, 1 / yScale, someZThatIsn'tImportant, 1

ビューポート変換は、-1、1 が 0、0 および 1、-1 が 1024,768 になるようにこれらの値を変換します。

したがって、 ((x + 1) / 2) * 1024 および ((1 - y) / 2) * 768 を実行することで機能することがわかります

したがって、xScale が 3/4 で yScale が 1 であると仮定すると、それを差し込むと次のようになることがわかります。

左上の場合:

x = -3/4
=> ((-3/4 + 1) / 2) * 1024
=> 128
y = 1
=> ((1 - 1) / 2) * 768
=> 0

右下の場合:

x = 3/4
=> ((3/4 + 1) / 2) * 1024
=> 896
y = -1
=> ((1 + 1) / 2) * 768
=> 768

したがって、画面の中央に 768x768 ピクセルの画像があることがわかります。明らかに 256x256 を取得するには、w を 3 にする必要があります。これにより、w 除算後の座標がサイズの 3 分の 1 になります ((xScale * 1024) / 256 は、(yScale * 768) / 256 に等しい必要があります)。投影。

したがって、最終的な座標が次のようになっているとします。

-1, 1, -3, 1
and
1, -1, -3, 1

(w-divide の後) 以下を取得します。

-0.25, 0.333, unimportantZ, 1
and
0.25, -0.333, unimportantZ, 1

上記のスクリーン式を実行すると、次のようになります。

左上の場合:

x = -0.25
=> ((-0.25 + 1) / 2) * 1024
=> 384
y = 0.3333
=> ((1 - 0.3333) / 2) * 768
=> 256

右下の場合:

x = 0.25
=> ((0.25 + 1) / 2) * 1024
=> 640
y = -0.333
=> ((1 + 0.33333) / 2) * 768
=> 512

640 - 384 = 256
512 - 256 = 256

したがって、正しいピクセルサイズで最終的な四角形が得られます...

于 2010-01-21T09:55:27.723 に答える
2

状況についてあまり知らなくても、正射影を射影行列スタックにプッシュし、テクスチャを描画してから、再びポップする方がほぼ確実に簡単です。

于 2010-01-20T11:39:13.487 に答える
0

遅くはなりますが、そのまま使用glDrawPixels()して完了できます。

...ただし、パフォーマンスが重要な場合はそうではありません!

于 2010-01-20T11:40:26.883 に答える
0

あなたのフレームバッファは正方形ですか?

そうでない場合は、水平方向の視野と垂直方向の視野があります。正しいものを使用していますか?また、ワールド座標で 2.0 単位にすることをどのようにして確実に知ることができますか? 最終目標がそれをピクセルにマッピングすることである場合は、ビューポートを考慮に入れ、そこから作業を進める必要があります。

また、*2 がどこから来ているのかわからないという Pike65 にも同意します。

于 2010-01-20T12:28:40.860 に答える