2012-01-22 6 views
0

OpenGL ESプログラミングの初心者です。私は良いチュートリアルを開始し、プロジェクトが正方形を表示することが分かった。オブジェクトを表示しなくなったOpenGL ES

[model update]; 
[model load]; 

を、それがよりになり、この方法:私は、その後、ビューコントローラで、私はちょうど呼ぶだろうなどと頂点を格納しますModelオブジェクト、色、にビューコントローラのうち、最もOpenGLのコードを移動しようとしました私が表示するいくつかのモデルがあったら練習してください。私がこれをして以来、キューブはもはや画面に表示されません。私は、このメソッドをコメントアウトすると、キューブは表示されますが、画面を塗りつぶすだけなので、モデルビュー行列の計算がすべて行われる更新メソッドにはエラーがあると私は思っています。

- (void)load{ 
self.effect = [[GLKBaseEffect alloc] init]; 

NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], 
          GLKTextureLoaderOriginBottomLeft, 
          nil]; 

NSError * error;  
NSString *path = [[NSBundle mainBundle] pathForResource:@"tile_floor" ofType:@"png"]; 
GLKTextureInfo * info = [GLKTextureLoader textureWithContentsOfFile:path options:options error:&error]; 
if (info == nil) { 
    NSLog(@"Error loading file: %@", [error localizedDescription]); 
} 
self.effect.texture2d0.name = info.name; 
self.effect.texture2d0.enabled = true; 

glGenVertexArraysOES(1, &vertexArray); 
glBindVertexArrayOES(vertexArray); 

glGenBuffers(1, &vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); 

glGenBuffers(1, &indexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition);   
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position)); 
glEnableVertexAttribArray(GLKVertexAttribColor); 
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Color)); 
glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord)); 

glBindVertexArrayOES(0); 
} 

そして、ここでは、レンダリング方法は次のとおりです:

-(void)update: (int)width And:(int)height{ 
float aspect = (width/height); 
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(
             GLKMathDegreesToRadians(65.0f), aspect, 
             4.0f, 10.0f); 
self.effect.transform.projectionMatrix = projectionMatrix; 

GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 6.0f); 
rotation += 90; 
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, 
             GLKMathDegreesToRadians(rotation), 0, 0, 1); 
self.effect.transform.modelviewMatrix = modelViewMatrix; 
} 

そしてここでは、積載方法である

- (void)render{ 
[self.effect prepareToDraw]; 
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); 

glBindVertexArrayOES(vertexArray); 
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0); 
} 

任意の助けいただければ幸いです。ありがとう。

+0

[モデルの更新]と[モデルの読み込み]を投稿できますか? – whooops

+0

また、更新方法全体をコメントアウトする代わりに、どの部分が問題を引き起こしているかを調べることもできます。それは翻訳ですか?回転?それらのどちらでもない場合は、診断をより簡単にするためにコメントアウトしてください。 – whooops

+0

翻訳と回転の行を個別にコメントしてみました。画面は黒のままでした。しかし、私はそれらの両方をコメントアウトすると、オブジェクトが描画されますが、それは私が望むものではない画面を埋める。上記のメソッドは更新メソッドです。パースペクティブを正しく作成できるように、ビューの幅と高さを渡す必要があります。 – user1163876

答えて

1

実際には「エラー」はありません。問題は、あなたが実際にモデルをうまくフレーム化するように、投影とモデルビューの行列を実際に設定していないことです。魔法の解決策はありません。描画しているモデルの頂点を考慮する必要があります(100?1000?0.5ですか?)、GLKMatrix4MakePerspectiveの適切な設定を選択して画面に正しく置いてください。

ショートカットとして(翻訳と回転がなくても画面全体が満たされていると言ったので)、これらの変換をscaleコマンドで置き換えてオブジェクトのサイズを縮小することができます。

ような何か:一般的なアドバイスとして

GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.1f, 0.1f, 0.1f); 

、個別に各コマンドの効果を検討してみてください。投影/変換の概念の紹介をお探しの場合は、このリンクを見つけました:http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-3:-3D-transformation-and-projection.html「投影とワールド空間」のセクションに進んでください。

+0

ありがとうございます。あなたが正しいと思います。これで更新方法をコメントアウトせずに画面に表示させることができます。 – user1163876

関連する問題