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

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

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

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

Спасибо,


person Rony Rozen    schedule 25.03.2010    source источник


Ответы (4)


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

Самый простой способ сделать это — после рендеринга обычной сцены с желаемым соотношением сторон изменить окно просмотра 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).

person tbone    schedule 25.03.2010

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

person Goz    schedule 25.03.2010

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

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

person kusma    schedule 25.03.2010

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

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

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

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

person Eric Bainville    schedule 25.03.2010