2009-05-19 7 views
3

J'ai un modèle de bonhomme de neige que je charge depuis un fichier .obj. Tout fonctionne bien sauf que lorsque j'utilise glRotatef() pour faire tourner le modèle, la tête du bonhomme de neige sera toujours affichée devant le corps. Le nez du bonhomme de neige sera également toujours derrière la tête. Cela crée l'effet que le bonhomme de neige change de direction lorsqu'il tourne, mais en réalité les parties ne sont pas rendues dans le bon ordre z. Pourquoi cela se produit-il? REMARQUE: toutes les parties du bonhomme de neige proviennent du même fichier .obj créé à l'aide de Blender.Opengl ES - Rendu incorrect sur l'axe z?

rendu le modèle comme celui-ci (dans la boucle de tirage)

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

tournant comme celui-ci (en 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

affichage du code de haut niveau pourrait aider à expliquer ce qui se passe. – luke

+0

Y a-t-il d'autres informations qui pourraient vous être utiles? –

Répondre

5

Vérifiez que vous avez pas (par erreur) appliqué un négatif (miroir) échelle à la scène. Vérifiez également que vous utilisez la mise en mémoire tampon Z, peut-être que vous ne l'utilisez pas.

This page parle un peu du système de coordonnées de Blender, comparé à un autre système 3D, et est peut-être semi-obscure comme référence, mais je lui accorde une certaine confiance.

+0

J'ai ajouté 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); à la méthode createFramebuffer. et glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_DEPTH_TEST); dans drawView –

+0

@Joe: Merci. Il serait beaucoup plus facile de lire ce code si vous l'avez édité dans votre question, peut-être en bas avec un titre "UPDATE:" ou quelque chose pour montrer qu'il est nouveau. – unwind

0

UIKit coordonnées pour les textures sont à l'envers, vous avez deux options:

  1. ajustons V coord de vos applications de texture (1-vcoord)
  2. retourner l'image avant de tirer dans le contextes que vous chargerez plus tard dans gl.

Si vous utilisez CG pour charger les textures comme celui-ci, vous pouvez ajouter le ScaleCTM:

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