Как обращаться с ортогональной проекцией, самовращаясь экран?

У меня есть этот метод для выполнения ortho проектирования:

void myGL::ApplyOrtho(float maxX, float maxY) const
{
float a = 1.0f/maxX;
float b = 1.0f/maxY;
float ortho[16] = {
    a, 0, 0, 0,
    0, b, 0, 0,
    0, 0, -1, 0,
    0, 0, 0, 1};

    GLint projectionUniform = glGetUniformLocation(m_simpleProgram, "Projection");
    glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);
  }

Это хорошо работает для экрана iPad, когда я делаю это:

ApplyOrtho(2, 2*1024/768);

Вот мое предоставленное изображение:

arrow

Однако, когда я сменяю друг друга, чтобы заниматься ландшафтным дизайном, это похоже на это:

landscape arrow

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

Кстати, это - вращение:

void myGL::ApplyRotation(float degrees) const
{
float radians = degrees * 3.14159f/180.0f;
float s = std::sin(radians);
float c = std::cos(radians);
float zRotation[16] = {
    c, s, 0, 0,
    -s, c, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1
};
GLint modelviewUniform = glGetUniformLocation(m_simpleProgram, "Modelview");
glUniformMatrix4fv(modelviewUniform, 1, 0, &zRotation[0]);
}

Это используется прямо перед рисунком.

Таким образом, я экспериментировал и попробовал это в то же время, я сменяю друг друга:

 ApplyOrtho(2*1024/768, 2);

Однако, это не имеет никакого эффекта вообще, даже при том, что вращение определенно происходит в то же время. Мое изображение остается "толстым".

  1. Является моей интерпретацией того, почему жирность происходит правильная?

  2. , Как обращаться с ортогональной проекцией, самовращаясь экран?

UDPATE: Also tried this on iPhone using the 2/3 dimensions of the screen (not iPhone 5) and using ApplyOrtho(2,3) and ApplyOrtho(3,2) but the "fat" triangle in landscape remains.

Также: viewport - установка только однажды перед первым Ortho:

glViewport(0, 0, width, height);

Где ширина и высота - размеры экрана Portrait.

0
nl ja de
обновленный вопрос
добавлено автор johnbakers, источник
Когда ориентация устройства изменяется, прикладное вращение - ароматы. Нет никакого фактического вращения, происходящего на экране, it' s все обработанные применять вращением
добавлено автор johnbakers, источник
Вы могли показать, как вы настраиваете viewport?
добавлено автор Kimi, источник
Вы делаете вращение, просто призывая ApplyRotation, или действительно ли это - результат изменения ориентации устройства?
добавлено автор Kimi, источник

1 ответы

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

0
добавлено
pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.