1

我有几个立方体形状的对象,我添加到一个上下文中,它在我的 GLKView 中。每一个立方体都是 NSObject 的一个子类,并且分别有自己的基础效果。我为每个立方体设置了投影矩阵和基础效果,如下所示:

self.effect = [[GLKBaseEffect alloc]init];

        self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(45.0f,0.95f, 0.0f, 10.0f);
        self.effect.transform.projectionMatrix = GLKMatrix4Translate(self.effect.transform.projectionMatrix, 0, 0.0, 2.0);

现在,似乎所有人都有一个连接的投影。我想从前面看到他们所有人。但是,如果我将它们放置一点,那么我可以看到立方体的底部或顶部。

关于上面代码行的另一件事:我必须沿着 z 轴稍微移动我的模型视图矩阵以正确地构图它们。我不能将投影矩阵向后移动一点吗?我尝试了几个值,但无济于事。

容器设置如下所示:

- (void)setupGL {

    [EAGLContext setCurrentContext:self.context];

    self.layer.contentsScale = 2.0;


    // Create default framebuffer object.
    glGenFramebuffers(1, &defaultFrameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, defaultFrameBuffer);

    GLfloat coordToPixScale = 1.0;

    glGenRenderbuffers(1, &depthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.bounds.size.width * coordToPixScale, self.bounds.size.height * coordToPixScale);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);

    glEnable(GL_DEPTH_TEST);


}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

    @synchronized(self){

        self.opaque = NO;

        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        [cubes makeObjectsPerformSelector:@selector(draw)];


    }


}

- (void)glkView:drawInRect:方法中的立方体数组中,我使添加到数组中的所有立方体都执行它们的-draw方法:

-(void)draw{


    [self.effect prepareToDraw];

    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glDrawArrays(GL_TRIANGLES, 0, 24);


}

有人可以阐明这个问题吗?

4

1 回答 1

1

我有几个立方体形状的对象,我添加到一个单一的上下文中,

第一个概念性错误:您没有将对象添加到 OpenGL 上下文中。这不是 OpenGL 的工作方式。OpenGL 绘制点、线或三角形,仅此而已。更高级别的一切都取决于您。

你想要多个立方体,每个都有自己的视角?您一个接一个地绘制它们,每个都有自己的透视设置。

我不能把投影矩阵向后移动一点吗

投影矩阵是一种透镜。您不会将镜头从相机机身上拉下来,四处移动,将三脚架与相机保持在适当的位置。模型视图矩阵被称为模型视图是有原因的。视图部分类似于 3D 图形中的相机。

于 2013-03-03T18:37:24.633 回答