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

Python超人-宇宙模拟器

上级 50f71afe
# -*- coding:utf-8 -*-
# title :哈雷彗星场景模拟
# description :哈雷彗星场景模拟
# title :哈雷彗星场景半真实模拟
# description :哈雷彗星运行轨道使用了万有引力,其他天体使用 astropy 包的真实数据
# author :Python超人
# date :2023-10-28
# link :https://gitcode.net/pythoncr/
......@@ -25,6 +25,15 @@ from simulators.ursina.ui.control_ui import ControlUI
from simulators.ursina.ursina_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent
from simulators.ursina.ursina_mesh import create_orbit_by_points
from dataclasses import dataclass
from dataclasses import field
@dataclass(order=True)
class HalleyCometParams:
start_time: str = field(default='1983-03-20 00:00:00')
init_velocity: list[float] = field(default_factory=[3.34, 0, 10.718])
init_position: list[float] = field(default_factory=[0, 0.5 * AU, -10 * AU])
class HalleyCometSim:
......@@ -32,13 +41,17 @@ class HalleyCometSim:
哈雷彗星场景模拟
"""
def __init__(self, start_time=None):
if start_time is None:
self.start_time = Time.now()
elif isinstance(start_time, str):
self.start_time = conv_to_astropy_time(start_time)
def __init__(self, params=None):
if params is None:
self.params = HalleyCometParams()
else:
self.start_time = start_time
self.params = params
if isinstance(params.start_time, str):
self.start_time = conv_to_astropy_time(params.start_time)
else:
self.start_time = params.start_time
# print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai')))
def build_solar_system(self):
......@@ -46,9 +59,9 @@ class HalleyCometSim:
show_trail = False
self.sun = Sun(size_scale=0.6e2, show_trail=show_trail)
self.mercury = Mercury(size_scale=5e3, show_trail=show_trail)
self.venus = Venus(size_scale=5e3, show_trail=show_trail)
self.earth = Earth(size_scale=5e3, rotate_angle=0, show_trail=show_trail)
self.mars = Mars(size_scale=5e3, show_trail=show_trail)
self.venus = Venus(size_scale=3e3, show_trail=show_trail)
self.earth = Earth(size_scale=3e3, rotate_angle=0, show_trail=show_trail)
self.mars = Mars(size_scale=4e3, show_trail=show_trail)
self.jupiter = Jupiter(size_scale=2.5e3, show_trail=show_trail)
self.saturn = Saturn(size_scale=2.5e3, show_trail=show_trail)
self.uranus = Uranus(size_scale=6e3, show_trail=show_trail)
......@@ -96,13 +109,9 @@ class HalleyCometSim:
# 哈雷彗星的平均运行速度约为每小时 70,000 英里或每小时 126,000 公里 。(35公里/秒)
# 每76.1年环绕太阳一周的周期彗星
self.halley_comet = HalleComet( # size_scale=4e7,
size_scale=0.2e8,
# [3.34, 0, 10.7] 2060-4-
# [3.34, 0, 10.712] 2061-5
# [3.34, 0, 10.715] 2061-6-24
# [3.34, 0, 10.718] 2061-8
init_velocity=[3.34, 0, 10.718],
init_position=[0, 0.5 * AU, -10 * AU]) \
size_scale=0.4e8,
init_velocity=self.params.init_velocity,
init_position=self.params.init_position) \
.set_light_disable(True)
self.bodies.append(self.halley_comet)
......@@ -125,10 +134,10 @@ class HalleyCometSim:
@return:
"""
# 创建天空
UrsinaConfig.trail_type = "line"
UrsinaConfig.trail_length = 91
# UrsinaConfig.trail_length = 1000
UrsinaConfig.trail_thickness_factor = 3
# UrsinaConfig.trail_type = "line"
# UrsinaConfig.trail_thickness_factor = 3
# UrsinaConfig.trail_length = 91
UrsinaConfig.trail_length = 200
# camera.clip_plane_near = 0.1
camera.clip_plane_far = 1000000
create_sphere_sky(scale=200000)
......@@ -187,6 +196,7 @@ class HalleyCometSim:
self.text_panel.text = "哈雷彗星距离太阳:%.3f AU" % (d / AU)
self.set_bodies_position(time_data)
self.show_clock(dt)
for i, orbit_line in enumerate(self.orbit_lines):
......@@ -201,7 +211,16 @@ if __name__ == '__main__':
# 上次通过近日点: 1986年2月9日
# 下次通过近日点: 2061年7月28日
# 远日点 35.1 AU 2023年12月9日
sim = HalleyCometSim(start_time='1983-03-20 00:00:00')
# [3.34, 0, 10.7] 2060-4-
# [3.34, 0, 10.712] 2061-5
# [3.34, 0, 10.715] 2061-6-24
# [3.34, 0, 10.718] 2061-8
params = HalleyCometParams(
start_time='1983-03-20 00:00:00',
init_velocity=[3.34, 0, 10.718],
init_position=[0, 0.5 * AU, -10 * AU]
)
sim = HalleyCometSim(params)
sim.build()
# 订阅事件后,上面2个函数功能才会起作用
......
......@@ -48,7 +48,7 @@ class Simulator(metaclass=ABCMeta):
for idx, view in enumerate(self.body_views):
body = self.bodies_sys.bodies[idx]
body.start_time = dt
body.dt = dt
view.appeared = body.appeared
if not view.appeared:
view.disappear()
......
......@@ -227,6 +227,11 @@ class Planet(Entity):
self.rotate_axis_init_scale = self.rotate_axis_line.scale
self.rotate_axis_line.scale = self.rotate_axis_init_scale * UrsinaConfig.body_size_factor
# def self_rotate(self, dt):
# rotspeed = self.rotation_speed * (dt / 3600) / 2.4 * \
# UrsinaConfig.ROTATION_SPEED_FACTOR * UrsinaConfig.body_spin_factor
# self.rotation_y -= rotspeed
def update(self):
self.change_body_scale()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册