2009-05-19 2 views
3

Ich habe ein Modell eines Schneemanns, den ich aus einer OBJ-Datei lade. Alles funktioniert gut, außer dass wenn ich glRotatef() verwende, um das Modell zu drehen, der Kopf des Schneemanns immer vor dem Körper rendern wird. Die Nase des Schneemannes wird auch immer hinter dem Kopf rendern. Dies erzeugt den Effekt, dass der Schneemann die Richtung ändert, während er sich dreht, aber die Teile werden nicht in der richtigen z-Reihenfolge dargestellt. Warum passiert das?OpenGL ES - Falsches Rendern auf der Z-Achse?

HINWEIS: Alle Teile des Schneemanns stammen aus der gleichen .obj-Datei, die mit dem Mixer erstellt wurde.

das Modell wie folgt aus (in der Streck loop) Rendering

glVertexPointer(3 ,GL_FLOAT, 0, model_verts); 
glEnableClientState(GL_NORMAL_ARRAY); 
glNormalPointer(GL_FLOAT, 0, model_normals); 
glDrawElements(GL_TRIANGLES, num_model_indices*3, GL_UNSIGNED_SHORT, &model_indices); 

wie diese dreht (in touchesMoved)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
touchBeginPos = [touch locationInView:self]; 

} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
CGPoint touchEndPos = [[touches anyObject] locationInView:self]; 
glMatrixMode(GL_MODELVIEW_MATRIX); 
glRotatef(10, (touchBeginPos.y - touchEndPos.y)/4, -(touchBeginPos.x - touchEndPos.x)/4, 0.0f); 
touchBeginPos = touchEndPos; 
} 
+0

einige High-Level-Code der Veröffentlichung könnte erklären helfen, was los ist. – luke

+0

Gibt es weitere nützliche Informationen? –

Antwort

5

Überprüfen, dass man nicht (versehentlich) haben angelegt, um einen negativ (Spiegelung) auf die Szene skalieren. Überprüfen Sie auch, ob Sie Z-Pufferung verwenden, vielleicht nicht.

This page spricht ein wenig über Blender-Koordinatensystem, verglichen mit einem anderen 3D-System, und ist vielleicht halb-obskur als Referenz, aber ich stelle ein gewisses Maß an Vertrauen in es.

+0

Ich füge hinzu glGenRenderbuffersOES (1, & depthRenderbuffer); glBindRenderbufferOES (GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, BackingWidth, BackingHeight); glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); an die createFrambuffer-Methode. und glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_DEPTH_TEST); in DrawView –

+0

@Joe: Danke. Es wäre viel einfacher, diesen Code zu lesen, wenn Sie ihn in Ihrer Frage bearbeitet haben, vielleicht ganz unten mit einer "UPDATE:" - Überschrift oder etwas, um zu zeigen, dass es neu ist. – unwind

0

UIKit-Koordinaten für die Texturen sind upside-down, so haben Sie zwei Möglichkeiten:

  1. stellen Sie die V-Koordinaten zum Runterladen Ihrer Textur-Mappings (1-vcoord)
  2. das Bild drehen, bevor sie in der Zeichnung contex, das du später in gl laden wirst.

Wenn Sie CG verwenden die Texturen so zu laden, können Sie die ScaleCTM hinzufügen:

CGContextRef context = CGBitmapContextCreate(imageData, .... 
CGContextClearRect(context, ... 
CGContextScaleCTM(context, 1.0, -1.0); // flip the texture vertically 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);