2

囲んでいるウィンドウの寸法に対して線の長さを描く方法を知りたいです。GLUT と OpenGL の組み合わせを使用していることに注意してください。

たとえば、画面の下部中央から線を引きたいとします (これは座標 (WINDOW_LENGTH/2, 0) でウィンドウの中央 (WINDOW_LENGTH/2, WINDOW_HEIGHT/2) にあると仮定します)。

OpenGLでこれを行うにはどうすればよいですか? 現在、私は次のものを持っています:

//Initializes 3D rendering                                                                                                                                                  
void initRendering() {
        //Makes 3D drawing work when something is in front of something else                                                                                                
        glEnable(GL_DEPTH_TEST);
}

//Called when the window is resized                                                                                                                                         
void handleResize(int w, int h) {
        glViewport(0, 0, w, h);
        glMatrixMode(GL_PROJECTION); //Switch to setting the camera perspective                                                                                             
        //Set the camera perspective                                                                                                                                        
        glLoadIdentity(); //                                                                                                                                                
        gluPerspective(45.0, (double)w / (double)h, 1.0, 200.0);
}

//Draws the 3D scene                                                                                                                                                        
void drawScene() {
        //Clear information from last draw                                                                                                                                  
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective                                                                                                     
        glLoadIdentity(); //Reset the drawing perspective                                                                                                                   
        glTranslatef(0, 0, -1);

        glBegin(GL_LINES);
        //lines                                                                                                                                                             
        glVertex2f(0, 0);
        glVertex2f(0, .25);
        glEnd();
glutSwapBuffers(); //Send the 3D scene to the screen                                                                                                                
}

int main(int argc, char** argv) {
        //Initialize GLUT                                                                                                                                                   
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
        glutInitWindowSize(400, 400); //Set the window size                                                                                                                 

        //Create the window                                                                                                                                                 
        glutCreateWindow("Basic Shapes - videotutorialsrock.com");
        initRendering(); //Initialize rendering                                                                                                                             

        //Set handler functions for drawing, keypresses, and window resizes                                                                                                 
        glutDisplayFunc(drawScene);
        //glutKeyboardFunc(handleKeypress);                                                                                                                                 
        glutReshapeFunc(handleResize);

        cout << "GLUT_WINDOW_X: " << GLUT_WINDOW_X << endl;
        cout << "GlUT_WINDOW_Y: " << GLUT_WINDOW_Y << endl;

        glutMainLoop(); //Start the main loop.  glutMainLoop doesn't return.                                                                                                
        return 0; //This line is never reached                                                                                                                              
}

これにより、次の結果が得られます。ここに画像の説明を入力

私にとって意味をなさないのは、ウィンドウの寸法が 400 X 400 であるのに、座標:glVertex2f(0, 0)glVertex2f(0, .25). ウィンドウのほぼ中央からウィンドウの高さの約 80% まで線を引きます。私はいくつかの推測を持っています:

glTranslatef(0, 0, -1);への呼び出しが原点をグローバル座標に設定することはわかってい(0, 0, -1)ます。

  1. -1 は、画像をそこまで移動することにどのように対応していますか?
  2. .252 番目の座標の は高さの 25% に相当しますか?
  3. (WINDOW_LENGTH/2, 0) から (WINDOW_LENGTH/2, WINDOW_HEIGHT/2) までの線を引くコードはどのようになりますか。これは、ウィンドウの下部中央からウィンドウの中央までの線です。

さらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

あなたの質問に答えてみましょう:

  1. モデル ビュー (ワールドからビュー) システムで作業しています。したがって、ワールド座標でモデリングを開始し、それをビュー座標に変換します。したがって、glTranslatef は、ワールド 1 座標ポイントをカメラから遠ざけます。

  2. openGL で行うことは、Windows 座標とはあまり関係がありません。したがって、0.25 は実際には openGL に対する 0.25 を意味し、それ以上の意味はありません。これは、メートル、キロメートル、ミリメートルなどのポイントに対するセマンティクスを確立できることを意味します。openGL バッファーと Windows 座標の相関関係は、関数 gluPerspective で確立されています。この関数では、基本的に、Windows 座標系にマップする必要がある世界の領域が示されています。2 番目の関数 glViewport は、このマップが Windows 座標にどのように変換されるかを示すだけです。あなたの場合、すべてのウィンドウを使用するように指示しています。

  3. 前に述べたように、gluPerspective を操作して、openGL の世界が Windows 座標にどの程度マップされるかを制御する必要があります。そのためには、視点の角度を変更します。角度が大きいほど、より多くの openGL 領域がマップされ、ズームアウトの効果が得られます。角度が小さいほど、マッピングされる openGL 領域が少なくなり、ズームインの効果が得られます

于 2013-08-04T00:40:52.410 に答える