OpenGL:如何将世界坐标转换为屏幕坐标?

Posted

技术标签:

【中文标题】OpenGL:如何将世界坐标转换为屏幕坐标?【英文标题】:OpenGL: How to convert world coordinate to screen coordinate? 【发布时间】:2011-03-20 14:31:45 【问题描述】:
    GL.LoadIdentity();
    GL.Translate(0f, 0f,-1f);

    GL.Begin(BeginMode.Quads);
    GL.Color4(1f, 0f, 0f, 1f);

    GL.Vertex3(-1.0f, 1.0f,0);              
    GL.Vertex3(1.0f, 1.0f,0);               
    GL.Vertex3(1.0f, -1.0f,0);              
    GL.Vertex3(-1.0f, -1.0f,0);             
    GL.End();

这是使用世界坐标系,现在我想使用以像素为单位的屏幕位置。怎么做?非常感谢您的帮助

【问题讨论】:

【参考方案1】:

OpenGL 没有“世界”坐标系。它具有由模型视图矩阵转换的模型视图空间,并具有从模型视图空间通过投影矩阵对其进行转换的剪辑空间。剪辑空间为 [-1, 1]^3,它映射到视口和 Z 缓冲区深度范围。

因此,您需要做的是,定义一系列转换,通过恒等转换将模型视图坐标映射到视口坐标(当然它不适用于 Z)。从剪辑空间到视口的转换是固定的。所以你想使用投影来做到这一点,给模型视图留下一个恒等变换:

这就是诀窍:

glViewport(x, y, width, height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, 0, height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

将它放在视口像素空间中发生的每组绘图命令之前。

【讨论】:

以上是关于OpenGL:如何将世界坐标转换为屏幕坐标?的主要内容,如果未能解决你的问题,请参考以下文章

Unity中的坐标系--屏幕转世界坐标

将窗口坐标转换为屏幕坐标??

将图像从屏幕坐标转换为世界坐标

OpenGL中各种坐标系的理解[转]

屏幕坐标和当前窗口坐标如何转换???

我的OpenGL学习进阶之旅OpenGL的坐标系的学习笔记