Как реализовать столкновение объектов в импортированных файлах OBJ wavefront в 3D - PullRequest
2 голосов
/ 10 июля 2019

Я делаю 3D игру-лабиринт в pyGame, создаю среду в файле OBJ и использую OBJFileLoader, найденный на сайте pyGame, чтобы загрузить ее в мою игру.Но когда я реализовал управление движением, камера проходит через модель.Как я могу обнаружить столкновения между моей камерой и моделью, чтобы я мог это исправить?

Я думал об использовании прямоугольных обнаружений столкновений, но все реализации, которые я мог найти, были в 2D и с трудом пытались это сделать.в 3D также использование obj-файлов не облегчает задачу.Я также где-то читал, что я могу использовать raytracing, но я не смог найти ничего, связанного с использованием raycasting в pyGame.

Ниже приведен код, который я имею в основном цикле для управления движением в игре

while 1:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        if event.type == KEYUP and event.key == K_ESCAPE:
            sys.exit()

    time_passed = clock.tick()
    time_passed_seconds = time_passed / 1000.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()

    pressed = pygame.key.get_pressed()

    rotation_direction.set(0.0, 0.0, 0.0)
    movement_direction.set(0.0, 0.0, 0.0)

    if pressed[K_a]:
        rotation_direction.y = +1.0
    elif pressed[K_d]:
        rotation_direction.y = -1.0
    if pressed[K_w]:
        movement_direction.z = -1.0
    elif pressed[K_s]:
        movement_direction.z = +1.0

    # Calculate rotation matrix and multiply by camera matrix
    rotation = rotation_direction * rotation_speed * time_passed_seconds
    rotation_matrix = Matrix44.xyz_rotation(*rotation)
    camera_matrix *= rotation_matrix

    # Calcluate movment and add it to camera matrix translate
    heading = Vector3(camera_matrix.forward)
    movement = heading * movement_direction.z * movement_speed
    camera_matrix.translate += movement * time_passed_seconds

    # Upload the inverse camera matrix to OpenGL
    glLoadMatrixd(camera_matrix.get_inverse().to_opengl())

    glCallList(obj.gl_list)

    pygame.display.flip()

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

1 Ответ

1 голос
/ 11 июля 2019

Вообще говоря, использование трехмерной геометрической сетки в качестве данных для обнаружения столкновений не очень хорошая идея.Обычно способ, которым мы делаем это, состоит в том, чтобы иметь гораздо более простую геометрию столкновений (в идеале составленную из простых примитивов, таких как коробки, цилиндры, сферы, плоскости - хотя в некоторых случаях можно использовать три сетки) .Плеер / камера обычно представляется в виде капсулы, и мы проверяем капсулу на геометрию.Реализация этой формы обнаружения столкновений в 3D REALLY трудна.

Если возможно свести игру лабиринта к двумерной задаче (например, вид сверху вниз) , тогда определите набор двумерных линий, которые определяют схему лабиринта, ирассматривайте плеер / камеру как круг.

Даже 2D-сценарий сложен.Лучшая система должна была бы решить множество одновременных уравнений, чтобы определить самое близкое пересечение.По мере увеличения размера лабиринта сложность решения становится крайне неприятной (т. Е. Вам необходимо использовать некоторую форму пространственного разбиения, такую ​​как дерево BSP, деревья квадов и т. Д.)

Это очень сложная проблема, поэтому большинство здравомыслящих людей просто используют физический движок для выполнения этих вычислений.Я, вероятно, рекомендую сначала попытаться разобраться с простым 2D физическим движком, например, Box2D.Если вам абсолютно необходимо трехмерное обнаружение столкновений, то вам, вероятно, стоит взглянуть на PhysX, bullet или Havok.

...