2017-10-03 2 views
0

が私のコードです:スケーリングされた四角形の中心座標が(1、1)座標になっていないのはなぜですか?ここで

#include <windows.h> 

#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 



void drawTriangle() 
{ 
    glBegin(GL_QUADS); 

    glColor3f(1, 0, 0); 
    glVertex2d(0.5, 0.5); 

    glColor3f(0, 1, 0); 
    glVertex2d(-0.5, 0.5); 

    glColor3f(0, 0, 1); 
    glVertex2d(-0.5, -0.5); 

    glColor3f(1, 1, 0); 
    glVertex2d(0.5, -0.5); 

    glEnd(); 
} 

void displayFunction() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 


    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    drawTriangle(); 

    glScaled(0.5, 0.5, 1.0); 
    // glRotated(30.0, 0.0, 0.0, 1.0); 
    glTranslated(1.0, 1.0, 0.0); 
    drawTriangle(); 

    glFlush(); 
} 


int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE); 
    glutInitWindowSize(400, 400); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Clipping with a plane"); 
    glutDisplayFunc(displayFunction); 

    glClearColor(0, 0, 0, 0); 

    glutMainLoop(); 
    return 0; 
} 

私は、ウィンドウの右上隅にあるように、小さな四角い・センターを参照してくださいすることが予想(1、1)座標。それはなぜそこにないのですか?

enter image description here

答えて

1

短い答え:

あなたは変換の順序を逆にする必要があり - 最初の翻訳は、スケーリング。

長い1:OpenGLで

すべての変換は、行列乗算として適用されます。たとえば、スケーリングを行うときの最初の現在のモデルビューマトリックスにスケーリング行列,を掛けたとき、の結果に変換行列が乗算されます。スケーリングが実際に座標系全体を変更するので、順序は逆でなければなりません。これは、0.5でスケーリングした後に行われる変換、つまり1.0でポイントを移動すると実際には0.5だけ移動することを意味します。変換を最初に行う場合は、ある方向に1.0になり、次に0.5でスケールします。そのような場合には実行の順序が重要であることがわかります。行列乗算の結果は、使用される行列の順序に依存します。

太陽系のような何らかの種類の階層的レンダリングの場合、OpenGLのマトリックススタックが使用されます。これを使用するには、glPushMatrixglPopMatrixという2つのルーチンを呼び出す必要があります。 glPushMatrixは、関連するスタックに使用済みのマトリックス(glMatrixModeで設定)の現在の状態を保存しますが、glPopMatrixは、現在のマトリックスに対して行われた以前の変更を上書きしてスタックからロードします。

選択したマトリックスで変換を行う前に、glLoadIndentityに電話をかけて、時間がたつにつれて積み重なるのを防ぐことも不可欠です。基本的には、現在選択されている行列を識別情報1で上書きし、適用された変換をあらかじめ取り消します。

+0

これは本当です。しかし、スケールと翻訳がどのように機能するかを説明しましょう。 'X'軸についてのみ議論しましょう。スケールするとき、頂点の 'x'座標に' Sx' - この場合は '0.5'を掛けます。そして変換するときに、 'x'座標の' Tx'を追加します - ここでは '1.0'です。それで問題は何ですか?私のコードは '0.0 * 0.5 + 1.0 = 1.0'のように動作するはずです。 – Narek

+0

'glMatrixMode(GL_MODELVIEW);'が行列スタックを設定するので、私の混乱が起こると思います。 **スタック**のように、私の操作は逆の順序で適用されます。最初の縮尺を書いてから翻訳したら、最初にスタックの変換と縮尺を取るので、予期せぬ結果が出ます。これは本当ですか? – Narek

+0

私は自分の答えを編集します。 – Matso

関連する問題