GLKit移动相机时一个物体移动奇数

时间:2013-07-26 05:17:36

标签: ios objective-c opengl-es glkit

我最近开始了一个基于OpenGL示例的新iOS项目。我添加了自己的相机移动代码,并添加了一个包含Blocks实例的NSMutableArray(当前只包含3D位置)。我修改了绘图代码,从这个数组中绘制样本中包含的立方体模型的实例。

当我在相机中导航时,所有立方体的行为都符合我的预期(它们都保留在原来的位置,但是我将相机移动到它们周围),除了一个立方体在相机改变时似乎与其他立方体稍微滑动。每当我移动相机(位置或旋转)时,此块都会保持在相同的大致位置,但它会在相机移动的相反方向上稍微滑动。当相机静止时,它应该是完美的位置。

此块似乎总是最后绘制的块。如果我添加一个条件来跳过该块,它会选择另一个。

我一遍又一遍地浏览了我的代码,我无法理解为什么一个块的行为应该与其他块不同。

以下是所有相关代码:

    ViewMatrix = GLKMatrix4MakeRotation(CameraRotation.y, 1.0f, 0.0f, 0.0f);
ViewMatrix = GLKMatrix4Rotate(ViewMatrix, CameraRotation.x, 0.0f, 1.0f, 0.0f);
ViewMatrix = GLKMatrix4TranslateWithVector3(ViewMatrix, CameraPosition);
ViewMatrix = GLKMatrix4Translate(ViewMatrix, 0.0f, -1.5f, 0.0f);

glBindVertexArrayOES(_vertexArray);


for (int i = 0; i < blocks.count; i++){
    Block *b = [blocks objectAtIndex:i];

    if (true){

        [self.effect prepareToDraw];

        GLKMatrix4 ModelViewMatrix = GLKMatrix4MakeTranslation(b.position.x, b.position.y, b.position.z);

        ModelViewMatrix = GLKMatrix4Multiply(ViewMatrix, ModelViewMatrix);

        self.effect.transform.modelviewMatrix = ModelViewMatrix;


        glDrawArrays(GL_TRIANGLES, 0, 36);
    }
}

如您所见,所有块都使用完全相同的代码绘制。为什么一个人表现不同?

1 个答案:

答案 0 :(得分:1)

您的问题的答案很简单,您应该在设置效果后调用prepareToDraw。 您应该始终首先配置效果,然后调用prepareToDraw。所以只需在glDrawArrays(..)之前移动[self.effect prepareToDraw]。 希望它有所帮助