diff --git a/sim_scenes/wonders/comets_jupiter.py b/sim_scenes/wonders/comets_jupiter.py index 89cdd4addf9690c76afd92604220f3e00d926e31..242f1b1524bebf4caac9113db7688d0a88f75dbe 100644 --- a/sim_scenes/wonders/comets_jupiter.py +++ b/sim_scenes/wonders/comets_jupiter.py @@ -17,9 +17,9 @@ from simulators.ursina.ursina_event import UrsinaEvent def create_comet(index, gravity_only_for): """ - 随机生成石头 + 随机生成石头(随机位置、随机初始速度、随机大小、随机旋转) @param index: 索引号 - @param gravity_only_for: 指定一个天体,石头的引力只对该天体有效 + @param gravity_only_for: 指定一个天体,石头只对该天体引力有效 @return: """ # 随机生成石头的位置和初始速度信息 @@ -31,11 +31,11 @@ def create_comet(index, gravity_only_for): # 石头随机大小 size_scale = random.randint(600, 1200) # 随机创建石头 - comet = create_rock(no=index % 8 + 1, name=f'岩石{index + 1}', mass=4.4e10, - size_scale=size_scale, color=(255, 200, 0), - init_position=pos, init_velocity=vel, - gravity_only_for=[gravity_only_for], - ) + comet = create_rock( + no=index % 8 + 1, name=f'岩石{index + 1}', mass=4.4e10, + size_scale=size_scale, color=(255, 200, 0), + init_position=pos, init_velocity=vel, gravity_only_for=[gravity_only_for], + ) # 给石头一个随机旋转的方向和值 comet.rotation = [0, 0, 0] @@ -64,6 +64,18 @@ if __name__ == '__main__': comets.append(comet) + def on_timer_changed(time_data: TimeData): + # 运行中,每时每刻都会触发 + for comet in comets: + if comet.visibled: + # 如果是否可见,则旋转石头 + comet.planet.rotation += comet.rotation + # 循环判断每个石头与木星是否相碰撞,如果相碰撞就爆炸 + if two_bodies_colliding(comet, jupiter): + # 将石头隐藏、设置引力无效后,展示爆炸效果 + comet.explode(jupiter) + + def on_reset(): """ 当按键盘的 “O” 键重置后,恢复所有石头的状态(石头可见、引力有效),这样就可以反复观看 @@ -76,24 +88,12 @@ if __name__ == '__main__': def on_ready(): # 运行前触发 - # 创建太阳光 + # 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter) create_directional_light(position=(200, 0, -300), target=jupiter) # 摄像机看向木星 camera_look_at(jupiter, rotation_z=0) - def on_timer_changed(time_data: TimeData): - # 运行中,每时每刻都会触发 - for comet in comets: - if comet.visibled: - # 如果是否可见,则旋转石头 - comet.planet.rotation += comet.rotation - # 循环判断每个石头与木星是否相碰撞,如果相碰撞就爆炸 - if two_bodies_colliding(comet, jupiter): - # 将石头隐藏、设置引力无效后,展示爆炸效果 - comet.explode(jupiter) - - # 订阅事件后,上面3个函数功能才会起作用 # 按键盘的 “O” 重置键会触发 on_reset UrsinaEvent.on_reset_subscription(on_reset) diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index f43fbc69db6c17784f0100b7d450cd5ec4806140..e9e7706224866cd5034bc6c5779cd4a8d1c96254 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -171,13 +171,13 @@ def create_directional_light(position, target=None, shadows=False, light_color=N 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 + # 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 @@ -185,6 +185,7 @@ def create_directional_light(position, target=None, shadows=False, light_color=N light_color = color.white else: light_color = color.rgba(light_color[0] / 255, light_color[1] / 255, light_color[2] / 255, 1) + light = DirectionalLight(position=position, intensity=10, range=10, color=light_color) if shadows: