1

投影行列からズーム率を計算しようとしています。次のコードは、画像が回転しない限り機能します。

void UpdateZoomPercent()
{
    var zoom = _projMatrix.M11 * glControl.Width / 2; // M11 is the top left value
    lblZoomPercent.Text = (zoom * 100).ToString("G3") + "%";
}

基本的に、X スケールを取り、それをビューポートに乗算します。X と Y は常に比例してスケーリングされるため、Y を見る必要はありません。私のシーンは 2D です。

回転を考慮するにはどうすればよいですか?

4

1 に答える 1

2

デカルト座標系のベースを形成する実数値の行列を考えてみましょう。各列は基本ベクトルを表します。等尺性ズームの場合、すべての基本ベクトルの長さは同じです。C(M、n)が行列Mのn番目の列ベクトル、つまりC(M、n)= M_n、jを表すとすると、等尺性ズームの場合はlen(C(M、0))= len( C(M、1))= len(C(M、…))、ここでlen(v)= sqrt(v・v)

異方性スケーリングの場合、ベースベクトルの長さが異なります。これは、この状況を検出するために使用できるものです。

コンピュータグラフィックスでは、遭遇する行列は均質であり、単一の行列がそれらが表す空間内のすべての可能な変換を表すことができます。同種行列にはN+1の行と列があり、Nはそれらによって表される座標空間の次元数です。慣例により(少なくともすべての一般的なコンピュータグラフィックソフトウェアでは)左上の部分(つまり、1…Nのiとj、1ベースのインデックス)がベースベクトルを形成し、N番目の列と行が同種の部分を形成します。

したがって、OpenGLの場合、左上の3×3部分行列を座標ベースベクトルとして見ることになります。また、OpenGLは列の主要な順序にインデックスを付けるため、OpenGLから取得したものを並べ替える必要はありません。

于 2013-03-09T20:07:00.253 に答える