2013-07-26 4 views
0

Я недавно начал новый проект iOS, основанный на образце OpenGL. Я добавил свой собственный код движения камеры, и я добавил NSMutableArray, который содержит экземпляры блоков (в настоящее время только содержит трехмерную позицию). Я изменил код чертежа, чтобы нарисовать экземпляры модели куба, включенные в образец из этого массива.GLKit один объект перемещается нечетно при перемещении камеры

Когда я перемещаюсь по камере, все кубы ведут себя так, как я ожидаю (все они остаются в исходном месте, но я перемещаю камеру вокруг них), за исключением того, что один куб скользит немного отдельно от остальных, когда камера изменения. Всякий раз, когда я перемещаю камеру (положение или вращение), этот блок остается в том же общем месте, но слегка скользит в противоположном направлении движения камеры. Когда камера неподвижна, она совершенно там, где она должна быть.

Этот блок всегда кажется последним нарисованным. Если я добавлю условие, чтобы пропустить этот блок, он выбирает другой.

Я прошел через свой код снова и снова, и я не понимаю, почему один блок должен вести себя иначе, чем другие.

Здесь все соответствующего код:

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

Ответ на вашу проблему прост, вы должны вызвать prepareToDraw после того, как вы установите эффект. Вы всегда должны сначала настроить эффект, а затем вызвать prepareToDraw. Поэтому просто переместите [self.effect prepareToDraw] прямо перед glDrawArrays (..). Надеюсь, это поможет

Смежные вопросы