Iphone OpengGL: редактирование MODELVIEW_MATRIX - PullRequest
0 голосов
/ 20 января 2011

Я работаю над вращающимся трехмерным кубом (настройка glFrustumf), и он умножает текущую матрицу на предыдущую, чтобы куб продолжал вращаться. Смотри ниже

/* save current rotation state */
GLfloat matrix[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);

/* re-center cube, apply new rotation */
glLoadIdentity(); 

glRotatef(self.angle, self.dy,self.dx,0);

glMultMatrixf(matrix);

Проблема в том, что мне нужно отступить от этого (как если бы у меня была камера). Я пытался отредактировать матрицу, и это работает, но он улавливает шум. Куб прыгает вокруг.

   matrix[14] = -5.0;
   matrix[13] = 0;
   matrix[12] =0; 

Есть ли способ отредактировать текущую матрицу просмотра модели, чтобы я мог установить положение куба, умножив его на другую матрицу?

1 Ответ

1 голос
/ 20 января 2011

Вы не должны плохо обращаться с OpenGL как с графом сцены, так и с математической библиотекой.Это означает: не считывайте матрицу, а умножайте ее произвольно обратно.Вместо этого перестраивайте весь стек матрицы каждый раз, когда вы делаете проход рендеринга.Я думаю, что я должен отметить, что в OpenGL-4 все матричные функции были удалены .Вместо этого ожидается, что матрицы будут представлены в форме.

РЕДАКТИРОВАТЬ из-за комментария @ Burf2000: Ваш типичный обработчик рендеринга будет выглядеть примерно так (псевдокод):

draw_object():
    # bind VBO or plain VertexArrays (you might even use immediate mode, but that's deprecated)
    # draw the stuff using glDrawArrays or better yet glDrawElements

render_subobject(object, parent_transform):
    modelview = parent_tranform * object.transform
    if OPENGL3_CORE:
        glUniformMatrix4fv(object.shader.uniform_location[modelview], 1, 0, modelview)
    else:
        glLoadMatrixf(modelview)
    draw_object(object)
    for subobject in object.subobjects:
        render_subobject(subobject, modelview)

render(deltaT, window, scene):
    if use_physics:
        PhysicsSimulateTimeStep(deltaT, scene.objects)
    else:
        for o in scene.objects:
            o.animate(deltaT)

    glClearColor(...)
    glClearDepth(...)
    glViewport(0, 0, window.width, window.height)
    glDisable(GL_SCISSOR_TEST);
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT)

    # ...

    # now _some_ objects' render pass - others may precede or follow, like for creating reflection cubemaps or water refractions.

    glViewport(0, 0, window.width, window.height)
    glEnable(GL_DEPTH_TEST)
    glDepthMask(1)
    glColorMask(1,1,1,1)

    if not OPENGL3_CORE:
        glMatrixMode(GL_PROJECTION)
        glLoadMatrixf(scene.projection.matrix)

    for object in scene.objects:
        bind_shader(object.shader)
        if OPENGL3_CORE:
            glUniformMatrix4fv(scene.projection_uniform, 1, 0, scene.projection.matrix)

    # other render passes

    glViewport(window.HUD.x, window.HUD.y, window.HUD.width, window.HUD.height)
    glStencil(window.HUD.x, window.HUD.y, window.HUD.width, window.HUD.height)
    glEnable(GL_STENCIL_TEST)
    glDisable(GL_DEPTH_TEST)

    if not OPENGL3_CORE:
        glMatrixMode(GL_PROJECTION)
        glLoadMatrixf(scene.HUD.projection.matrix)
    render_HUD(...)

и так далее.Я надеюсь, что вы поняли основную идею.OpenGL не является ни графом сцены, ни библиотекой манипулирования матрицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...