From 70e991aa58d886d1ef77fca9e16f5aceab6d0321 Mon Sep 17 00:00:00 2001 From: march3 Date: Tue, 6 Feb 2024 16:18:23 +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_2.py | 143 +++++++++++++++++++++ simulators/ursina/entities/entity_utils.py | 19 ++- 2 files changed, 158 insertions(+), 4 deletions(-) create mode 100644 sim_scenes/featured/earth_3d_2.py diff --git a/sim_scenes/featured/earth_3d_2.py b/sim_scenes/featured/earth_3d_2.py new file mode 100644 index 0000000..3b1e9d4 --- /dev/null +++ b/sim_scenes/featured/earth_3d_2.py @@ -0,0 +1,143 @@ +# -*- 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 diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index 42f9108..f02b642 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -23,7 +23,6 @@ import math import numpy as np - def create_name_text(parent): """ @@ -190,7 +189,8 @@ def create_trail_sphere(parent, pos): # return value, direction -def create_directional_light(position, target=None, shadows=False, light_num=1, light_color=None): +def create_directional_light(position, target=None, shadows=False, light_num=1, light_color=None, + look_at_target_always=False): """ 创建平行光(DirectionalLight) @param position: 光源位置 @@ -228,13 +228,23 @@ def create_directional_light(position, target=None, shadows=False, light_num=1, if target is not None: for light in lights: + if hasattr(target, "planet"): if hasattr(target.planet, "main_entity"): light.look_at(target.planet.main_entity) + _target = target.planet.main_entity else: light.look_at(target.planet) + _target = target.planet else: light.look_at(target) + _target = target + + if look_at_target_always: + def light_update(): + light.look_at(_target) + + light.update = light_update if shadows: return lit_with_shadows_shader @@ -414,9 +424,10 @@ def create_foreground(foreground_img): texture=foreground_img, color=color.white, origin=(-.48, .48, -.48), - scale=(width*2, height), + scale=(width * 2, height), position=(-0.86, -0.33, 0) ) + # foreground = Entity(model='quad', scale=(1, 1), texture=foreground_img, eternal=True) # 设置前景图片层的位置和缩放 @@ -493,8 +504,8 @@ def create_trail_info(body, trail): if __name__ == '__main__': from ursina import * + app = Ursina() create_foreground("sun.jpg") EditorCamera() app.run() - -- GitLab