diff --git a/sim_lab/__init__.py b/sim_lab/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/sim_lab/earth_moon.py b/sim_lab/earth_moon.py new file mode 100644 index 0000000000000000000000000000000000000000..de50f6e25630f310a2bcc093cdcf9615b9bf5bc8 --- /dev/null +++ b/sim_lab/earth_moon.py @@ -0,0 +1,78 @@ +# -*- coding:utf-8 -*- +# title :地月场景模拟 +# description :地月场景模拟 +# author :Python超人 +# date :2023-02-11 +# link :https://gitcode.net/pythoncr/ +# python_version :3.8 +# ============================================================================== +from bodies import Body, Sun, Earth, Moon +from common.consts import SECONDS_PER_HOUR, SECONDS_PER_HALF_DAY, SECONDS_PER_DAY, SECONDS_PER_WEEK, SECONDS_PER_MONTH +from sim_scenes.func import ursina_run, camera_look_at +from bodies.body import AU +from simulators.ursina.entities.entity_utils import create_directional_light +from simulators.ursina.ursina_event import UrsinaEvent + +if __name__ == '__main__': + """ + 地球、月球 + """ + OFFSETTING = 0 + # TODO: 可以抵消月球带动地球的力,保持地球在原地 + # OFFSETTING = 0.01265 + bodies = [ + Earth(init_position=[0, 0, 0], texture="earth_hd.jpg", + init_velocity=[OFFSETTING, 0, 0], size_scale=0.5e1), # 地球放大 5 倍,距离保持不变 + Moon(init_position=[0, 0, 363104], # 距地距离约: 363104 至 405696 km + init_velocity=[-1.03, 0, 0], size_scale=1e1) # 月球放大 10 倍,距离保持不变 + ] + + from ursina.shaders import lit_with_shadows_shader + from ursina import Vec2, Vec4, Entity + + shader = lit_with_shadows_shader + shader.default_input = { + 'texture_scale': Vec2(1, 1), + 'texture_offset': Vec2(0, 0), + 'shadow_color': Vec4(0.1, 0.1, 0.1, .5), + } + Entity.default_shader = shader + + def on_ready(): + + Entity.body = Entity(model="sphere", texture='../textures/transparent.png', y=0, x=0, z=0,scale=10) + # 运行前触发 + # 运行开始前,将摄像机指向地球 + earth = bodies[0] + moon = bodies[1] + # 摄像机看向地球 + camera_look_at(earth) + e_pos = earth.planet.position + from ursina.lights import DirectionalLight + sun = DirectionalLight(shadow_map_resolution=(1024, 1024), position=earth.planet.position) + sun.look_at(moon.planet.position) + sun.rotation_x = 0 + Entity.sun = sun + sun._light.show_frustum() + # 创建太阳光 + shadows_shader = create_directional_light(position=(200, 0, -300), target=earth, shadows=True) + earth.planet.shadows = shadows_shader + moon.planet.shadows = shadows_shader + + + def on_timer_changed(time_data): + Entity.sun.update_bounds() + # Entity.sun.update_bounds(bodies[1].planet) + pass + + + UrsinaEvent.on_timer_changed_subscription(on_timer_changed) + UrsinaEvent.on_ready_subscription(on_ready) + + # 使用 ursina 查看的运行效果 + # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 + # position = 左-右+、上+下-、前+后- + ursina_run(bodies, SECONDS_PER_DAY, + position=(-300000, 1500000, -1000), + show_timer=True, + show_trail=True) diff --git a/sim_lab/light_shader.py b/sim_lab/light_shader.py new file mode 100644 index 0000000000000000000000000000000000000000..8b36baca184ff1f048e9b59b45cd05767b6096a7 --- /dev/null +++ b/sim_lab/light_shader.py @@ -0,0 +1,43 @@ +from ursina import * +from ursina.shaders import lit_with_shadows_shader +from ursina.lights import DirectionalLight + +from simulators.ursina.ursina_mesh import create_sphere + +shader = lit_with_shadows_shader +shader.default_input = { + 'texture_scale': Vec2(1, 1), + 'texture_offset': Vec2(0, 0), + 'shadow_color': Vec4(0.1, 0.1, 0.1, .5), +} + +Entity.default_shader = shader + +app = Ursina() + +moon = Entity(model=create_sphere(0.5, 32), texture="../textures/moon.png", y=1, color=color.light_gray) +earth = Entity(model=create_sphere(0.5, 32), texture='../textures/earth.png', y=1, x=1, z=3) +e_pos = earth.position + +sun = DirectionalLight(shadow_map_resolution=(1024, 1024), position=[e_pos[0], e_pos[1] + 1, e_pos[2] + 1]) +sun.look_at(moon) +sun._light.show_frustum() + + +# light = PointLight(parent=earth, intensity=10, range=10, color=color.white) + + +def update(): + moon.x += (held_keys['d'] - held_keys['a']) * time.dt + moon.y += (held_keys['e'] - held_keys['q']) * time.dt + moon.z += (held_keys['w'] - held_keys['s']) * time.dt + sun.update_bounds() + + +# scene.fog_density = (100, 500) +# scene.fog_color = color.orange +# scene.fog_density = (10, 50) +Sky(color=color.light_gray, texture="../textures/cosmic1.png") +EditorCamera() + +app.run() diff --git a/sim_scenes/solar_system/earth_moon.py b/sim_scenes/solar_system/earth_moon.py index 2a17073219eb6669a2dbb31c91af3af497d5bdde..770bcd3efa6f4a764bebee48d5374c27fc165e6c 100644 --- a/sim_scenes/solar_system/earth_moon.py +++ b/sim_scenes/solar_system/earth_moon.py @@ -35,10 +35,6 @@ if __name__ == '__main__': moon = bodies[1] # 摄像机看向地球 camera_look_at(earth) - # 创建太阳光 - shadows_shader = create_directional_light(position=(200, 0, -300), target=earth,shadows=True) - earth.planet.shadows = shadows_shader - moon.planet.shadows = shadows_shader UrsinaEvent.on_ready_subscription(on_ready) diff --git a/sim_scenes/wonders/sun_earth_moon.py b/sim_scenes/wonders/sun_earth_moon.py index 5486d143a07c2d037afb5635e31c82628c11962a..f322a49218855c9bc50f16d4aabda0e119a4c2f2 100644 --- a/sim_scenes/wonders/sun_earth_moon.py +++ b/sim_scenes/wonders/sun_earth_moon.py @@ -14,7 +14,7 @@ from simulators.ursina.ursina_event import UrsinaEvent if __name__ == '__main__': """ - 地球、月球 + 地月场景模拟 """ # 地球的Y方向初始速度 EARTH_INIT_VELOCITY = 0 # 0km/s diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index c00a8f5867cb157ebc5fa9511242955a2e021e12..f43fbc69db6c17784f0100b7d450cd5ec4806140 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -169,6 +169,16 @@ def create_directional_light(position, target=None, shadows=False, light_color=N @return: """ from ursina.shaders import lit_with_shadows_shader + from ursina import Vec2, Vec4, Entity + + shader = lit_with_shadows_shader + shader.default_input = { + 'texture_scale': Vec2(1, 1), + 'texture_offset': Vec2(0, 0), + 'shadow_color': Vec4(0.1, 0.1, 0.1, .5), + } + Entity.default_shader = shader + if shadows: Entity.default_shader = lit_with_shadows_shader if light_color is None: diff --git a/simulators/ursina/entities/world_grid.py b/simulators/ursina/entities/world_grid.py index e5f823a7f25f63398143166b24fb8728279c6958..66ce53d31e179e5b99d1e1fe914680acbd859359 100644 --- a/simulators/ursina/entities/world_grid.py +++ b/simulators/ursina/entities/world_grid.py @@ -8,9 +8,10 @@ # ============================================================================== from ursina import Entity, Grid, color from simulators.ursina.ursina_mesh import create_arrow_line +from common.singleton import Singleton -class WorldGrid(Entity): +class WorldGrid(Singleton, Entity): """ 创建一个宇宙网格对象 """ @@ -33,3 +34,5 @@ class WorldGrid(Entity): grid.set_light_off() # self.draw_axises() + if not hasattr(self, "instance"): + self.instance = self diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index bd275d5463b879d890a8505faece13aa39270f5e..8cb5a49562ce911145c8af32b32a56bef554f460 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -234,7 +234,7 @@ class UrsinaSimulator(Simulator): from ursina import Sky sky = Sky(texture=texture, scale=sky_scale) - + Sky.instance = sky # sky = SphereSky(texture=texture, scale=sky_scale) sky.scale = sky_scale camera.sky = sky @@ -320,7 +320,6 @@ class UrsinaSimulator(Simulator): if self.show_timer: self.create_timer() - EditorCamera(ignore_paused=True) # 防止打开中文输入法 # self.switch_to_english_input_method() # file: 指定音乐文件的路径 @@ -347,6 +346,8 @@ class UrsinaSimulator(Simulator): audio = Audio(bg_music, pitch=1, loop=True, autoplay=True) audio.volume = 0.3 + EditorCamera(ignore_paused=True) + if self.show_timer: UrsinaEvent.on_reset()