Как настроить OpenGL Orthographi c Проекция для заполнения экрана прямоугольником при повороте - PullRequest
2 голосов
/ 02 марта 2020

Может ли кто-нибудь помочь мне со следующим?

Проще говоря:

У меня есть геометрия прямоугольника, определяемая 4 вершинами {x, y, z} следующим образом:

double[] vertices = new double[12] { -5, 3, 0, 5, 3, 0, 5, -3, 0, -5, -3, 0 };

Я рисую прямоугольник со следующим:

GL.VertexPointer(3, VertexPointerType.Double, 0, vertices);

GL.DrawArrays(BeginMode.LineLoop, 0, vertices.Length / 3);

Я использую проекцию Orthographi c, и мой код установки окна просмотра:

int nWidth = ClientRectangle.Width;
int nHeight = ClientRectangle.Height;

GL.Viewport(0, 0, nWidth, nHeight);

GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();

GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();

m_orthogonalProjectionTop = 3.05;
m_orthogonalProjectionLeft = -5.05;
m_orthogonalProjectionRight = 5.05;
m_orthogonalProjectionBottom = -3.05;

GL.Ortho(m_orthogonalProjectionLeft, m_orthogonalProjectionRight, m_orthogonalProjectionBottom, m_orthogonalProjectionTop, -1, 1);

Это работает как я будет ожидать. Прямоугольник почти полностью заполняет все окно рендеринга (оно светло-синее на скриншоте ниже):

Rectangle

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

Теперь вот моя проблема:

В моем коде рендеринга вместо простого вызова функции рендеринга:

RenderRectangle();

Я вместо этого вызываю:

GL.PushMatrix();
GL.Rotate(270, 0.0, 0.0, 1.0);
RenderRectangle();
GL.PopMatrix();

И я изменяю свой видовой экран так, чтобы вместо:

GL.Ortho(m_orthogonalProjectionLeft, m_orthogonalProjectionRight, m_orthogonalProjectionBottom, m_orthogonalProjectionTop, -1, 1);

Теперь у меня есть:

GL.Ortho(m_orthogonalProjectionBottom, m_orthogonalProjectionTop, m_orthogonalProjectionLeft, m_orthogonalProjectionRight, -1, 1);

(чтобы я поменял местами x и y области просмотра)

Тогда я ожидал, что мой прямоугольник все еще почти заполнит экран. То, что я на самом деле вижу, это то, что верхняя часть прямоугольника в порядке, она кажется просто застенчивой в верхней части окна, левая и правая стороны также в порядке, но нижняя часть прямоугольника находится за пределами экрана (путем установки нижней части окно просмотра немного более негативное, я вижу его, но его видимость зависит от размера окна).

Вот скриншот, вы можете видеть, что нижняя часть прямоугольника находится за пределами светло-синей области:

enter image description here

Может кто-нибудь сообщить, что я делаю не так?

Спасибо, Митч.

1 Ответ

1 голос
/ 02 марта 2020

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

Спасибо, Митч.

...