# -*- coding:utf-8 -*- # title :地球3D效果 # description :地球3D效果 # author :Python超人 # date :2023-11-28 # link :https://gitcode.net/pythoncr/ # python_version :3.8 # ============================================================================== 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, -52e3], 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, -38e3], 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", rotation_speed=100, texture="earth-huge.jpg", rotate_angle=-25, 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) * 40, 0, 0], ).set_ignore_gravity(True) jupiter = Jupiter(init_position=[3 * AU / 100, AU / 20, AU / 5], texture="jupiter_hd.jpg", distance_scale=0.01, size_scale=0.2, init_velocity=[-(29.79 + 1.03) * 30, 0, 0], ).set_ignore_gravity(True) # 创建云层(texture纹理图使用了透明云层的图片,云层的 size_scale 要稍微比地球大一点) clouds = Earth(name="地球云层", texture="earth-huge-cn-flag.png", rotate_angle=-25, rotation_speed=100, size_scale=1.001, parent=earth) bodies = [earth, clouds, moon, jupiter, space_ship, space_station] # bodies = [earth] # TODO: 开启3D摄像机 from simulators.ursina.entities.camera3d import Camera3d # 3D摄像机初始化(两眼到鼻梁的距离为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(texture="bg_pan2.jpg", scale=10000, rotation_x=20, rotation_y=160, rotation_z=20) # sky = create_sphere_sky(texture="cosmic_pan_02\cosmic_pan_1.jpg", scale=10000, rotation_y=150) earth.planet.rotation_y = -100 clouds.planet.rotation_y = -100 clouds.planet.alpha = 0.5 # moon.planet.rotation_x = -90 moon.planet.rotation_y = 100 # 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter) create_directional_light(position=(10.5e3, -1e3, -175e3), light_num=1, target=moon, look_at_target_always=True) def on_timer_changed(time_data): global sky # print(earth.planet.rotation_y) sky.rotation_z -= 0.004 p = space_ship.init_position space_ship.init_position = (p[0], p[1], p[2] + 0.5e1) space_station.planet.rotation_z += 0.1 p = space_station.init_position space_station.init_position = (p[0], p[1], p[2] + 0.5e1) if abs(earth.planet.rotation_y) > 600: 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) # camera.parent.look_at(earth.planet) # # camera.rotation_x = 0 # # camera.rotation_y = 0 # camera.rotation_z = 0 UniverseSimScenes.set_window_size((1920, 1079), False) UrsinaEvent.on_ready_subscription(on_ready) UrsinaEvent.on_timer_changed_subscription(on_timer_changed) # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, 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