GLKit移动相机时,一个对象会奇怪地移动



我最近开始了一个基于OpenGL示例的新iOS项目。我添加了我自己的相机移动代码,并添加了一个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);
    }
}

正如您所看到的,所有的块都是用完全相同的代码绘制的。为什么一个人会有不同的行为?

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

最新更新