用户:
极光AXE查看:1 回复:2 评论:1 创建时间:2021-05-15T22:48:09
本作品使用VPython实现了3D银河系并模拟了太阳系各种星球的自转以及围绕太阳旋转(包括月球围绕地球旋转)。
运行后,训练师们输入自己的名称,选择是否显示星球运动轨迹,之后训练师们可在VPython的世界中尽情游玩,观赏银河系。(本作品使用了本地图片,运行请下载相关图片)
运行效果图:

全部代码如下:
from vpython import *
import random
from easygui import msgbox,ynbox,enterbox
name = enterbox('请输入你的名称,训练师', '我们来啦,神奇的银河系!')
msgbox(f'欢迎,训练师:{name}。\n你是否想看一看自己居住的银河系呢?\n一起来到VPython的世界探究银河系吧!','我们来啦,神奇的银河系!')
choose = ynbox('是否显示星球转动轨迹?', '我们来啦,神奇的银河系!', ('显示', '隐藏'))
scene.width = 1500
scene.title = '我们来啦,神奇的银河系!'
scene.height = 700
scene.background = vec(0, 0, 25/255)
imglist = ['星球纹理1.png','星球纹理2.jpg','星球纹理3.png']
planet_list = []
def new_planet(radius=1, texture=None, pos=vec(0, 0, 0),status=choose):
planet = sphere(radius=radius, texture=texture, pos=pos,make_trail=status)
return planet
def ranpos(a,b):
return vec(random.randint(a,b),random.randint(a,b),random.randint(a,b))
Text = text(pos=vec(-200,850,0),text='Milky Way',color=color.white,height=50)
Milkyway = new_planet(800, '宇宙.png')
Sun = new_planet(10, '太阳纹理.jpg', vec(-30, 0, 270))
Mercury = new_planet(2.1, '水星纹理.jpg', vec(-12, 0, 270))
Venus = new_planet(2.4, '金星纹理.jpg', vec(-3, 0, 270))
Earch = new_planet(2.7, textures.earth, vec(5, 0, 270))
Moon = new_planet(1.8, '月球纹理.png', vec(10.2, 2.5, 270))
Mars = new_planet(2.46, '火星纹理.jpg', vec(19, 0, 270))
Jupiter = new_planet(5, "木星纹理.jpg", vec(29, 0, 270))
Saturn = new_planet(4,'土星纹理.jpg',vec(46,0,270))
Saturn_ring = ring(radius=6,axis=vec(0,1,0),pos=vec(46,0,270))
Uranus = new_planet(4.7,'天王星纹理.jpg',vec(75,0,270))
Neptune = new_planet(4.7,'海王星纹理.jpg',vec(95,0,270))
for i in range(random.randint(5, 15)):
temp = new_planet(random.randint(3,8),texture=random.choice(imglist),pos=ranpos(-200,300))
planet_list.append(temp)
sleep(3)
num = 0
while True:
rate(60)
num += 1
#星球的自传运动
Sun.rotate(0.014, vec(0, 1, 0))
Mercury.rotate(0.012, vec(0, 1, 0))
Venus.rotate(0.009, vec(0, 1, 0))
Earch.rotate(0.01, vec(0, 1, 0))
Mars.rotate(0.005, vec(0, 1, 0))
Jupiter.rotate(0.01, vec(0, 1, 0))
Moon.rotate(0.01,vec(0,1,0))
Saturn.rotate(0.012,vec(0,1,0))
Saturn_ring.rotate(0.012,vec(0,1,0))
Uranus.rotate(0.13,vec(0,1,0))
Neptune.rotate(0.092,vec(0,1,0))
#星球的围绕太阳旋转运动
Mercury.rotate(0.011, vec(0, 1, 0),Sun.pos)
Venus.rotate(0.012, vec(0, 1, 0),Sun.pos)
Earch.rotate(0.01, vec(0, 1, 0),Sun.pos)
Mars.rotate(0.013, vec(0, 1, 0),Sun.pos)
Jupiter.rotate(0.014, vec(0, 1, 0),Sun.pos)
Moon.rotate(0.01,vec(0,1,0),Sun.pos)
Moon.rotate(0.01, vec(0, 1, 0), Earch.pos)
Saturn.rotate(0.015, vec(0, 1, 0),Sun.pos)
Saturn_ring.rotate(0.015,vec(0,1,0),Sun.pos)
Uranus.rotate(0.0112,vec(0,1,0),Sun.pos)
Neptune.rotate(0.013,vec(0,1,0),Sun.pos)
#其他星球自传效果
for planet in planet_list:
planet.rotate(0.02,vec(0,1,0))
if num == 1500:
msgbox(f'期待我们下次共同探索银河系更多的奥秘哦!{name}', '我们来啦,神奇的银河系!')
需要的图片(与名字相对应)需下载图片较多,请耐心下载:
太阳纹理.jpg

水星纹理.jpg

金星纹理.jpg

月球纹理.png

火星纹理.jpg

土星纹理.jpg

木星纹理.jpg
天王星纹理.jpg

海王星纹理.jpg

宇宙.png

星球纹理1.png

星球纹理2.jpg

星球纹理3.png