ios - GLKit 移动相机时一个物体移动奇怪

标签 ios objective-c opengl-es glkit

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

当我导航相机时,所有立方体的行为都符合我的预期(它们都留在原来的位置,但我在它们周围移动相机),除了当相机改变时,一个立方体似乎与其他立方体稍微滑动分开。每当我移动相机(位置或旋转)时,该 block 确实保持在相同的位置,但它会沿着相机移动的相反方向稍微滑动。当相机静止时,它完全位于其应有的位置。

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

我一遍又一遍地检查我的代码,但我不明白为什么一个 block 的行为应该与其他 block 不同。

以下是所有相关代码:

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

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

最佳答案

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

关于ios - GLKit 移动相机时一个物体移动奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17873448/

相关文章:

ios - 将 UITableView 的高度调整为仅适合总内容大小所需的高度

ios - IBAction 和按钮以编程方式

ios - 在 Swift IOS 中读取本地文本文件

iOS:如何使用 constraintsWithVisualFormat 设置尾随边距?

objective-c - 包含十六进制的 NSString 转换为等效的 ascii

java - 在负数和正数之间生成随机 float opengl es java

iphone - 当我的应用程序在ios中处于后台时,是否可以检测正在运行的应用程序?

ios - OALSimpleAudio 不工作

android - 是否可以使用 OpenGL ES 2.0 扭曲底层图像?

iPhone OpenGL ES - 如何选择