2014-09-22 70 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

相关问题