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

これが私のレンダリングされた画像です:

矢印

ただし、横向きに回転すると、次のようになります。

風景の矢印

これは、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);

ここで、幅と高さはポートレート画面の寸法です。

4

1 に答える 1

0

上記の不一致の原因は、正投影が画面の幅と高さの比率と一致していないため、X座標とY座標が同じ画面サイズではないことです。正投影比をビューポート比と一致させると、この問題が解決します。その結果、回転すると、画像はまったく同じ形状とサイズのままになります。

于 2013-01-02T06:41:12.760 に答える