Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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#ie左上角和openGL c ie center中更改窗口窗体的原点?_C#_C_Opengl_Visual Studio 2012 - Fatal编程技术网

如何在c#ie左上角和openGL c ie center中更改窗口窗体的原点?

如何在c#ie左上角和openGL c ie center中更改窗口窗体的原点?,c#,c,opengl,visual-studio-2012,C#,C,Opengl,Visual Studio 2012,我正在使用C#创建GUI部件,以便一个接一个地绘制2D矩形的数量,并使用openGl C生成相同的3D输出。我正在使用visual studio express edition 2012进行这两项工作。我面临的问题是C#原点(0,0)是左上角,在openGl中是居中的。所以我在2D中绘制矩形时,它将从openGl的中心绘制。我曾尝试从2D获取X,Y值,并能够将其传递到3D,但由于openGl是中心原点,所以输出不符合要求 如何解决这个问题?我应该尝试更改2D c#或3D openGL的原点吗?哪

我正在使用C#创建GUI部件,以便一个接一个地绘制2D矩形的数量,并使用openGl C生成相同的3D输出。我正在使用visual studio express edition 2012进行这两项工作。我面临的问题是C#原点(0,0)是左上角,在openGl中是居中的。所以我在2D中绘制矩形时,它将从openGl的中心绘制。我曾尝试从2D获取X,Y值,并能够将其传递到3D,但由于openGl是中心原点,所以输出不符合要求

如何解决这个问题?我应该尝试更改2D c#或3D openGL的原点吗?哪一个更容易?我已经尝试了gluOrtho2D()力。Glulookat()对我来说效果很好,但不确定如何根据我的要求准确定位相机。我走的路对吗?我应该尝试更改c#原点吗

我的glorthocode,我试着只定位左上部分是ie(-x,y)


我认为,使用轴上带-1的缩放矩阵进行反转可以达到这个目的

glScale(1,-1,1);
gluOrtho2D(0,screen_width,0,screen_height);
此外,还原正交底部和顶部也可以在不缩放的情况下获得良好的效果:

gluOrtho(0,800,600,0,-1,1);
我面临的问题是在c#中,原点(0,0)位于左上角,而在openGl中,原点位于中心

实际上,在OpenGL中,您有两个来源:

  • 视口物理设备单位原点位于视口的左下角
  • 标准化设备坐标的可见XY范围为[-1…1]×[-1…1],即原点位于中心,而-1,-1位于左下角
投影矩阵用于从视图空间转换到剪辑空间,在所谓的“透视分割”(p_NDC=p_clip/p_clip.w)之后,剪辑空间成为NDC空间。如果p_clip.w=w,则clip坐标为NDC坐标

也就是说,您需要创建一个映射,将给定的坐标范围放置在视口中,并在某些角/边处使用特定坐标
glOrtho(左、右、上、下、近、远)
执行此操作。gluOrtho2D可能是最不有用的函数,因为
gluOrtho2D(l,r,b,t)=glOrtho(l,r,b,t,-1,1)

每个参数都指定在给定边上结束的视图空间坐标

因此,让我们假设如下:

glOrtho(
    -3 /* = left   */,
    -5 /* = right  */,
     4 /* = bottom */,
     3 /* = top    */,
    -1 /* = near   */,
     1 /* = far    */);
这意味着坐标(-3,4)在左下角结束,-5,3)在右上角结束。我想你能看到这是怎么回事。假设您希望原点位于左上角,因此top=0,bottom=0;这样就可以选择底部和右侧的坐标,以便与您的需要相匹配。假设您希望视图空间与视口像素坐标匹配,则底部=视口高度,右侧=视口宽度

glOrtho(0, viewport_height, 0, viewport_width, -1, 1);
然而,由于OpenGL矩阵操作发生在适当的位置,并且可以处理矩阵堆栈上已经存在的任何内容,如果您在看到奇怪的事情发生之前只调用glOrtho而不准备干净的状态。因此,使用固定功能管道OpenGL绘制像素放置的2D图形的典型前言是:

glViewport(0, 0, viewport_width, viewport_height);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, viewport_height, 0, viewport_width, -1, 1);

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

draw_2D_pixel_dimensioned_stuff();

glMatrixMode(GL_MODELVIEW);
glPopMatrix();

glMatrixMode(GL_PROJECTION);
glPopMatrix();

我应该在c#或openGl代码中这样做吗?我应该在哪里写这个?在openGl代码中,当你渲染你的界面时,在任何模型矩阵操作之前,你对当前矩阵应用这个缩放。对不起,我已经做了测试,你必须在应用gluOtrho(0800,0600)之前进行缩放
glViewport(0, 0, viewport_width, viewport_height);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, viewport_height, 0, viewport_width, -1, 1);

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

draw_2D_pixel_dimensioned_stuff();

glMatrixMode(GL_MODELVIEW);
glPopMatrix();

glMatrixMode(GL_PROJECTION);
glPopMatrix();