opengl - OpenGL 的坐标系是如何工作的?

标签 opengl glut

这可能是一个非常基本的问题,但我似乎无法让 OpenGL 使用点坐标系。相反,它似乎以百分比表示,例如 .99 表示我正好在屏幕边缘。这是怎么回事,还是我做错了什么?谢谢!

使用的代码:

#include <iostream>
#include <stdlib.h>
#include <GLUT/GLUT.h>

void RenderScene()
{
    glLoadIdentity (); 
    glClear(GL_COLOR_BUFFER_BIT);

    glBegin( GL_POINTS );  

        glVertex3f( 0, 0, 0 );

    glEnd();


    glFlush();  
}

int main(int argc, char **argv)
{
    glutInit( &argc, argv );                
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );        
    glutInitWindowSize( 600, 600 );        
    glutCreateWindow( "OpenGL" );   
    glutDisplayFunc( RenderScene );
    glutMainLoop();
    return 0;
}

最佳答案

OpenGL 以下列方式工作:您从一个局部坐标系(任意单位)开始。该坐标系通过模型- View 矩阵转换为所谓的眼睛空间坐标(它被称为模型- View 矩阵,因为它结合了模型和 View 转换)。

然后通过投影矩阵将眼睛空间转换为裁剪空间,紧接着进行透视划分以获得归一化设备坐标(NDC{x,y,z} = Clip{x,y,z}/Clip_w)。 NDC 空间中的 [-1,1]^3 范围映射到视口(viewport)(x 和 y)和设置的深度范围(z)。

因此,如果您保留变换矩阵(模型 View 投影)身份,那么坐标范围 [-1,1] 确实会映射到视口(viewport)。然而,通过选择适当的变换和投影,您可以任意地将模型空间单位映射到视口(viewport)单位。

关于opengl - OpenGL 的坐标系是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7769371/

相关文章:

c++ - 谁能帮我让 glutBitmapString 工作?

macos - OpenGL - glDeleteTextures 实际上做了什么?

opengl - FreeType2 多个字符和随机颜色

OpenGL 窗口系统屏幕撕裂预防

macos - 如何在 Mac 上运行的 glut 程序中检测命令键作为修饰符?

c++ - OpenGL,如何设置GLSL版本?

OpenGL 3.0 帧缓冲区输出到附件而无需我指定?

memory - 确定可用的视频内存

c - linux 和 windows 速度不匹配

c++ - 在使用 GLUT 时避免使用全局变量