1

私はこのチュートリアルを行いました:

http://ltslashgt.com/2011/02/28/molehill-spinning-cube/

興味深いのは、彼が perspectiveFieldOfViewLH を使用せず、代わりに独自の射影行列を定義したことです。私は3Dプログラミングが初めてなので、この射影行列の説明を読んだ後:

http://www.songho.ca/opengl/gl_projectionmatrix.html

私は本当にそれを理解しているかどうかを確認するために、独自のマトリックスを実装しようとしました:

var y2:Number = near * Math.tan(fov * Math.PI / 360);
var y1:Number = -y2;
var x1:Number = y1 * aspect;
var x2:Number = y2 * aspect;

return new Matrix3D(Vector.<Number>([
    2 * near / (x2 - x1), 0, 0, 0, //x
    0, 2 * near / (y2 - y1), 0, 0, //y
    0, 0, (far + near) / (near - far), -2 * far * near/ (far - near), //z
    0, 0, -1, 0 //w
    ]));

そして、私は黒い画面を得ました。私がしたことは、チュートリアルのマトリックスをこのマトリックスと交換することだけでした。しばらくそれで遊んでみましたが、結果はありませんでした。これは、チュートリアルのマトリックスです。

protected function perspectiveProjection(fov:Number=90,
  aspect:Number=1, near:Number=1, far:Number=2048):Matrix3D {
  var y2:Number = near * Math.tan(fov * Math.PI / 360);
  var y1:Number = -y2;
  var x1:Number = y1 * aspect;
  var x2:Number = y2 * aspect;

  var a:Number = 2 * near / (x2 - x1);
  var b:Number = 2 * near / (y2 - y1);
  var c:Number = (x2 + x1) / (x2 - x1);
  var d:Number = (y2 + y1) / (y2 - y1);
  var q:Number = -(far + near) / (far - near);
  var qn:Number = -2 * (far * near) / (far - near);

  return new Matrix3D(Vector.<Number>([
    a, 0, 0, 0,
    0, b, 0, 0,
    c, d, q, -1,
    0, 0, qn, 0
  ]));
}

1 行目と 2 行目が同じであることに注意してください。

4

1 に答える 1

0

実際には非常に良い答えがありますが、少しレベルが高すぎるかもしれません. 射影行列の仕事は、目の空間からクリップの空間に移動することです。目の空間は、目またはカメラが原点 (0,0,0) にあり、z を見下ろしている場所です。目空間の頂点は通常 (x,y,z,1) です。頂点プログラムの出力はクリップスペースにあります。それを理解する最も簡単な方法は、描画用の (x、y、z、w) クリップスペース座標で何が起こるかです。それらは、すべての座標を w (z ではありません!) で除算することによって投影されます。したがって、x スクリーン座標は x/w などですが、パースペクティブを得るには、視空間でまだ 1 である w ではなく、z または距離で割ります。したがって、射影行列の主な役割は、視点空間 z をクリップ空間 w に移動することです。他のすべてのものは、追加のスケーリングが組み込まれているだけです。これらのスケーリングの1つがバージョンで間違っているようです。おそらくz. モグラ塚では、z 出力は深度テストに使用されるもので、-1..0 の範囲です。z も w で除算されることを忘れないでください。これが、深度テストに 1/z のようなものを取得するために、チュートリアル マトリックスが z 行の w に -1 を持っている理由です。今、私はテキストの壁を書きました:)おそらく、学習のための最良のアドバイスは、4x4行列の数学に精通し、紙の変換パイプラインをたどることです.

于 2012-01-29T10:45:16.980 に答える