2012-04-07 2 views
1

Ich schreibe ein iOS-Spiel, das viele Würfel auf dem Bildschirm zeichnet, aber ich habe ein Problem mit der Positionierung der Würfel.Wie GLKMatrixStack zu verwenden?

I haben eine Funktion, die einen Würfel draw_voxel zieht:

void draw_voxel(Point location, Color color, GLKMatrixStackRef stack) { 
    GLKMatrixStackPush(stack); 
    GLKMatrixStackTranslate(stack, location.x, location.y, location.z); 

    std::array<Color, 36> triangle_colors; 
    triangle_colors.fill(color); 

    glEnableVertexAttribArray(GLKVertexAttribPosition); 
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, static_cast<const GLvoid*>(triangle_vertices.data())); 
    glEnableVertexAttribArray(GLKVertexAttribColor); 
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, static_cast<const GLvoid*>(triangle_colors.data())); 
    glDrawArrays(GL_TRIANGLES, 0, 36); 
    glDisableVertexAttribArray(GLKVertexAttribPosition); 
    glDisableVertexAttribArray(GLKVertexAttribColor); 

    GLKMatrixStackPop(stack); 
} 

I übergeben es ein GLKMatrixStackRef, die aktuelle Matrix oben schieben und verwenden GLKMatrixStackTranslate die obere Matrix zu übersetzen. Alle Würfel werden jedoch immer noch bei (0, 0, 0) gezeichnet.

Ich nenne draw_voxel wie folgt aus:

[self.effect prepareToDraw]; 

GLKMatrixStackRef stack = GLKMatrixStackCreate(nullptr); 
draw_voxel(Point(-1.0f, 0.0f, 0.0f), Color(1.0f, 0.0f, 0.0f, 1.0f), stack); 
draw_voxel(Point(+0.0f, 0.0f, 0.0f), Color(0.0f, 1.0f, 0.0f, 1.0f), stack); 
draw_voxel(Point(+1.0f, 0.0f, 0.0f), Color(0.0f, 0.0f, 1.0f, 1.0f), stack); 
CFRelease(stack); 

ich keine nützlichen Informationen über das Internet über GLKit Matrix-Stacks finden konnte, und ich bin wirklich stecken. Wie kann ich die oberste Matrix "anwenden", damit die Cubes übersetzt werden?

Antwort

1

Während ich immer noch nicht vollständig verstanden habe, GLKMatrixStack zu verwenden, schaue ich auf den Code Ich denke, das Problem ist, dass Sie die oberste Matrix des Stapels nicht an den Shader übergeben, oder in GLKit Worten nicht den Effekt richtig konfigurieren. irgendwann Wahrscheinlich, sollten Sie wie etwas tun:

diese Hilfe
self.effect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(stack); 

Hope, ich bin zu auf diesem Stapel stecken :)

+0

Und dann senden Sie einfach '-prepareToDraw', und nach dem Aufspringen stack mach das gleiche, oder? Ich muss den Effekt nur an "draw_voxel" als Argument übergeben. –

+0

Eigentlich bin ich mir nicht sicher, was Sie erreichen wollen. Sie erstellen bei jedem Rendering-Durchlauf einen neuen Stapel und verwenden ihn dann, um eine einzelne Übersetzung zu berechnen und die oberste Matrix zu öffnen. Soweit ich weiß, sind Matrixstacks in hierarchischen Animationssystemen nützlich. Wahrscheinlich können Sie einfach die 'GLKMatrix4', die Sie benötigen, durch einen 'GLKMatrix4MakeTranslate'-Aufruf erhalten. – Germano