Opengl ES - z轴上的渲染不正确?

时间:2009-05-19 12:52:57

标签: iphone opengl-es

我有一个雪人模型,我从.obj文件加载。一切都运行良好,除了当我使用glRotatef()旋转模型时,雪人的头部将始终呈现在身体前方。雪人的鼻子也总是在头后面。这会产生雪人在旋转时改变方向的效果,但实际上这些部件不会以正确的z顺序渲染。这是为什么会发生的?

注意:雪人的所有部分都来自使用搅拌机创建的相同.obj文件。

像这样渲染模型(在绘制循环中)

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

像这样旋转(在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;
}

2 个答案:

答案 0 :(得分:5)

检查您是否(错误地)将负(镜像)比例应用于场景。还要检查你是否正在使用Z缓冲,也许你不是。

与另一个3D系统相比,

This page谈论了Blender的坐标系,并且可能是半模糊的参考,但我对它有一定的信心。

答案 1 :(得分:0)

纹理的UIKit坐标是颠倒的,所以你有两个选择:

  1. 将纹理映射的V坐标调整为(1-vcoord)
  2. 在绘制到稍后加载到gl中的上下文之前翻转图像。
  3. 如果您使用CG加载这样的纹理,可以添加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);