Как с помощью OpenGL языка Python заставить икосаэдр вращаться правильно?

Рейтинг: 0Ответов: 1Опубликовано: 29.07.2023

У меня задача заставить вокруг цилиндра вращаться тор и икосаэдр. И у меня получается, что эти две фигуры постоянно пронзают стенки цилиндра, проходя сквозь него. Надо же так, чтобы (1) тор с икосаэдром двигались рядом, но сквозь него не проходили и чтобы (2) двигались по орбитам, а не вокруг своей оси как тор. Что не так в коде? Публикую фрагмент функции, обеспечивающей вращение фигур.

# Определение переменных
rotation_angle = 0
orbit_plane = random.choice(['xy', 'xz', 'yz'])
icosahedron_angle = 0
torus_angle = 0
cylinder_rad = 1.5
circle_radius = cylinder_rad * 2

# Функция для вращения объектов
def rotate_objects():
    global rotation_angle
    
    global icosahedron_angle 
    global torus_angle 
    global cylinder_rad 
    global circle_radius 
    global rotation_angle 

    global orbit_plane
    
    if orbit_plane == 'xy':
        glRotatef(rotation_angle, 0, 0, 1)
    elif orbit_plane == 'xz':
#         glRotatef(rotation_angle, 0, 1, 0)
        glTranslatef(-circle_radius*math.cos(icosahedron_angle), circle_radius*math.sin(icosahedron_angle), 0) # БРАТЬ ЭТОТ
    elif orbit_plane == 'yz':
#         circle_radius*math.cos(icosahedron_angle), -circle_radius*math.sin(icosahedron_angle)
#         glRotatef(rotation_angle, 1, 0, 0)
        glRotatef(45, 0, 0, 1)  # БРАТЬ ЭТОТ
        
        
    if rotation_angle >= 360:
        rotation_angle = 0
        orbit_plane = random.choice(['xy', 'xz', 'yz'])
       

    # обновляем углы вращения икосаэдра и тора
    icosahedron_angle += 0.01
    torus_angle += 0.01

закомментированы строки с моими попытками решить поставленные задачи

Ответы

▲ 1

Попробуете разобраться самостоятельно? Чтобы фигуры вращались вокруг цилиндра, центр вращения должен лежать на его оси, а плоскость вращения должна быть перпендикулярна оси. Это как-бы основной вариант, хотя могут быть и другие.

В более общем виде цилиндр должен находится внутри орбиты (может и не полностью), а центр орбиты - внутри цилиндра.

Не углубляясь в код, сразу бросаются в глаза выражения вида "orbit_plane == 'xy'", которые наводят на мысь, что вращение задаётся в одной плоскости на выбор, но никак не вокруг цилиндра.

Возьмём тор. Его центр должен вращаться вокруг центра орбиты вращения. То есть нужно посчитать новое положение центра тора и переместить его туда. И плюс сделать его "луной" - тор должен вращаться вокруг собственной оси, перпендиклярной основной орбите, синхронно с его вращением по орбите.