From 950dbad7a21d9e86c4ad1546e407ba23020a7311 Mon Sep 17 00:00:00 2001 From: march3 Date: Wed, 24 Jan 2024 20:40:22 +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 --- sim_scenes/featured/bodies_size_sim.py | 128 +++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 sim_scenes/featured/bodies_size_sim.py diff --git a/sim_scenes/featured/bodies_size_sim.py b/sim_scenes/featured/bodies_size_sim.py new file mode 100644 index 0000000..36734ab --- /dev/null +++ b/sim_scenes/featured/bodies_size_sim.py @@ -0,0 +1,128 @@ +# -*- coding:utf-8 -*- +# title :天体大小比较 +# description :天体大小比较 +# author :Python超人 +# date :2024-01-24 +# link :https://gitcode.net/pythoncr/ +# python_version :3.9 +# ============================================================================== +import threading + +from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, Moon, Callisto, Europa, \ + Ganymede, Sirius +from bodies import Rigel, Bellatrix, Alcyone, Antares, Arcturus, Aldebaran, Betelgeuse +from bodies import EtaCarinae, YCanumVenaticorum, VYCanisMajoris, UYScuti, CarinaeV382, Stephenson_2_18 + +from bodies.jupiter_system import Io +from common.consts import SECONDS_PER_HOUR, SECONDS_PER_DAY, AU +from sim_scenes.func import ursina_run, create_sphere_sky +from sim_scenes.universe_sim_scenes import UniverseSimScenes +from simulators.ursina.entities.body_timer import TimeData, AppTimeUtil +from simulators.ursina.entities.entity_utils import create_directional_light +from simulators.ursina.ursina_event import UrsinaEvent +from simulators.ursina.ursina_config import UrsinaConfig +import ursina +from ursina import camera, time, Vec3, application + + +class BodiesSizeSim(UniverseSimScenes): + def __init__(self): + self.D = AU / 30000 + # earth1 = Earth("地球1", init_position=[0, 0, 0], rotate_angle=-23.44) + self.bodies = [ + Pluto(name="冥王星", init_position=[-4*self.D, 0, 0]), + Moon("月球", init_position=[-3*self.D, 0, 0]), + Io(name="木卫一", init_position=[-2*self.D, 0, 0]), + Europa(name="木卫二", init_position=[-self.D, 0, 0]), + Ganymede(name="木卫三", init_position=[0, 0, 0]), + Callisto(name="木卫四", init_position=[self.D, 0, 0]), + Mercury(name="水星", init_position=[2*self.D, 0, 0]), + Mars(name="火星", init_position=[-4*self.D, self.D, self.D]), + Venus(name="金星", init_position=[-self.D, self.D, self.D]), + Earth("地球", texture="earth2.jpg", rotate_angle=0, init_position=[3 * self.D, self.D, self.D]), + Uranus(name="天王星", init_position=[-6*self.D, 5*self.D, 5*self.D]), + Neptune(name="海王星", init_position=[6*self.D, 5*self.D, 5*self.D]), + Saturn(name="土星", init_position=[-20*self.D, 11*self.D, 30*self.D]), # .show_rings(False), + Jupiter(name="木星", texture='jupiter_hd.jpg', init_position=[25*self.D, 14*self.D, 25*self.D]), + Sun(name="太阳", init_position=[70*self.D, 70*self.D, 250*self.D]), + Sirius(name="天狼星A", init_position=[-90*self.D, 120*self.D, 450*self.D]), + Alcyone(name="昴宿六", init_position=[-900*self.D, 1200*self.D, 1200*self.D]), # 质量倍数 6 半径倍数 9.5 + Arcturus(name="大角星", init_position=[2000*self.D, 3000*self.D, 4000*self.D]), # 质量倍数 1.1 半径倍数 25.7 + Aldebaran(name="毕宿五", init_position=[-5000*self.D, 4000*self.D, 9000*self.D]), # 质量倍数 1.16 半径倍数 44.13 + Rigel(name="参宿七", init_position=[9000*self.D, 8000*self.D, 13000*self.D]), # 质量倍数 18 半径倍数 78 + # # YCanumVenaticorum(name="猎犬座Y", init_position=[-90*self.D, 120*self.D, 450*self.D]), # 质量倍数 3.0 半径倍数 215 + EtaCarinae(name="海山二", init_position=[-15000*self.D, 28000*self.D, 45000*self.D]), # 质量倍数 125 半径倍数 278 + # # Antares(name="心宿二", init_position=[-90*self.D, 120*self.D, 450*self.D]), # 质量倍数 15 半径倍数 680 + CarinaeV382(name="船底座V382", init_position=[35000*self.D, 70000*self.D, 150000*self.D]), # 质量倍数 39 半径倍数 747 + # # Betelgeuse(name="参宿四", init_position=[-90*self.D, 120*self.D, 450*self.D]), # 质量倍数 19 半径倍数 1180 + VYCanisMajoris(name="大犬座VY", init_position=[-85000*self.D, 140000*self.D, 360000*self.D]), # 质量倍数 30 半径倍数 1400 + # # UYScuti(name="盾牌座 UY", init_position=[-85000*self.D, 140000*self.D, 360000*self.D]), # 盾牌座 UY 质量倍数 10 半径倍数 1708 + Stephenson_2_18(name="史蒂文森2-18", init_position=[95000*self.D, 200000*self.D, 800000*self.D]) # 史蒂文森2-18 质量倍数 40.0 半径倍数 2150 + ] + + for body in self.bodies: + # if body.rotation_speed == 0: + body.rotation_speed = 10 + body.init_velocity = [0, 0, 0] + body.ignore_mass = True + + def on_ready(self): + # 运行前触发 + # 为了较好的立体效果,可以增加太阳光线,光线直射地球(target=earth) + create_directional_light(position=([-1e2, -1e2, -5e4]), + light_num=3, + target= self.bodies[0]) + camera.clip_plane_near = 0.001 + camera.clip_plane_far = 50000000 + camera.fov = 60 + application.time_scale = 0.001 + sky = create_sphere_sky(scale=100000) + # sky.alpha = 0.5 + # sky.rotation_y = -90 + sky.rotation_x = 200 + # sky.rotation_z = 200 + + # for idx, body in enumerate(self.bodies): + # if idx <= len(body_rotation_y) - 1: + # body.planet.rotation_y = body_rotation_y[idx] + + # interval = 5 + + def on_timer_changed(self, time_data: TimeData): + pass + + def run(self): + # 运行中,每时每刻都会触发 on_timer_changed + UrsinaEvent.on_timer_changed_subscription(self.on_timer_changed) + # 运行前会触发 on_ready + UrsinaEvent.on_ready_subscription(self.on_ready) + + # 使用 ursina 查看的运行效果 + # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 + # position = 左-右+、上+下-、前+后- + ursina_run(self.bodies, SECONDS_PER_HOUR / 2, + position=[0, 0, -5e4], + # position=[0, 2e4, -15e4], # 海王星 + # position=[0, 2e4, -35e4], # 木星 + # position=[0, 35e4, -150e4], # 太阳 + # position=[0, 50e4, -250e4], # 天狼星 + # position=[0, 500e4, -2400e4], # 昴宿六 + # position=[0, 1500e4, -5500e4], # 大角星 + # position=[0, 2500e4, -10000e4], # 毕宿五 + # position=[0, 5000e4, -20000e4], # 参宿七 + # position=[0, 15000e4, -55000e4], # 海山二 + # position=[0, 38000e4, -150000e4], # 船底座V382 + # position=[0, 80000e4, -300000e4], # 盾牌座 UY + # position=[0, 70000e4, -280000e4], # 史蒂文森2-18 + cosmic_bg='', + # show_name=True, + show_control_info=False, + show_exit_button=False, + show_camera_info=False, + show_grid=False, + # view_closely=True, + timer_enabled=True) + + +if __name__ == '__main__': + BodiesSizeSim().run() -- GitLab