From 18b4e75c561cce1900dff7b3ad5853300e793e7d Mon Sep 17 00:00:00 2001 From: march3 Date: Mon, 22 Jan 2024 14:38:55 +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/earth_3d.py | 85 ++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/sim_scenes/featured/earth_3d.py b/sim_scenes/featured/earth_3d.py index e168344..f415241 100644 --- a/sim_scenes/featured/earth_3d.py +++ b/sim_scenes/featured/earth_3d.py @@ -6,52 +6,112 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.8 # ============================================================================== -from bodies import Earth -from common.consts import SECONDS_PER_HOUR +from bodies import Earth, Moon, Jupiter +from common.consts import SECONDS_PER_HOUR, AU +from objs import CoreValagaClas +from objs.sci_fi_space_station import ScifiSpaceStation from sim_scenes.func import ursina_run, create_sphere_sky from sim_scenes.universe_sim_scenes import UniverseSimScenes +from simulators.ursina.entities.entity_utils import create_directional_light from simulators.ursina.ursina_event import UrsinaEvent if __name__ == '__main__': """ 地球3D效果(透视3D地球) """ + space_station = ScifiSpaceStation(name="空间站", + size_scale=0.4, + # init_position=[0.46 * mars_radius, 0, -3.55e4], + # init_position=[9e3, -2.3e3, -32e3], + init_position=[10.5e3, -1e3, -75e3], + init_velocity=[0, 0, 0]) \ + .set_ignore_gravity(True).set_light_disable(True) + + space_ship = CoreValagaClas(name="飞船", mass=1e30, color=(111, 140, 255), + # init_position=[0, 0, 0], + # init_position=[D, 0, -D], + # init_position=[0, D * 1.15, -D * 2.05], + init_position=[9e3, -1e3, -55e3], + init_velocity=[0, 0, 0], + # texture="core_valaga_clas_light.jpg", + # size_scale=self.SIZE_SCALE * 1e3 + size_scale=0.6 + ).set_ignore_gravity(True).set_light_disable(True) + # 创建带有云层的地球 earth = Earth( # texture="earth_hd.jpg", - texture="earth_hd_trans.png", + # texture="earth_hd_trans.png", + texture="earth-huge.jpg", rotate_angle=-23.44, init_position=[0, 0, 0], init_velocity=[0, 0, 0], size_scale=1) + moon = Moon(init_position=[AU / 60, AU / 80, AU / 10], + distance_scale=0.01, + size_scale=3, + init_velocity=[-(29.79 + 1.03) * 20, 0, 0], ).set_ignore_gravity(True) + + jupiter = Jupiter(init_position=[4 * AU / 100, AU / 20, AU / 5], texture="jupiter_hd.jpg", + distance_scale=0.01, + size_scale=0.2, + init_velocity=[-(29.79 + 1.03) * 20, 0, 0], ).set_ignore_gravity(True) # 创建云层(texture纹理图使用了透明云层的图片,云层的 size_scale 要稍微比地球大一点) - clouds = Earth(name="地球云层", texture="transparent_clouds.png", + clouds = Earth(name="地球云层", texture="earth-huge-cn-flag.png", rotate_angle=-23.44, - size_scale=1.001, parent=earth) + size_scale=1.002, parent=earth) - bodies = [earth, clouds] + bodies = [earth, clouds, space_station, moon, jupiter, space_ship] + # bodies = [earth] # TODO: 开启3D摄像机 from simulators.ursina.entities.camera3d import Camera3d # 3D摄像机初始化(两眼到鼻梁的距离为1000公里效果) - Camera3d.init(eye_distance=1000) - + Camera3d.init(eye_distance=400) # 录制: # sim_video_3d_cap.bat featured earth_3d earth_3d.mp4 + sky = None + def on_ready(): + global sky + from ursina import application + application.time_scale = 0.0001 # 运行前触发 - sky = create_sphere_sky(scale=10000, rotation_y=150) + sky = create_sphere_sky(texture="bg_pan2.jpg", scale=10000, rotation_y=150) + # sky = create_sphere_sky(texture="cosmic_pan_02\cosmic_pan_1.jpg", scale=10000, rotation_y=150) + + earth.planet.rotation_y = -120 + clouds.planet.rotation_y = -120 + clouds.planet.alpha = 0.5 + # space_station.planet.rotation_x = -90 + # moon.planet.rotation_x = -90 + moon.planet.rotation_y = 90 + + # 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter) + create_directional_light(position=(10.5e3, -1e3, -175e3), light_num=3, target=earth) def on_timer_changed(time_data): + global sky + print(earth.planet.rotation_y) - # 地球转了一圈(360)就停止,370是留些余量 - if abs(earth.planet.rotation_y) > 365: + sky.rotation_z += 0.004 + + space_station.planet.rotation_z += 0.1 + p = space_station.init_position + space_station.init_position = (p[0], p[1], p[2] + 0.5e1) + p = space_ship.init_position + space_ship.init_position = (p[0], p[1], p[2] + 0.5e1) + + if abs(earth.planet.rotation_y) > 218: exit(0) + + print("earth.rotation_y", abs(earth.planet.rotation_y)) + # from ursina import camera, Vec3, time # camera.parent.position += Vec3(0.0000001 * time_data.dt, 0, -0.0000003 * time_data.dt) # Camera3d.look_to(earth.planet) @@ -70,12 +130,13 @@ if __name__ == '__main__': # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, - SECONDS_PER_HOUR / 5, + SECONDS_PER_HOUR / 20, # SECONDS_PER_HOUR, position=(1.90 * earth.radius, 0, -40000), cosmic_bg="", # 无背景(黑色) show_grid=False, # 不显示网格 show_camera_info=False, # 不显示摄像机信息 show_control_info=False, # 不显示控制提示信息 + show_exit_button=False, timer_enabled=True, view_closely=0.001) # 近距离观看 view_closely=True或0.001 -- GitLab