【问题标题】:How to handle the orthographic projection when auto-rotating screen?自动旋转屏幕时如何处理正投影?
【发布时间】:2013-04-05 06:29:27
【问题描述】:

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

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);

这是我的渲染图像:

但是,当我旋转到横向时,它看起来像这样:

现在我的假设是这是因为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: 还在 iPhone 上使用 2/3 尺寸的屏幕(不是 iPhone 5)并使用 ApplyOrtho(2,3)ApplyOrtho(3,2) 进行了尝试,但横向中的“胖”三角形仍然存在。

另外:视口只设置一次,在第一个 Ortho 之前:

glViewport(0, 0, width, height);

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

【问题讨论】:

  • 您能说明一下您是如何设置视口的吗?
  • 您是通过简单地调用 ApplyRotation 来进行旋转还是设备方向更改的结果?
  • 当设备方向改变时,发送应用的旋转。屏幕上没有发生实际的旋转,这一切都由应用旋转处理

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2012-10-04
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多