如何在c#ie左上角和openGL c ie center中更改窗口窗体的原点?
我正在使用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)如何在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的原点吗?哪
我认为,使用轴上带-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位于左下角
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();