From 23a0c521c77a18154dc695c216c208cd875df32f Mon Sep 17 00:00:00 2001 From: march3 Date: Tue, 26 Mar 2024 12:51:45 +0800 Subject: [PATCH] =?UTF-8?q?Python=E8=B6=85=E4=BA=BA-=E5=AE=87=E5=AE=99?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__init__.py" | 1 + .../\345\262\251\347\237\263.py" | 10 +++++ ...41\346\213\237\345\234\272\346\231\257.py" | 43 +++++++++++++++---- ...35\346\212\244\345\234\260\347\220\203.py" | 37 ++++++++++++++++ 4 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 "\345\274\225\345\212\233\344\270\226\347\225\214/\344\270\207\347\211\251/\345\262\251\347\237\263.py" create mode 100644 "\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\256\236\351\252\214\345\256\244/\345\244\252\351\230\263\347\263\273/\346\234\250\346\234\210\344\277\235\346\212\244\345\234\260\347\220\203.py" diff --git "a/\345\274\225\345\212\233\344\270\226\347\225\214/__init__.py" "b/\345\274\225\345\212\233\344\270\226\347\225\214/__init__.py" index 2a2709d..c95d390 100644 --- "a/\345\274\225\345\212\233\344\270\226\347\225\214/__init__.py" +++ "b/\345\274\225\345\212\233\344\270\226\347\225\214/__init__.py" @@ -2,3 +2,4 @@ from 引力世界.造物主 import 造物主 from 引力世界.模拟场景 import 模拟场景 from 引力世界.万物.太阳系 import * +from 引力世界.万物.岩石 import * diff --git "a/\345\274\225\345\212\233\344\270\226\347\225\214/\344\270\207\347\211\251/\345\262\251\347\237\263.py" "b/\345\274\225\345\212\233\344\270\226\347\225\214/\344\270\207\347\211\251/\345\262\251\347\237\263.py" new file mode 100644 index 0000000..733dee3 --- /dev/null +++ "b/\345\274\225\345\212\233\344\270\226\347\225\214/\344\270\207\347\211\251/\345\262\251\347\237\263.py" @@ -0,0 +1,10 @@ +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'], 岩石) diff --git "a/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\234\272\346\231\257.py" "b/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\234\272\346\231\257.py" index 7243d0f..f1c4f36 100644 --- "a/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\234\272\346\231\257.py" +++ "b/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\234\272\346\231\257.py" @@ -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 from common.consts import SECONDS_PER_DAY, AU from bodies.body import Body +from objs.obj import Obj from bodies import * from sim_scenes.func import create_sphere_sky, ursina_run from sim_scenes.universe_sim_scenes import UniverseSimScenes @@ -27,11 +28,14 @@ import numpy as np 关闭=False 打开=True 无=None +是=True +否=False class 模拟配置: 显示轨道 = 关闭 地月距离倍数 = 1.0 中心天体=无 + 显示坐标轴=否 class 模拟场景(UniverseSimScenes): @@ -58,7 +62,7 @@ class 模拟场景(UniverseSimScenes): def 获取天体列表(self): for p in vars(self): f = getattr(self, p) - if isinstance(f, Body): + if isinstance(f, Body) or isinstance(f, Obj): yield f def 获取坐标和速度(self, 天体名称): @@ -91,13 +95,13 @@ class 模拟场景(UniverseSimScenes): UrsinaConfig.trail_type = "line" # UrsinaConfig.trail_length = 91 # UrsinaConfig.trail_type = "line" - UrsinaConfig.trail_length = 420 + UrsinaConfig.trail_length = 200 # UrsinaConfig.trail_length = 1000 - UrsinaConfig.trail_factor = 3 - UrsinaConfig.trail_thickness_factor = 3 - - WorldGrid().draw_axises(3) + UrsinaConfig.trail_factor = 2 + UrsinaConfig.trail_thickness_factor = 2 + if self.配置项.显示坐标轴: + WorldGrid().draw_axises(3) camera.clip_plane_near = 0.1 camera.clip_plane_far = 51000000 @@ -116,6 +120,9 @@ class 模拟场景(UniverseSimScenes): bodies = list(self.获取天体列表()) + for body in bodies: + body.rotate_angle -= 30 + UrsinaEvent.on_ready_subscription(self.on_ready) # UrsinaEvent.on_timer_changed_subscription(on_timer_changed) @@ -139,6 +146,7 @@ class 太阳系模拟场景(模拟场景): start_time=start_time, days=orbital_days, segments=100) + points = self.rotate_points(points) if self.配置项.中心天体 is None: center_pos = center_body.position @@ -150,6 +158,20 @@ class 太阳系模拟场景(模拟场景): alpha=alpha) 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): """ 创建太阳系天体的真实轨迹(太阳和哈雷彗星除外) @@ -233,8 +255,10 @@ class 太阳系模拟场景(模拟场景): if not self.配置项.中心天体 is None: 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: body.velocity = np.array(velocity) @@ -332,12 +356,15 @@ class 太阳系模拟场景(模拟场景): self.bodies = list(self.获取天体列表()) + # for body in self.bodies: + # body.rotate_angle -= 30 + UrsinaEvent.on_ready_subscription(self.on_ready) UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed) ursina_run(self.bodies, SECONDS_PER_DAY, position=(0, 0, -2 * AU), cosmic_bg="", - gravity_works=False, + # gravity_works=False, timer_enabled=True, show_grid=False, show_camera_info=False, diff --git "a/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\256\236\351\252\214\345\256\244/\345\244\252\351\230\263\347\263\273/\346\234\250\346\234\210\344\277\235\346\212\244\345\234\260\347\220\203.py" "b/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\256\236\351\252\214\345\256\244/\345\244\252\351\230\263\347\263\273/\346\234\250\346\234\210\344\277\235\346\212\244\345\234\260\347\220\203.py" new file mode 100644 index 0000000..787565c --- /dev/null +++ "b/\345\274\225\345\212\233\344\270\226\347\225\214/\346\250\241\346\213\237\345\256\236\351\252\214\345\256\244/\345\244\252\351\230\263\347\263\273/\346\234\250\346\234\210\344\277\235\346\212\244\345\234\260\347\220\203.py" @@ -0,0 +1,37 @@ +# -*- 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') -- GitLab