使用C#在OpenGL中使用Projection?

时间:2011-10-10 19:18:36

标签: c# opengl projection tao-framework

对于那些不知道的人,Tao.opengl,Tao.freeglut是C#控制台应用程序所必需的。

现在,对于我的问题:我的导师要求我们绘制4个矩形,所以我成功地绘制了它们。

并复制/粘贴其他代码(由于时间不足,我们的导师没有解释)

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;

namespace Homework_1
{
    class Triangles
    {
        static void display()
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            Gl.glColor3f(1.0f,1.0f,1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.0f,-1.0f,0.0f);
            Gl.glVertex3f(1.0f, -1.0f, 0.0f);
            Gl.glVertex3f(1.0f, 1.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 1.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(2.0f, -1.0f, 0.0f);
            Gl.glVertex3f(4.0f, -1.0f, 0.0f);
            Gl.glVertex3f(4.0f, 1.0f, 0.0f);
            Gl.glVertex3f(2.0f, 1.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(2.0f, 2.0f, 0.0f);
            Gl.glVertex3f(4.0f, 2.0f, 0.0f);
            Gl.glVertex3f(4.0f, 4.0f, 0.0f);
            Gl.glVertex3f(2.0f, 4.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.0f, 2.0f, 0.0f);
            Gl.glVertex3f(1.0f, 2.0f, 0.0f);
            Gl.glVertex3f(1.0f, 4.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 4.0f, 0.0f);
            Gl.glEnd();


            Gl.glFlush();

        }

        static void init()
        {

            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
        }

        public static void Main(String[] argv)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
            Glut.glutInitWindowSize(1000, 1000);
            Glut.glutInitWindowPosition(100, 100);
            Glut.glutCreateWindow("hello");
            init();
            Glut.glutDisplayFunc(display);
            Glut.glutMainLoop();
        }
    }
}

运行应用程序时,显示的只是白色,所以我100%确定错误是在我复制和粘贴的init()方法内,行

 Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

我100%肯定Gl.glOrtho的值必须改变,但问题是,我不知道如何使用它。

请更正我的错误,因此它可以显示我绘制的4个三角形,并且一个小的解释会使它更明显和可接受。

2 个答案:

答案 0 :(得分:1)

简单地说,glOrtho电话通常会决定您所看到的世界区域。因此,在您的情况下,您只能看到[0,1] -square,它完全由第一个(白色)多边形(即[-1,1] -square)覆盖。因此,要查看所有多边形,您应该使用例如

glOrtho(-1.0, 4.0, -1.0, 4.0, -1.0, 1.0);  //or maybe with some margin of +/- 0.1

当您使用非身份或透视投影(而不是正交投影)的模型视图矩阵时,这一切都变得更加困难。我建议你多看一下OpenGL的转换管道,以获得更多的洞察力。也许this question的答案有助于此。

您似乎也忘记拨打

glViewport(0, 0, 1000, 1000);

确定渲染视图的帧缓冲区域,其范围通常应与窗口的范围匹配。默认情况下,上下文的视口与其附加的窗口大小相匹配,但最好明确设置视口,尤其是在调整窗口大小时,因为视口不会自动更新。

顺便说一句,如果每个多边形的颜色都相同,则不需要为每个多边形设置颜色,因为 OpenGL是状态机

答案 1 :(得分:1)

glVertex3如此弃用,你的老师甚至不应该承认它的存在,但很好。

void glOrtho(GLdouble   left,
             GLdouble   right,
             GLdouble   bottom,
             GLdouble   top,
             GLdouble   nearVal,
             GLdouble   farVal);

前两个参数指定左和右剪裁平面的坐标。 第三个和第四个参数指定Bottom和Top Clipping plane的坐标。

使用当前的glOrtho,第一个矩形覆盖整个屏幕,其他矩形也覆盖屏幕。结合您的GlColor3f将绘图颜色设置为白色,整个屏幕变为白色。顺便说一下,你不需要重新指定它。

让它发挥作用的一种方式就是拥有像这样的glOrth:

 Gl.glOrtho(-5.0, 5.0, -5.0, -5.0, -1.0, 1.0); 

你也可以修改你的glVertex方法来绘制一个更小的矩形。