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

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

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

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

Спасибо,


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


Ответы (4)


arrow_upward
0
arrow_downward

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

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

arrow_upward
1
arrow_downward

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

person Goz    schedule 25.03.2010

arrow_upward
1
arrow_downward

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

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

person kusma    schedule 25.03.2010

arrow_upward
0
arrow_downward

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

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

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

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

person Eric Bainville    schedule 25.03.2010