2

次の質問がさまざまなフォーラムで何度も行われていることは知っていますが、さまざまな解決策を表示しても問題が解決しないか
、OpenGLES2.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;
}

したがって、レンダリング中に、modelViewと射影行列の2つの行列を作成します。

これが私の射影行列が初期化される方法です:

[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軸を逆方向に移動しています。
図形を回転し始めると問題が発生します。図形がユーザーの周りではなく、ユーザーの周りを回転しているように見えます。
たとえば、画面を左から右にタッチすると、ピラミッドが画面の右端から出て、左端から画面に戻ってくるのが見えます。まるで、まるで自分の周りを一周したかのようです。 p。

私は自分のマトリックス管理コードについてかなり確信しているので、この質問のコードが多すぎるのを避けるために、ここに投稿しないことにしました。必要に応じてあげることができます。

私が間違ったことについて何か考えがありますか?

どうもありがとう !

トム

4

1 に答える 1

3

問題はマトリックス管理コードにあるようです。具体的には、更新するコードmvMatrix(modelViewMatrix) が実際に変更projectionMatrixされています。

于 2010-06-03T19:46:14.287 に答える