如何改变窗口窗体的原点在c# ie左上角和openglcie中心

本文关键字:ie 左上角 中心 openglcie 原点 何改变 改变 窗体 窗口 | 更新日期: 2023-09-27 17:52:11

我使用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() dint对我来说很好。和glulook()来定位相机,但不确定如何根据我的要求准确地定位相机。我走的路对吗?我应该尝试改变c#起源吗?

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

 gluOrtho2D(-0.1,0,0,0.1);

如何改变窗口窗体的原点在c# ie左上角和openglcie中心

我面临的问题是,在c#中原点(0,0)是左上角,而在openGl中它是居中的。

实际上在OpenGL中你有两个起源:

  • 视口物理设备单位原点位于视口左下方
  • 归一化设备坐标,可见XY范围为[-1…1]×[-1…1],即原点位于中心,-1,-1位于左下角

投影矩阵用于从视图空间到剪辑空间的变换,经过所谓的"透视分割"(p_NDC = p_clip/p_clip.w)后成为NDC空间。如果p_clip。w = w则剪辑坐标为NDC坐标

话虽这么说,你想要的是创建一个映射,在视口中放置一个给定的坐标范围,在特定的角落/边缘有特定的坐标。glOrtho(left, right, top, bottom, near, far)就是这样。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;这样就可以选择底部和右侧的坐标,以便与您的需求匹配。让我们假设你想让你的视图空间匹配viewport像素坐标,然后bottom = viewport_height, right = viewport_width。

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

使用斧头上的缩放矩阵-1来反转将会达到我认为的效果

glScale(1,-1,1);
gluOrtho2D(0,screen_width,0,screen_height);

也可以在不缩放的情况下恢复正正交的底部和顶部,得到很好的结果:

gluOrtho(0,800,600,0,-1,1);