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

Python超人-宇宙模拟器

上级 6668868a
...@@ -2,3 +2,4 @@ from 引力世界.造物主 import 造物主 ...@@ -2,3 +2,4 @@ from 引力世界.造物主 import 造物主
from 引力世界.模拟场景 import 模拟场景 from 引力世界.模拟场景 import 模拟场景
from 引力世界.万物.太阳系 import * from 引力世界.万物.太阳系 import *
from 引力世界.万物.岩石 import *
from objs import *
from 引力世界 import 造物主
class 岩石(Rock):
def __init__(self, 初始位置=[0, 0, 0], 初始速度=[0, 0, 0], 缩放倍数=1):
super(岩石, self).__init__(init_velocity=初始速度, init_position=初始位置, size_scale=缩放倍数)
造物主.登记(['岩石', 'rock'], 岩石)
...@@ -12,6 +12,7 @@ from common.celestial_data_service import set_solar_system_celestial_position, c ...@@ -12,6 +12,7 @@ from common.celestial_data_service import set_solar_system_celestial_position, c
get_reality_orbit_points, get_body_posvel, recalc_moon_position, calc_solar_acceleration get_reality_orbit_points, get_body_posvel, recalc_moon_position, calc_solar_acceleration
from common.consts import SECONDS_PER_DAY, AU from common.consts import SECONDS_PER_DAY, AU
from bodies.body import Body from bodies.body import Body
from objs.obj import Obj
from bodies import * from bodies import *
from sim_scenes.func import create_sphere_sky, ursina_run from sim_scenes.func import create_sphere_sky, ursina_run
from sim_scenes.universe_sim_scenes import UniverseSimScenes from sim_scenes.universe_sim_scenes import UniverseSimScenes
...@@ -27,11 +28,14 @@ import numpy as np ...@@ -27,11 +28,14 @@ import numpy as np
关闭=False 关闭=False
打开=True 打开=True
=None =None
=True
=False
class 模拟配置: class 模拟配置:
显示轨道 = 关闭 显示轨道 = 关闭
地月距离倍数 = 1.0 地月距离倍数 = 1.0
中心天体= 中心天体=
显示坐标轴=
class 模拟场景(UniverseSimScenes): class 模拟场景(UniverseSimScenes):
...@@ -58,7 +62,7 @@ class 模拟场景(UniverseSimScenes): ...@@ -58,7 +62,7 @@ class 模拟场景(UniverseSimScenes):
def 获取天体列表(self): def 获取天体列表(self):
for p in vars(self): for p in vars(self):
f = getattr(self, p) f = getattr(self, p)
if isinstance(f, Body): if isinstance(f, Body) or isinstance(f, Obj):
yield f yield f
def 获取坐标和速度(self, 天体名称): def 获取坐标和速度(self, 天体名称):
...@@ -91,13 +95,13 @@ class 模拟场景(UniverseSimScenes): ...@@ -91,13 +95,13 @@ class 模拟场景(UniverseSimScenes):
UrsinaConfig.trail_type = "line" UrsinaConfig.trail_type = "line"
# UrsinaConfig.trail_length = 91 # UrsinaConfig.trail_length = 91
# UrsinaConfig.trail_type = "line" # UrsinaConfig.trail_type = "line"
UrsinaConfig.trail_length = 420 UrsinaConfig.trail_length = 200
# UrsinaConfig.trail_length = 1000 # UrsinaConfig.trail_length = 1000
UrsinaConfig.trail_factor = 3 UrsinaConfig.trail_factor = 2
UrsinaConfig.trail_thickness_factor = 3 UrsinaConfig.trail_thickness_factor = 2
if self.配置项.显示坐标轴:
WorldGrid().draw_axises(3) WorldGrid().draw_axises(3)
camera.clip_plane_near = 0.1 camera.clip_plane_near = 0.1
camera.clip_plane_far = 51000000 camera.clip_plane_far = 51000000
...@@ -116,6 +120,9 @@ class 模拟场景(UniverseSimScenes): ...@@ -116,6 +120,9 @@ class 模拟场景(UniverseSimScenes):
bodies = list(self.获取天体列表()) bodies = list(self.获取天体列表())
for body in bodies:
body.rotate_angle -= 30
UrsinaEvent.on_ready_subscription(self.on_ready) UrsinaEvent.on_ready_subscription(self.on_ready)
# UrsinaEvent.on_timer_changed_subscription(on_timer_changed) # UrsinaEvent.on_timer_changed_subscription(on_timer_changed)
...@@ -139,6 +146,7 @@ class 太阳系模拟场景(模拟场景): ...@@ -139,6 +146,7 @@ class 太阳系模拟场景(模拟场景):
start_time=start_time, start_time=start_time,
days=orbital_days, days=orbital_days,
segments=100) segments=100)
points = self.rotate_points(points)
if self.配置项.中心天体 is None: if self.配置项.中心天体 is None:
center_pos = center_body.position center_pos = center_body.position
...@@ -150,6 +158,20 @@ class 太阳系模拟场景(模拟场景): ...@@ -150,6 +158,20 @@ class 太阳系模拟场景(模拟场景):
alpha=alpha) alpha=alpha)
return orbit_line return orbit_line
def rotate_points(self, points):
# 将角度转换为弧度
angle = np.radians(22)
# 创建旋转矩阵
rotation_matrix = np.array([
[1, 0, 0],
[0, np.cos(angle), -np.sin(angle)],
[0, np.sin(angle), np.cos(angle)]
])
# 对每个点应用旋转矩阵
rotated_points = [np.dot(rotation_matrix, point) for point in points]
return rotated_points
def create_orbit_lines(self): def create_orbit_lines(self):
""" """
创建太阳系天体的真实轨迹(太阳和哈雷彗星除外) 创建太阳系天体的真实轨迹(太阳和哈雷彗星除外)
...@@ -233,8 +255,10 @@ class 太阳系模拟场景(模拟场景): ...@@ -233,8 +255,10 @@ class 太阳系模拟场景(模拟场景):
if not self.配置项.中心天体 is None: if not self.配置项.中心天体 is None:
position = [position[0]-center_pos[0],position[1]-center_pos[1],position[2]-center_pos[2]] position = [position[0]-center_pos[0],position[1]-center_pos[1],position[2]-center_pos[2]]
positions = self.rotate_points([position])
# 实时调整天体的位置和速度 # 实时调整天体的位置和速度
body.position = np.array(position) body.position = np.array(positions[0])
if set_velocity: if set_velocity:
body.velocity = np.array(velocity) body.velocity = np.array(velocity)
...@@ -332,12 +356,15 @@ class 太阳系模拟场景(模拟场景): ...@@ -332,12 +356,15 @@ class 太阳系模拟场景(模拟场景):
self.bodies = list(self.获取天体列表()) self.bodies = list(self.获取天体列表())
# for body in self.bodies:
# body.rotate_angle -= 30
UrsinaEvent.on_ready_subscription(self.on_ready) UrsinaEvent.on_ready_subscription(self.on_ready)
UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed) UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed)
ursina_run(self.bodies, SECONDS_PER_DAY, position=(0, 0, -2 * AU), ursina_run(self.bodies, SECONDS_PER_DAY, position=(0, 0, -2 * AU),
cosmic_bg="", cosmic_bg="",
gravity_works=False, # gravity_works=False,
timer_enabled=True, timer_enabled=True,
show_grid=False, show_grid=False,
show_camera_info=False, show_camera_info=False,
......
# -*- coding:utf-8 -*-
# title :太阳地球月球模拟
# description :太阳地球月球模拟
# date :2024-03-20
# python_version :3.9
# ==============================================================================
from 引力世界 import 造物主
from 引力世界.模拟场景 import *
class 木月保护地球模拟(太阳系模拟场景):
def 配置(self, 配置项: 模拟配置):
配置项.显示轨道 = 打开
配置项.地月距离倍数 = 50
配置项.显示坐标轴 =
# 配置项.中心天体 = self.太阳
def 造物(self):
self.太阳 = 造物主.造物(名称='太阳', 缩放倍数=8e1)
# self.太阳2 = 造物主.造物(名称='太阳', 缩放倍数=5e1)
self.地球 = 造物主.造物(名称='地球', 缩放倍数=1.5e3)
self.地球.ignore_mass = True
self.月球 = 造物主.造物(名称='月球', 缩放倍数=2.5e3)
self.月球.ignore_mass = True
self.木星 = 造物主.造物(名称='木星', 缩放倍数=5e2)
self.木星.ignore_mass = True
# for i in range(1, 50):
# setattr(self, "岩石" + str(i), 造物主.造物(名称='岩石', 缩放倍数=9*pow(10,i)))
# s = getattr(self, "岩石" + str(i))
# s.gravity_only_for = [ self.太阳]
场景 = 木月保护地球模拟()
# 场景.摄像机看向(场景.地球)
场景.运行(运行时间='2024-09-24 00:00:00')
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册