0

私は OpenGL を使用しており、画像を反転したいと考えていました。だから私はここに行き、質問をしました、そして最終的に私は次のコードを持っていました:

    glMatrixMode(GL_PROJECTION);
    glScalef(-1,1,1);
    glTranslatef(-width(),0,0);

これから私が理解していることから、すべてのピクセルの位置が反転するため、画像の右側にあったピクセルは同じ絶対位置になりましたが、画像の左側にあるため、全体を移動する必要がありますwidth: 360 (これは「キャンバス」のサイズであるため、スニペントでは関数width()が使用されています) と正確に同じ数のピクセルが返されます。したがって、このプロセスを元に戻すには、画像をもう一度反転してから元の場所に戻します。

    glMatrixMode(GL_PROJECTION);
    glScalef(-1,1,1);
    glTranslatef(width(),0,0);

いいえ、ブラックスクリーン。反転を元に戻すには、まったく同じことを 2 回行う必要があります。画像を反転するたびに、-360 で移動する必要があります。なんで?

4

1 に答える 1

1

Daniel Fischer がコメントで述べたとおりです。これがプロセスの図です。

変換は、変換された座標系で行われることに注意してください。

画面 (緑色) 上の画像 (灰色) から始めます。

F1

次に、画像をスケーリングします。したがって、原点は保持されますが、x 軸はミラーリングされます。

F2

いいえ、画像を再度画面に移動する必要があります。x 軸が左を指しているため (ただし、画像を右に移動したい場合)、平行移動に負のオフセットを使用する必要があります。

F3

画像をもう一度反転すると、次のことが起こります。原点は保持され、x 軸はミラーリングされます。

F4

したがって、画像を負のオフセットで変換する必要があります。

F5

反転を元に戻す別の方法は、操作を元に戻すことです (ただし、逆の順序で):

glTranslatef(width, 0, 0);
glScalef(-1,1,1);

その数学的な理由は、反転が順序を逆にすることです。Matrix がある場合A = B * CA^-1 = (C^-1 * B^-1).

于 2013-07-30T14:39:32.177 に答える