OpenGL 中的可视化问题(glOrtho 和投影)

Posted

技术标签:

【中文标题】OpenGL 中的可视化问题(glOrtho 和投影)【英文标题】:Visualization Issue in OpenGL (glOrtho & projection) 【发布时间】:2016-11-09 08:51:58 【问题描述】:

我不知道我是否在我的函数中做错了什么(可能是 glOrtho 的参数错误),所以结果是错误的,或者一切正常。

特别是我有这种情况:

我想让绿色矩形及其所有内部内容占据窗口的所有空间,而不仅仅是它的一部分(如果您注意到主要内容周围有一些空白:“绿色矩形")。

这是我的主要功能:

#define HEXAGONAL_SHRINK 0.8655f

int main(int argc, char** argv)

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(argv[0]);
    glClearColor (0.0, 0.0, 0.0, 0.0);
    glShadeModel (GL_FLAT);
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMouseFunc(mouse);
    glutMainLoop();
    return 0;


void reshape(int w, int h)

    GLfloat aspect, dim;

    glViewport (0, 0, (GLsizei) w, (GLsizei) h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (s3hex->rows > s3hex->columns)
          dim = s3hex->rows * 0.5f; 
        else 
          dim = s3hex->columns * 0.5f;
    aspect = (GLfloat)w / (GLfloat)h;
    if (w <= h)
        glOrtho (-dim, dim, -dim/aspect, dim/aspect, 1.0, -1.0);
    else
        glOrtho (-dim*aspect, dim*aspect, -dim, dim, 1.0, -1.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


void display(void)

    CALint i, j;
    CALreal z, h, color;

    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();

    glTranslatef(-(s3hex->columns*HEXAGONAL_SHRINK)/2.0f, s3hex->rows/2.0f, 0);
    glScalef(HEXAGONAL_SHRINK, -1, 1);

    for (i=0; i<s3hex->rows; i++)
        for (j=0; j<s3hex->columns; j++)
        
            z = calGet2Dr(s3hex,Q.z,i,j);
            h = calGet2Dr(s3hex,Q.h,i,j);

            if (h > 0)
            
                color = (h - h_min) / (h_Max - h_min);
                glColor3d(1,color,0);
                glRecti(j, i, j+1, i+1);
            
            else
                if (z > 0)
                
                    color = (z - z_min) / (z_Max - z_min);
                    glColor3d(color,color,color);
                    glRecti(j, i, j+1, i+1);
                
        

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glColor3d(0,1,0);
    glRectd(0,0,s3hex->columns, s3hex->rows);
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

    glPopMatrix();

    glutSwapBuffers();

P.S:如果您需要知道什么是 s3hex,那么您可以将其视为一个普通矩阵,其中每个单元格都包含一组子状态。然后根据这些子状态的值在显示函数中设置渲染的颜色。

【问题讨论】:

【参考方案1】:

在我看来一切都很正常。 无法保证 s3hex-&gt;columnss3hex-&gt;rows 与您的视口大小匹配。

您可以做的是放大模型视图以使绘图填满您的视口。

类似的东西:

glScalef(viewportWidth / s3hex->columns, viewportHeight / s3hex->rows, 1);

如果s3hex-&gt;columnss3hex-&gt;rows 为零,请不要这样做。

【讨论】:

好的,我想我明白了,非常感谢! P.S:您知道每次调用 reshape 函数时是否有任何方法可以获取绿色矩形(我的意思是 4 个顶点)的像素坐标?再次感谢。 您可以做 OpenGL 所做的事情:将矩阵与顶点相乘以获得投影屏幕坐标。喜欢:screenCoord = viewportMatrix * projectionMatrix * modelViewMatrix * vertex.

以上是关于OpenGL 中的可视化问题(glOrtho 和投影)的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL glOrtho 设置匹配窗口大小

opengl中对glOrtho()函数的理解

opengl:设置视口和 glortho 时遇到问题

openGL中glOrtho和glViewPort之间的区别[重复]

OpenGL投影缩放

我的 glOrtho 怎么了?负零而不是零