Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenGL:如何将世界坐标转换为屏幕坐标?_C#_Opengl - Fatal编程技术网

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

C# OpenGL:如何将世界坐标转换为屏幕坐标?,c#,opengl,C#,Opengl,这是使用世界坐标系,现在我想使用像素的屏幕位置。怎么做?非常感谢您的帮助OpenGL没有“世界”坐标系。它有modelview空间,该空间由modelview矩阵转换,它有剪辑空间,剪辑空间由modelview空间通过投影矩阵转换而来。剪辑空间为[-1,1]^3,并映射到视口和Z缓冲区深度范围 因此,您需要做的是,定义一系列转换,通过标识转换将modelview坐标映射到视口坐标(对于Z来说,它不起作用)。从剪辑空间到视口的变换是固定的。因此,您希望使用投影来执行此操作,将modelview保留

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

OpenGL没有“世界”坐标系。它有modelview空间,该空间由modelview矩阵转换,它有剪辑空间,剪辑空间由modelview空间通过投影矩阵转换而来。剪辑空间为[-1,1]^3,并映射到视口和Z缓冲区深度范围

因此,您需要做的是,定义一系列转换,通过标识转换将modelview坐标映射到视口坐标(对于Z来说,它不起作用)。从剪辑空间到视口的变换是固定的。因此,您希望使用投影来执行此操作,将modelview保留为标识转换:

这就是诀窍:

    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();
将它放在视口像素空间中发生的每一组绘图命令的前面

glViewport(x, y, width, height);

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

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();