自动旋转屏幕时如何处理正投影?

时间:2012-12-28 08:21:49

标签: objective-c xcode rotation opengl-es-2.0

我有这种执行正投影的方法:

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. 自动旋转屏幕时如何处理正投影?

  3. UDPATE:也在iPhone上使用屏幕的2/3尺寸(不是iPhone 5)并使用ApplyOrtho(2,3)ApplyOrtho(3,2)但是使用“胖”三角形在景观遗骸中。

    另外:视口只在第一个Ortho:

    之前设置一次
    glViewport(0, 0, width, height);
    

    宽度和高度是纵向屏幕的尺寸。

1 个答案:

答案 0 :(得分:0)

上述差异的原因是正投影与屏幕的宽高比不匹配,因此X和Y坐标不是相同的屏幕尺寸。使正交比率与视口比率匹配可解决此问题。因此,在旋转时,图像将保持完全相同的形状和大小。