PyOpenGL Объекты продолжают вращаться вокруг начала координат - PullRequest
0 голосов
/ 23 октября 2018

Итак, я просто проверял, как все работает в моем движке, и пытался вращать объект, просто используя следующее:

rot_y = Matrix44.from_y_rotation(glfw.get_time() * 0.5)

Но ... Он вращается вокруг источника вместо его места.

Основной код: http://hatebin.com/rtuqgeqptw

projection = pyrr.matrix44.create_perspective_projection_matrix(60.0, w_width/w_height, 0.1, 100.0)
sphere_model = matrix44.create_from_translation(Vector3([-4.0,0.0,-3.0]))
monkey_model = matrix44.create_from_translation(Vector3([0.0,0.0,-3.0]))

glUseProgram(shader)
model_loc = glGetUniformLocation(shader, "model")
view_loc = glGetUniformLocation(shader, "view")
proj_loc = glGetUniformLocation(shader, "proj")

glUniformMatrix4fv(proj_loc, 1, GL_FALSE, projection)

while not glfw.window_should_close(window):
    glfw.poll_events()
    do_movement()

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    view = cam.get_view_matrix()
    glUniformMatrix4fv(view_loc, 1, GL_FALSE, view)

    rot_y = Matrix44.from_y_rotation(glfw.get_time() * 0.5)

    glBindVertexArray(sphere_vao)
    glBindTexture(GL_TEXTURE_2D, sphere_tex)
    glUniformMatrix4fv(model_loc, 1, GL_FALSE, rot_y *sphere_model)
    glDrawArrays(GL_TRIANGLES, 0, len(sphere_obj.vertex_index))
    glBindVertexArray(0)

    glBindVertexArray(monkey_vao)
    glBindTexture(GL_TEXTURE_2D, monkey_tex)
    glUniformMatrix4fv(model_loc, 1, GL_FALSE, monkey_model)
    glDrawArrays(GL_TRIANGLES, 0, len(monkey_obj.vertex_index))
    glBindVertexArray(0)

    glfw.swap_buffers(window)

glfw.terminate()

Я не уверен, в чем проблема и почему она не вращается вокруг своей собственной точки.

1 Ответ

0 голосов
/ 23 октября 2018

Если вы хотите, чтобы модель вращалась вокруг начала сетки, то вы должны применить матрицу вращения перед матрицей модели.Сначала поверните модель, затем переведите ее.Также обратите внимание, что тип возврата matrix44.create_from_translation равен numpy.array.Это означает, что вам нужно сначала сделать Matrix44, прежде чем вы сможете умножить матрицы.

Поменяйте местами перевод и матрицу вращения, чтобы решить вашу проблему:

sphere_model = matrix44.create_from_translation(Vector3([-4.0,0.0,-3.0]))

rot_y = Matrix44.from_y_rotation(glfw.get_time() * 0.5)

# roation before tranasltion
model_mat = Matrix44(sphere_model) * rot_y
glUniformMatrix4fv(model_loc, 1, GL_FALSE, model_mat) 

Обратите внимание, что умножение матриц должно читаться справа налево.См. Также Программирование GLSL / Векторные и матричные операции

translate * rotate:

rotate * translate:

...