Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Вопрос о координатах OpenGL

Автор вопроса: Rony RozenОтветов: 4

У меня есть простой рисунок OpenGL. Когда пользователь изменяет размер окна, я хочу, чтобы рисунок сохранял соотношение сторон. Я добился этого, установив для glViewport максимальный прямоугольник с соответствующим соотношением сторон всякий раз, когда вызывается метод изменения формы.

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

Кто-нибудь может объяснить, как это сделать?

Спасибо,

coordinatesopengl

Ответы

Ответ 1 · tbone

Если я правильно понимаю, вы хотите нарисовать квадрат в правом верхнем углу окна, независимо от того, где находится ваша сцена окно просмотра.

Самый простой способ сделать это - после рендеринга обычной сцены с желаемым соотношением сторон изменить окно просмотра gl на квадрат, который вы хотите нарисовать в верхнем углу. Затем нарисуйте "полноэкранный" четырехугольник, чтобы заполнить квадрат, причем в этом случае полноэкранный режим фактически становится полноэкранным окном просмотра.

Непроверенный полупсевдокод будет выглядеть примерно так:

// Draw normal scene
glViewport(x, y, w, h);
drawScene();

// Draw top-right red square
glViewport( windowWidth - squareWidth, windowHeight - squareHeight,
            squareWidth, squareHeight );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glColor3f(1.f, 0.f, 0.f);
glRectf(-1.f, -1.f, 1.f, 1.f);

Убедившись, что обмотка glRectf соответствует вашей текущей конфигурации gl cull face. В качестве альтернативы просто временно отключите отбраковку с помощью glDisable(GL_CULL_FACE) / glEnable(GL_CULL_FACE).

Ответ 2 · рейтинг 1 · Goz

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

Ответ 3 · рейтинг 1 · kusma

Один из способов сделать это - создать новую ортогональную матрицу, которая сопоставляется с координатами пикселей (слева = 0, снизу = 0, справа = ширина окна, сверху = высота окна) и установить область просмотра gl так, чтобы она покрывала все окно. всякий раз, когда окно меняется. Таким образом, вы можете нарисовать квадрат, указав координаты пикселей, если вы уверены, что у вас настроена матрица представления модели идентичности.

Однако это не единственный способ. Независимо от того, какое несингулярное преобразование у вас есть, вы должны быть в состоянии придумать способ попадания в правильные пиксели, пока gl-viewport покрывает их, просто так проще.

Ответ 4 · Eric Bainville

Чтобы нарисовать квадрат в правом верхнем углу окна, вам нужно, чтобы окно просмотра покрывало эту область. Наличие области просмотра меньше окна не позволит рисовать в углу.

Вы хотите, чтобы ваш видовой экран покрывал все окно (как это делается обычно), а ваши квадратные координаты должны быть сопоставлены примерно так:

X0 = 1-2*s/width
X1 = 1
Y0 = 1-2*s/height
Y1 = 1

где s - сторона квадрата (пиксели), а width, height - размеры окна (пиксели).

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы