0

私は2つの関数、perspectiveLHperspectiveFieldOfViewLHについて少し混乱しています

まず、perspectiveLH で使用される行列を導出できます。

this.copyRawDataFrom(Vector.<Number>([
2.0 * zNear / width, 0.0, 0.0, 0.0,
0.0, 2.0 * zNear / height, 0.0, 0.0,
0.0, 0.0, zFar / (zFar - zNear), 1.0,
0.0, 0.0, zNear * zFar / (zNear - zFar), 0.0
 ]));

私が正しいことを理解していれば、このマトリックスを使用して、ワールド ポイント (WPx、WPy、Wpz) をCVV (正規ビュー ボリューム) に透視するか、NDC (正規化されたデバイス座標) ポイント (CPx'、CPy'、CPz') として呼び出すことができます。

しかし、マトリックスは perspectiveFieldOfViewLH で使用されます。

var yScale:Number = 1.0 / Math.tan(fieldOfViewY / 2.0);
var xScale:Number = yScale / aspectRatio;
this.copyRawDataFrom(Vector.<Number>([
xScale, 0.0, 0.0, 0.0,
0.0, yScale, 0.0, 0.0,
0.0, 0.0, zFar / (zFar - zNear), 1.0,
0.0, 0.0, (zNear * zFar) / (zNear - zFar), 0.0
 ]));

xScale と yScale の意味がわかりません。

FOV(Field Of View) でマトリックスを設定できることはわかっていますが、私の計算は 1.0 / Math.tan(fieldOfViewY / 2.0) とは異なるようです。

ここに画像の説明を入力

ここに画像の説明を入力

私の計算に関する詳細情報が必要な場合は、次のリンクを確認してください。

http://blog.csdn.net/popy007/article/details/4091967

申し訳ありませんが英語で書いていません(私が書いたものでもありません)

また、この記事のデモ コードでは

http://www.adobe.com/devnet/flashplayer/articles/perspective-projection.html

projectionTransform = new PerspectiveMatrix3D();
var aspect:Number = 4 / 3;
var zNear:Number = 0.1;
var zFar:Number = 1000;
var fov:Number = 45 * Math.PI / 180;
projectionTransform.perspectiveFieldOfViewLH(fov, aspect, zNear, zFar);
//projectionTransform.perspectiveLH(800, 600, 0.1, 1000);

perspectiveFieldOfViewLH マトリックスは正常に機能しますが、マトリックスを次のように変更すると

projectionTransform.perspectiveLH(800, 600, 0.1, 1000)

その後、グラフを取得できません

しかし、通常のパースペクティブ マトリックスまたは FOV マトリックスを使用すると、同じ結果が得られますか?

また、Stage3D レンダリング パイプラインについて少し混乱しています。これらのパースペクティブを使用すると、ワールド ポイントが CVV ポイントに変換され、変形します。

Stage3D は、ラスタライズ中に変形したグラフを通常の状態に戻しますか、それとも手動で行う必要がありますか。または、レンダリングパイプラインについて完全に間違っています。

ありがとう

4

2 に答える 2

1

ここで実際に起こっている魔法はありません。両方の関数によって作成されるマトリックスはまったく同じで、環境に最も便利なものに基づいて、異なるパラメーターを受け入れるだけです。

たとえば、「perspectiveLH」行列の 2 列目の第 2 項は次のとおりです。

2.0 * zNear / height

これは、「perspectiveFieldOfViewLH」マトリックスのそれぞれの項に等しい:

1.0 / Math.tan(fieldOfViewY / 2.0)

これら 2 つを同一視し、他のすべての既知の値で高さを解くと、次のようになります。

height = 2.0 * zNear * tan(fovY / 2) = 2.0 * 0.1 * tan(22.5) = 0.0828

これは、使用しようとしていた600ではないことに注意してください。あなたが犯した間違いは、perspectiveLH関数の幅と高さが最終ビューのピクセルではなく、代わりにローカルビュープレーンの寸法を記述していることです(zNear = 0.1)。これに気付くと、方程式height = 2.0 * zNear * tan(fovY / 2)は突然理にかなっています!

これら 2 つの関数は、実際には同じ情報の表現にすぎません。

于 2013-01-31T10:35:01.260 に答える
0

うん。Adobe のマトリックスはやや混乱します。私はそれらを使用していません。ここでそれがどのように可能かを読むことができますhttp://volgogradetzzz.blogspot.ru/2012/07/i-dont-need-flashgeommatrix3d-class.html . また、正しいマトリックスを使用した適切な説明http://msdn.microsoft.com/en-us/library/windows/desktop/bb281727(v=vs.85).aspx。変形中とはどういう意味ですか? ある順序で行列を適用します。遠近法マトリックスは最後に行きます。これは、モデル ビュー プロジェクションと呼ばれます。

于 2013-01-25T13:23:51.283 に答える