提交 bf8772e1 编写于 作者: 三月三net's avatar 三月三net

太阳系三体模拟器

上级 e152a18e
...@@ -96,7 +96,7 @@ from simulators.simulator import Simulator ...@@ -96,7 +96,7 @@ from simulators.simulator import Simulator
from common.system import System from common.system import System
import time import time
import datetime import datetime
from ursina import EditorCamera from ursina import EditorCamera, PointLight, SpotLight, AmbientLight
player = None player = None
...@@ -133,18 +133,35 @@ class UrsinaSimulator(Simulator): ...@@ -133,18 +133,35 @@ class UrsinaSimulator(Simulator):
if self.check_elapsed_time(): if self.check_elapsed_time():
super().evolve(self.evolve_dt) super().evolve(self.evolve_dt)
def cosmic_background(self, texture='../textures/cosmic1.jpg'):
texture = load_texture(texture)
sky_dome = Entity(model='sky_dome', texture=texture, scale=300,
color=color.white,
position=(0, 0, 0),
rotation=(0, 0, 0))
def run(self, dt, **kwargs): def run(self, dt, **kwargs):
self.evolve_dt = dt self.evolve_dt = dt
# 设定时间间隔为1秒 # 设定时间间隔为1秒
self.interval = datetime.timedelta(seconds=0.01) self.interval = datetime.timedelta(seconds=0.01)
self.last_time = datetime.datetime.now() - datetime.timedelta(seconds=2) self.last_time = datetime.datetime.now() - datetime.timedelta(seconds=2)
if "light" in kwargs:
if kwargs["light"]:
li = PointLight()
# PointLight, SpotLight, AmbientLight
if "cosmic_bg" in kwargs:
cosmic_bg = kwargs["cosmic_bg"]
import os
if cosmic_bg is not None and os.path.exists(cosmic_bg):
self.cosmic_background(cosmic_bg)
EditorCamera() EditorCamera()
self.app.run() self.app.run()
if __name__ == '__main__': if __name__ == '__main__':
from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, Moon from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, Moon
from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY,SECONDS_PER_HALF_DAY from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, SECONDS_PER_HALF_DAY
""" """
3个太阳、1个地球 3个太阳、1个地球
...@@ -171,17 +188,17 @@ if __name__ == '__main__': ...@@ -171,17 +188,17 @@ if __name__ == '__main__':
# size_scale=4e3, texture="earth.png", distance_scale=1), # 地球放大 4000 倍,距离保持不变 # size_scale=4e3, texture="earth.png", distance_scale=1), # 地球放大 4000 倍,距离保持不变
# ] # ]
bodies = [ bodies = [
Sun(size_scale=0.8e2), # 太阳放大 80 倍 Sun(size_scale=0.8e2), # 太阳放大 80 倍
Mercury(size_scale=4e3, distance_scale=1.3), # 水星放大 4000 倍,距离放大 1.3 倍 Mercury(size_scale=4e3, distance_scale=1.3), # 水星放大 4000 倍,距离放大 1.3 倍
Venus(size_scale=4e3, distance_scale=1.3), # 金星放大 4000 倍,距离放大 1.3 倍 Venus(size_scale=4e3, distance_scale=1.3), # 金星放大 4000 倍,距离放大 1.3 倍
Earth(size_scale=4e3, distance_scale=1.3), # 地球放大 4000 倍,距离放大 1.3 倍 Earth(size_scale=4e3, distance_scale=1.3), # 地球放大 4000 倍,距离放大 1.3 倍
Moon(size_scale=4e3, distance_scale=1.3), Moon(size_scale=4e3, distance_scale=1.3),
Mars(size_scale=4e3, distance_scale=1.3), # 火星放大 4000 倍,距离放大 1.3 倍 Mars(size_scale=4e3, distance_scale=1.3), # 火星放大 4000 倍,距离放大 1.3 倍
Jupiter(size_scale=0.68e3, distance_scale=0.65), # 木星放大 680 倍,距离缩小到真实距离的 0.65 Jupiter(size_scale=0.68e3, distance_scale=0.65), # 木星放大 680 倍,距离缩小到真实距离的 0.65
Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52 Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52
Uranus(size_scale=0.8e3, distance_scale=0.36), # 天王星放大 800 倍,距离缩小到真实距离的 0.36 Uranus(size_scale=0.8e3, distance_scale=0.36), # 天王星放大 800 倍,距离缩小到真实距离的 0.36
Neptune(size_scale=1e3, distance_scale=0.27), # 海王星放大 1000 倍,距离缩小到真实距离的 0.27 Neptune(size_scale=1e3, distance_scale=0.27), # 海王星放大 1000 倍,距离缩小到真实距离的 0.27
Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除) Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除)
] ]
# bodies.append(Moon(size_scale=4e3, distance_scale=1.3)) # 月球放大 10 倍,距离保持不变) # bodies.append(Moon(size_scale=4e3, distance_scale=1.3)) # 月球放大 10 倍,距离保持不变)
...@@ -193,6 +210,8 @@ if __name__ == '__main__': ...@@ -193,6 +210,8 @@ if __name__ == '__main__':
simulator = UrsinaSimulator(body_sys) simulator = UrsinaSimulator(body_sys)
player = UrsinaPlayer((4000000, 800000000, 4000000), simulator.ursina_views) player = UrsinaPlayer((4000000, 800000000, 4000000), simulator.ursina_views)
# player = FirstPersonController() # player = FirstPersonController()
# player = UrsinaPlayer((0, 0, 0), simulator.ursina_views) # player = UrsinaPlayer((0, 0, 0), simulator.ursina_views)
...@@ -205,4 +224,7 @@ if __name__ == '__main__': ...@@ -205,4 +224,7 @@ if __name__ == '__main__':
# player._update() # player._update()
simulator.run(SECONDS_PER_DAY) light = True
cosmic_bg = '../textures/cosmic1.jpg'
# cosmic_bg = None
simulator.run(SECONDS_PER_DAY, light=light, cosmic_bg=cosmic_bg)
...@@ -140,8 +140,6 @@ class UrsinaPlayer(FirstPersonController): ...@@ -140,8 +140,6 @@ class UrsinaPlayer(FirstPersonController):
# camera.position = avg_pos + (0, 0, 20) # camera.position = avg_pos + (0, 0, 20)
# camera.rotation_x = -90 # camera.rotation_x = -90
def input(self, key): def input(self, key):
if key == "escape": if key == "escape":
if mouse.locked: if mouse.locked:
...@@ -198,7 +196,8 @@ class Planet(Entity): ...@@ -198,7 +196,8 @@ class Planet(Entity):
# self.angle = 0 # random.uniform(0.0005, 0.01) # self.angle = 0 # random.uniform(0.0005, 0.01)
# self.fastMode = 0 # self.fastMode = 0
# self.rotation = (random.randint(0, 360) for i in range(3)) # self.rotation = (random.randint(0, 360) for i in range(3))
self.rotspeed = random.uniform(0.25, 1.5) # 旋转速度和大小成反比(未使用真实数据)
self.rotspeed = 30000 / self.body_view.raduis # random.uniform(1.0, 2.0)
self.rotMode = 'x' # random.choice(["x", "y", "z"]) self.rotMode = 'x' # random.choice(["x", "y", "z"])
self.name = body_view.name self.name = body_view.name
...@@ -210,13 +209,16 @@ class Planet(Entity): ...@@ -210,13 +209,16 @@ class Planet(Entity):
# texture = self.__set_texture(body_view.texture) # texture = self.__set_texture(body_view.texture)
texture = load_texture(body_view.texture) texture = load_texture(body_view.texture)
# 将贴图旋转90度 # 将贴图旋转90度C:\ProgramData\Anaconda3\envs\tf_gpu\Lib\site-packages\ursina\models_compressed\diamond.ursinamesh
super().__init__(model="sphere", super().__init__(
scale=scale, # model=TorusMesh(radius=1e20, thickness=1.25e20, radial_segments=16, tubular_segments=32),
texture=texture, # model="sky_dome",
color=color.white, model="sphere",
position=pos, scale=scale,
rotation=(0, 0, 0)) texture=texture,
color=color.white,
position=pos,
rotation=(0, 0, 0))
# def __set_texture(self, image_file): # def __set_texture(self, image_file):
# """ # """
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册