gpt4 book ai didi

c++ - 尝试使用宽度(但不是高度)缩放 OpenGL 程序?

转载 作者:行者123 更新时间:2023-11-28 06:40:56 24 4
gpt4 key购买 nike

我正在摆弄图形,并试图找到一种方法使我正在绘制的形状(在本例中为三角形)随窗口大小缩放。但是,我只希望宽度更新,高度保持不变。

我做了一些研究,并尝试使用 glutGet(GLUT_SCREEN_WIDTH) 作为乘数或类似的(例如 (GLUT_SCREEN_WIDTH/100) - 250)到我的形状的顶点,但我觉得我可能遗漏了一个关键想法。我应该改为将缩放操作应用于视口(viewport),而不是形状的点吗?每当我缩放点时,它们似乎都不会随窗口缩放。代码如下。

#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 步:摆脱 Init 函数。投影设置是绘图过程的一部分。
  • 第 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;在某些系统上,单缓冲模式不起作用(很好)。今天唯一可靠的方法是双缓冲。

关于c++ - 尝试使用宽度(但不是高度)缩放 OpenGL 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25972173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com