# -*- coding:utf-8 -*- # title :恒星演示 # description :恒星演示 # author :Python超人 # date :2023-02-11 # link :https://gitcode.net/pythoncr/ # python_version :3.8 # ============================================================================== from bodies import Sun, Earth, Sirius, Rigel, Bellatrix, Alcyone, Antares, Arcturus, Aldebaran, Betelgeuse from bodies import EtaCarinae, YCanumVenaticorum, VYCanisMajoris, UYScuti, CarinaeV382, Stephenson_2_18 from common.consts import SECONDS_PER_WEEK, SECONDS_PER_MONTH, SECONDS_PER_YEAR, SECONDS_PER_DAY from sim_scenes.func import ursina_run from bodies.body import Body, AU if __name__ == '__main__': """ 恒星演示 """ # 构建恒星天体对象 D = 5e5 # 基本距离单位:km(随意赋值) SIZE_SCALE = 0.5 # 所有天体尺寸缩放保持一致 # TODO: ignore_mass=True # 注意:这里的算法是基于牛顿的万有引力(质量为0不受引力的影响在天体物理学中是不严谨) bodies = [ Earth(size_scale=SIZE_SCALE, ignore_mass=True), Sun(size_scale=SIZE_SCALE, ignore_mass=True), # 太阳 # Sirius(size_scale=SIZE_SCALE, ignore_mass=True), # 天狼星A 质量倍数 2.02 半径倍数 1.71 Bellatrix(size_scale=SIZE_SCALE, ignore_mass=True), # 参宿五 质量倍数 8.6 半径倍数 5.75 # Alcyone(size_scale=SIZE_SCALE, ignore_mass=True), # 昴宿六 质量倍数 6 半径倍数 9.5 Arcturus(size_scale=SIZE_SCALE, ignore_mass=True), # 大角星 质量倍数 1.1 半径倍数 25.7 # Aldebaran(size_scale=SIZE_SCALE, ignore_mass=True), # 毕宿五 质量倍数 1.16 半径倍数 44.13 Rigel(size_scale=SIZE_SCALE, ignore_mass=True), # 参宿七 质量倍数 18 半径倍数 78 # YCanumVenaticorum(size_scale=SIZE_SCALE, ignore_mass=True), # 猎犬座Y 质量倍数 3.0 半径倍数 215 EtaCarinae(size_scale=SIZE_SCALE, ignore_mass=True), # 海山二 质量倍数 125 半径倍数 278 # Antares(size_scale=SIZE_SCALE, ignore_mass=True), # 心宿二 质量倍数 15 半径倍数 680 CarinaeV382(size_scale=SIZE_SCALE, ignore_mass=True), # 船底座V382 质量倍数 39 半径倍数 747 # Betelgeuse(size_scale=SIZE_SCALE, ignore_mass=True), # 参宿四 质量倍数 19 半径倍数 1180 # VYCanisMajoris(size_scale=SIZE_SCALE, ignore_mass=True), # 大犬座VY 质量倍数 30 半径倍数 1400 # UYScuti(size_scale=SIZE_SCALE, ignore_mass=True), # 盾牌座 UY 质量倍数 10 半径倍数 1708 Stephenson_2_18(size_scale=SIZE_SCALE, ignore_mass=True) # 史蒂文森2-18 质量倍数 40.0 半径倍数 2150 ] distance_sum = 0 # 循环为每个恒星的初始位置进行赋值,方便演示 for idx, body in enumerate(bodies): body.rotation_speed /= 10 # 恒星的旋转速度减小10倍 if body.is_fixed_star: body.light_on = False # 关闭灯光效果 if idx == 0: # 这是地球 d = 0 else: d = pow((body.radius + bodies[idx - 1].radius) * SIZE_SCALE, 1.0) * 1.1 # 所有天体的初始速度为 0 body.init_velocity = [0, 0, 0] # 所有天体的初始位置进行赋值 body.init_position = [-body.radius * SIZE_SCALE / 1.1, body.radius * SIZE_SCALE / 1.1, d] distance_sum += d # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # M:摄像机移动加速 N:摄像机移动减速 # position = (左-右+、上+下-、前+后-) ursina_run(bodies, SECONDS_PER_WEEK, show_grid=False, position=(0, 30000, -AU / 500), show_name=True, bg_music="sounds/universe_03.mp3")