2014-09-22 38 views
0

我正在擺弄圖形,並試圖找到一種方法來繪製我正在繪製的形狀(在這種情況下爲三角形)的窗口大小。但是,我只希望寬度更新,高度保持不變。我試過用glutGet(GLUT_SCREEN_WIDTH)作爲乘數或類似的(例如(GLUT_SCREEN_WIDTH/100) - 250)到我的形狀的頂點,但我覺得我可能會錯過一個關鍵的想法。我應該將縮放操作應用於視口,而不是形狀的點?每當我調整積分時,他們似乎都不會與窗口成比例。下面的代碼。試圖縮放OpenGL程序的寬度(但不是高度)?

#define GLUT_DISABLE_ATEXIT_HACK 
#include <GL/glut.h> 
#include <GL/gl.h> 
//#include <assert.h> 

void init (void) 
{ 

glClearColor (1.0, 1.0, 0.0, 0.0); /* Set background to yellow */ 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

} 

void display(void) 
{ 

glClear (GL_COLOR_BUFFER_BIT); 

glColor3f (0.0, 0.0, 1.0); 

glBegin(GL_TRIANGLES); 

glVertex2d (0.0, 0.0); 
glVertex2d(1.0, 0.0); 
glVertex2d (0.5, 0.866); 

glEnd(); 

glFlush(); //Display immediately 

} 

void keyEscape(unsigned char key, int x, int y) 
{ 
switch (key) 
{ 
case 113: // 'Q' key for escape 
    int windowID = glutCreateWindow ("triangle"); 
    glutDestroyWindow (windowID); 
    exit (0); 
    break; 
} 

glutPostRedisplay(); 

} 

void mouseEscape(int button, int state, int x, int y) 
{ 
if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN) 
{ 

    int windowID = glutCreateWindow ("triangle"); 
    glutDestroyWindow (windowID); 
    exit (0); 

    glutPostRedisplay(); 

} 

} 

int main(int argc, char** argv) 
{ 

glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
glutInitWindowSize (250, 250); 
glutInitWindowPosition ((glutGet(GLUT_SCREEN_WIDTH)-250)/2, (glutGet(GLUT_SCREEN_HEIGHT)-250)/2); 
glutCreateWindow ("triangle"); 
init(); 

glutKeyboardFunc(keyEscape); 
glutMouseFunc(mouseEscape); 
glutDisplayFunc(display); 
glutMainLoop(); 

return 0; 

} 

回答

1
  • 步驟1:擺脫初始化功能。投影設置是繪圖過程的一部分。
  • 步驟2:使用窗口寬度爲glOrtho
  • 的左/右參數

喜歡該輸入:

void display(void) 
{ 
    int const win_width = glutGet(GLUT_WINDOW_WIDTH); 
    int const win_height = glutGet(GLUT_WINDOW_HEIGHT); 
    float const win_aspect = (float)win_width/(float)win_height; 

    glClearColor (1.0, 1.0, 0.0, 0.0); /* Set background to yellow */ 
    glClear (GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0.0, win_aspect, 0.0, 1.0, -1.0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3f (0.0, 0.0, 1.0); 

    glBegin(GL_TRIANGLES); 

    glVertex2d (0.0, 0.0); 
    glVertex2d(1.0, 0.0); 
    glVertex2d (0.5, 0.866); 

    glEnd(); 

    glFlush(); // Tell OpenGL to process what we submitted so far 
} 

順便說一句:你應該切換到一個雙緩衝模式,並使用glutSwapBuffers代替glFlush/glFinish;在某些系統上,單緩衝模式不起作用(良好)。今天唯一可靠的方法是雙緩衝。

+0

哇!感謝所有有用的,實用的建議 - 將它用作正交變量的標量做到了!會做出調整,謝謝! :) – 2014-09-22 11:35:16

相關問題