используя проекцию в OpenGL с помощью С#?

Для тех, кто не знает, 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 треугольника, а небольшое пояснение сделает ее более очевидной и приемлемой.


person Obzajd    schedule 10.10.2011    source источник
comment
Вероятно, вам следует прочитать уроки NeHe. Многие люди жалуются, что они устарели, но они охватывают функции, которые вы используете, и очень хорошо объясняют их, как их использовать и почему.   -  person Ben Voigt    schedule 10.10.2011
comment
Так вы решили ее сами или отбросили проблему или у вас остались какие-то неясности относительно уже поставленных ответов? В первом случае отказ от вопроса является крайне плохой практикой, а во втором случае не стесняйтесь задавать любой вопрос, который у вас может возникнуть по одному из ответов.   -  person Christian Rau    schedule 18.10.2011


Ответы (2)


Проще говоря, вызов 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 — это конечный автомат.

person Christian Rau    schedule 10.10.2011
comment
глупый вопрос, что на самом деле делает порт просмотра? заставляет ли это вещи, которые я нарисовал, выглядеть в 3D? - person Obzajd; 19.10.2011
comment
@Obzajd Нет, он просто определяет, как нормализованные координаты устройства, находящиеся в [-1,1], полученные после преобразования проекции (после glOrtho, если хотите), масштабируются для составления координат пикселей. Таким образом, преобразование проекции и отсечение могут работать в общем пространстве ([-1,1] куб) независимо от фактического разрешения окна, в котором происходит рендеринг. Таким образом, glViewport определяет диапазон фреймбуфера, в котором отображается ваш мир, и обычно он должен соответствовать размерам вашего окна. - person Christian Rau; 19.10.2011
comment
Отличный анализ проблемы Спасибо! - person Obzajd; 20.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, чтобы нарисовать меньший прямоугольник.

person pikzen    schedule 10.10.2011
comment
ВАУ, вы просто энциклопедия OpenGL! - person Obzajd; 19.10.2011