0

いくつかの階層的に並べられたオブジェクトをレンダリングしていますが、そのほとんどは親の相対座標系のみを認識しています。

room()
{
    glPushMatrix();
    glMultMatrix(...);

    glBegin();
    ...
    glEnd();

    box();
    glPopMatrix();
}

box()
{
    glPushMatrix();
    glMultMatrix(...);

    glBegin();
    ...
    glEnd();

    line();
    glPopMatrix();
}

line()
{
    glPushMatrix();
    glMultMatrix(...);

    lineEntitiy();
    //mirror with respect to a global plane
    lineEntity();

    glPopMatrix();
}

lineEntity()
{
    glBegin();
    ...
    glEnd();
}

これらのオブジェクトの 1 つ (この例では ) を既知のグローバル プレーンにミラーリングしlineますlineEntity。どうすればいいですか?

4

2 に答える 2

0

理想的には、OpenGLのマトリックススタックの使用を停止することによって。それを使用した深刻なプログラムはありません。ほとんどの場合、独自の行列計算を実行し、最終結果をglLoadMatrixでロードするか、最新のOpenGLプログラムではマトリックスユニフォームにロードします。一般に信じられていることとは反対に、OpenGL行列関数はGPUで高速化されることはなく、今後もそうなることはありません。

固定関数OpenGLのマトリックススタックに縛られないことにより、変換階層の任意のステップを利用して、ミラー変換などの他の変換を挿入できます。

于 2013-03-15T13:11:15.503 に答える
0

これは、古い/非推奨のGL行列関数を使用していなかった場合に、行列が変換するスペースを正確に制御できるため、おそらく簡単になることの1つです。

ただし、原則は同じです。

現在のモデル変換行列に、問題の平面について反映する行列を事前に乗算します。飛行機は適切なスペースにある必要があるため、(古いGLスキームで従来のように)ビューとモデルの両方のマトリックスを連結している場合は、カメラの変換を考慮する必要があります。

だからあなたが持っているものは次のようなものです:

Matrix = View * Model

そして、あなたは必要です:

Matrix' = View * Reflect * Model

したがって、これらの変換を分離するか、次のようなことを行う必要があります。

Matrix' = (View * Reflect * InverseView) * (View * Model)

この後半部分は現在のModelViewマトリックスであり、前半部分は現在のビューの定数です。真ん中のInverseView * View部分がキャンセルされ、正しい変換が行われます。ただし、これには、行列の反転など、効果的に冗長な計算が含まれ、独自の行列演算を実行して必要な変換を直接生成する方がよい理由を示すことができれば幸いです。

于 2013-03-15T13:11:31.260 に答える