с помощью Projection в OpenGL с помощью C #? - PullRequest
1 голос
/ 10 октября 2011

Для тех, кто не знает, для консольного приложения C # требуются Tao.opengl, Tao.freeglut.

Теперь по моей проблеме: мой преподаватель попросил нас нарисовать 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 ]

1 голос
/ 10 октября 2011

glVertex3 настолько устарел, что ваш учитель даже не должен признавать его существование, но хорошо.

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

Первые два параметра определяют координаты для левой и правой плоскостей отсечения.Третий и четвертый параметры определяют координаты для нижней и верхней плоскостей отсечения.

При текущем значении glOrtho первый прямоугольник покрывает весь экран, а остальные также покрывают экран.В сочетании с настройкой цвета рисования GlColor3f на белый весь экран становится белым.Между прочим, вам не нужно переопределять его.

Один из способов заставить его работать - это иметь следующий glOrtho:

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

Вы также можете модифицировать свои методы glVertex.нарисовать меньший прямоугольник.

1 голос
/ 10 октября 2011

Проще говоря, звонок glOrtho обычно определяет область вашего мира, которая видна. Таким образом, в вашем случае вы видите только квадрат [0,1], который полностью покрыт первым (белым) многоугольником (то есть квадратом [-1,1]). Таким образом, чтобы увидеть все свои полигоны, вы должны использовать, например,

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

Все становится сложнее, когда вы используете матрицу вида модели, которая не является идентичной или перспективной (вместо ортогональной). Я советую вам больше взглянуть на конвейер преобразования OpenGL для большего понимания. Может быть, ответы на этот вопрос помогут с этим.

Вы также, кажется, забыли позвонить на

glViewport(0, 0, 1000, 1000);

, который определяет область фрейм-буфера, в который отображается ваше представление, и экстенты которого обычно должны соответствовать экстентам вашего окна. По умолчанию область просмотра контекста соответствует размеру окна, к которому он присоединен, но рекомендуется задавать область просмотра явно, особенно когда размер окна изменяется, так как в этом случае область просмотра не обновляется автоматически.

И, кстати, вам не нужно устанавливать цвет для каждого многоугольника, если они все окрашены одинаково, поскольку OpenGL - это конечный автомат .

...