VPython Object Revolution

В настоящее время я использую VPython, и я хочу создать модель Солнечной системы.

В настоящее время у меня есть все планеты и орбитальные кольца, однако реальная орбита - это то, что мне очень сложно.

GlowScript 2.7 VPython
from visual import *



# Declaring Celestial Body Objects
Sun     = sphere(pos =     vec(0, 0, 0), radius =   10, color = color.yellow)
Mercury = sphere(pos =    vec(25, 0, 0), radius =    2, color =  color.green)
Venus   = sphere(pos =    vec(40, 0, 0), radius =  2.5, color =    color.red)
Earth   = sphere(pos =    vec(50, 0, 0), radius = 2.65, color =   color.blue)
Mars    = sphere(pos =    vec(70, 0, 0), radius =  2.3, color =    color.red)
Jupiter = sphere(pos =    vec(90, 0, 0), radius =    3, color = color.orange)
Saturn  = sphere(pos =   vec(105, 0, 0), radius =  2.9, color = color.orange)
Uranus  = sphere(pos = vec(117.5, 0, 0), radius =  2.9, color = color.orange)
Neptune = sphere(pos =   vec(135, 0, 0), radius =  2.8, color =   color.blue)
Pluto   = sphere(pos =   vec(165, 0, 0), radius =  1.5, color =  color.white)



# Declaring Orbital Rings of Celestial Body Objects
Mercury.ring = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Mercury.pos.x * 2, Mercury.pos.x * 2))
Venus.ring   = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Venus.pos.x * 2, Venus.pos.x * 2))
Earth.ring   = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Earth.pos.x * 2, Earth.pos.x * 2))
Mars.ring    = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Mars.pos.x * 2, Mars.pos.x * 2))
Jupiter.ring = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Jupiter.pos.x * 2, Jupiter.pos.x * 2))
Saturn.ring  = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Saturn.pos.x * 2, Saturn.pos.x * 2))
Uranus.ring  = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Uranus.pos.x * 2, Uranus.pos.x * 2))
Neptune.ring = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Neptune.pos.x * 2, Neptune.pos.x * 2))
Pluto.ring   = ring(pos = vec(0, 0, 0), axis = vec(0, 1, 0), size = vec(0.1, Pluto.pos.x * 2, Pluto.pos.x * 2))



# Infinite Loop
while 1 == 1:

    Mercury.rotate(angle = radians(360), axis = vec(Mercury.pos.y, Mercury.pos.x, 0), origin = vec(0, 0, 0))
    rate(50)

print("Error! Escaped While Loop!")

Когда я выключаю метод rotate с помощью Mercury.rotate(angle = 0.0174533, axis = vec(0, Mercury.pos.x, 0), origin = vec(0, 0, 0)), он правильно вращается ... но только на четверть поворота. Я читал обо всем, что связано с this, но н / д.

После четверти оборота планета иногда решает насильственно «захватить», когда угол становится большим. Это просто похоже на своего рода барьер.


person Connor    schedule 30.05.2018    source источник


Ответы (1)


Вы должны написать axis = vec (0,1,0). Ось вращения всегда должна быть направлена ​​вверх.

person user1114907    schedule 15.11.2018