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

时间:2011-03-20 14:31:45

标签: c# opengl

    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 个答案:

答案 0 :(得分:2)

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();

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