OpenGL ES 2.0: проблема вращения объекта - PullRequest
2 голосов
/ 03 июня 2010

Я знаю, что следующий вопрос задавался много раз на разных форумах, но после просмотра разных решений он все равно не решил мою проблему, или, возможно, я не понял, что они означают
Я пытаюсь смоделировать пирамиду с помощью OpenGL ES 2.0 на iPhone.
Я хотел бы позволить пользователю вращать эту пирамиду с помощью сенсорного экрана, чтобы он мог видеть каждое лицо фигуры.
Я использую свои собственные матричные утилиты, вдохновленные библиотекой, приведенной в книге Руководство по программированию OpenGL ES 2.0 .
У меня есть простой вершинный шейдер, который принимает 2 униформы и 2 атрибута.
Вот мой вершинный шейдер:

uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
attribute vec4 vertex;
attribute vec4 color;
varying vec4 colorVarying;

void main()
{
 colorVarying = color;
 gl_Position = projectionMatrix * modelViewMatrix * vertex;
}

Итак, во время рендеринга я создаю 2 матрицы: modelView и матрицу проекции.

Вот как инициализируется моя проекционная матрица:

[pMatrix frustumWithAngleOfView:70.0f
                          ratio:(float)backingWidth / (float)backingHeight
                          zNear:1.0f
                           zFar:100.0f];
[program use];
glUniformMatrix4fv(unif_projectionMatrix, 1, GL_FALSE, pMatrix.vertices);
[program unuse];

Мои вершины пирамиды установлены следующим образом:

GLfloat pyramid[] = {
  //Base
  -1.0, -1.0, 1.0, 1.0,
  -1.0, -1.0, -1.0, 1.0,
  1.0, -1.0, -1.0, 1.0,
  1.0, -1.0, 1.0, 1.0,
  //Front face
  0.0, 1.0, 0.0, 1.0,
  -1.0, -1.0, 1.0, 1.0,
  1.0, -1.0, 1.0, 1.0,
  //Right face
  0.0, 1.0, 0.0, 1.0,
  1.0, -1.0, 1.0, 1.0,
  1.0, -1.0, -1.0, 1.0,
  //Back face
  0.0, 1.0, 0.0, 1.0,
  1.0, -1.0, -1.0, 1.0,
  -1.0, -1.0, -1.0, 1.0,
  //Left face
  0.0, 1.0, 0.0, 1.0,
  -1.0, -1.0, -1.0, 1.0,
  -1.0, -1.0, 1.0, 1.0

 };

Наконец, вот мой код для рисования:

[EAGLContext setCurrentContext:context];

glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);
glViewport(0, 0, backingWidth, backingHeight);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Use shader program
[program use];

// Apply transformations on the ModelView matrix
[mvMatrix identity];
[mvMatrix translateX:0 Y:0 Z:-6.0];
[mvMatrix rotateX:rotatex Y:rotatey Z:rotatez];

// Set the ModelView matrix uniform in the v-shader
glUniformMatrix4fv(unif_modelViewMatrix, 1, GL_FALSE, mvMatrix.vertices);
// Set the vertex attribute in the v-shader
glVertexAttribPointer(attr_vertex, 4, GL_FLOAT, GL_FALSE, 0, pyramid);
glEnableVertexAttribArray(attr_vertex);

// Draw
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDrawArrays(GL_TRIANGLES, 4, 3);
glDrawArrays(GL_TRIANGLES, 7, 3);
glDrawArrays(GL_TRIANGLES, 10, 3);
glDrawArrays(GL_TRIANGLES, 13, 3);

glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER];

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

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

Ты хоть представляешь, что я сделал не так?

Большое спасибо!

Tom

1 Ответ

3 голосов
/ 03 июня 2010

Похоже, проблема в коде управления матрицей, а именно в том, что код для обновления mvMatrix (modelViewMatrix) фактически меняет projectionMatrix вместо этого.

...