From 24ddb4bcacc5090bbf2c118d0c8a6b26013b8a74 Mon Sep 17 00:00:00 2001 From: march3 Date: Fri, 1 Dec 2023 14:07:06 +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 --- objs/textures/circle_ring.png | Bin 0 -> 35055 bytes sim_scenes/featured/wormhole_sim_v2.py | 571 +++++++++++++++++++++++++ simulators/ursina/ursina_mesh.py | 4 +- simulators/ursina_simulator.py | 12 +- 4 files changed, 582 insertions(+), 5 deletions(-) create mode 100644 objs/textures/circle_ring.png create mode 100644 sim_scenes/featured/wormhole_sim_v2.py diff --git a/objs/textures/circle_ring.png b/objs/textures/circle_ring.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c073ef1f0b2d081203261b6393b8550a0515cd GIT binary patch literal 35055 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 len(self.universes) - 1: + self.current_idx = 0 + if self.target_idx > len(self.universes) - 1: + self.target_idx = 0 + + for u in self.universes: + self.scale_down(u) + u.planet.enabled = False + + self.last_universe = self.current_universe + self.current_universe = self.universes[self.current_idx] + self.target_universe = self.universes[self.target_idx] + + rotation_x: float = self.get_wormhole_data("rotation_x") + rotation_y: float = self.get_wormhole_data("rotation_y") + rotation_z: float = self.get_wormhole_data("rotation_z") + + if rotation_x is not None: + self.current_universe.planet.rotation_x = rotation_x + if rotation_y is not None: + self.current_universe.planet.rotation_y = rotation_y + if rotation_z is not None: + self.current_universe.planet.rotation_z = rotation_z + + self.camera_target.speed = self.get_wormhole_data("camera_target_init_speed") + camera.speed = self.get_wormhole_data("camera_init_speed") + + if self.last_universe is None: + self.camera_target.go_target = self.target_universe + self.camera_target.go_target_stage = "target_universe" + self.camera_target.go_target_hit = False + else: + self.camera_target.go_target = self.last_universe + self.last_universe.planet.enabled = True + + size_factor = self.get_wormhole_data("size_factor", universe=self.last_universe) + + self.scale_down(self.last_universe, scale_size=self.SIZE_SCALE * size_factor) + self.camera_target.go_target_stage = "last_universe" + self.camera_target.go_target_hit = False + self.scale_down(u) + self.camera_target.speed = self.get_wormhole_data("camera_target_speed") + camera.forward_speed = self.get_wormhole_data("camera_forward_speed") + + self.scale_up(self.current_universe) + # self.scale_down(self.target_universe) + + self.current_universe.planet.enabled = True + # self.current_universe.planet.set_light_off() + self.target_universe.planet.enabled = True + # self.target_universe.planet.set_light_off() + + def body_update_reset(self): + # for b in self.bodies: + # b.planet.update = lambda: None + self.camera_target.planet.update = lambda: None + + def on_ready(self): + """ + 事件绑定后,模拟器运行前会触发 + @return: + """ + self.init_setting() + # create_ambient_light(parent=camera) + + # def camera_target_scale(): + # self.camera_target.planet.scale -= 10 + # + # ext_fun_for_method(self.camera_target.planet, after_run_fun=camera_target_scale) + + self.current_idx = -1 + self.target_idx = 0 + self.current_universe = None + self.body_update_reset() + self.universe_reset() + + # camera_look_at(self.camera_target) + self.camera_target.planet.collider = "sphere" + # TODO:隐藏摄像机目标 + self.camera_target.planet.enabled = True + camera.collider = "sphere" + camera.current_universe = self.current_universe + camera_look_at(self.camera_target, rotation_z=0) + + self.text_panel = create_text_panel(font="fonts/DroidSansFallback.ttf", font_scale=1.3) + + def update_text_panel(self): + """ + 更新文字信息面板 + @param d_sun: + @return: + """ + if not hasattr(self, "text_panel"): + return + + panel_text = "虫洞穿越宇宙:\n\n当前宇宙:%s " % self.current_universe.name + panel_text += "\n\n下站宇宙:%s" % self.target_universe.name + if self.last_universe is not None: + panel_text += "\n\n上站宇宙:%s " % self.last_universe.name + + self.text_panel.text = panel_text + + def scale_up(self, obj): + if obj is None: + return + obj.planet.init_scale = self.SIZE_SCALE * 100 + + def scale_down(self, obj, scale_size=None): + if obj is None: + return + if scale_size is None: + scale_size = self.SIZE_SCALE + obj.planet.init_scale = scale_size + + def around_universe(self, around_target): + around_max_count = self.get_wormhole_data("around_max_count") + around_max_speed = self.get_wormhole_data("around_max_speed") + around_min_speed = self.get_wormhole_data("around_min_speed") + around_direction = self.get_wormhole_data("around_direction") + around_acc_speed = self.get_wormhole_data("around_acc_speed") + # around_target = camera + + self.camera_target.planet.look_at(around_target) + + # print(self.camera_target.planet.rotation_x,self.camera_target.planet.rotation_y,self.camera_target.planet.rotation_z) + planet_direction = getattr(self.camera_target.planet, around_direction) + + if not hasattr(self.camera_target, "around_speed"): + self.camera_target.around_speed = 0 + if not hasattr(self.camera_target, "around_count"): + self.camera_target.around_count = 0 + + if self.camera_target.around_count > around_max_count: + if hasattr(self.camera_target, "around_speed") and \ + abs(self.camera_target.around_speed) > abs(around_min_speed): + self.camera_target.around_speed -= around_acc_speed + else: + # delattr(self.camera_target, "around_speed") + delattr(self.camera_target, "around_count") + self.camera_target.go_target_stage = "last_universe" + self.camera_target.speed = self.get_wormhole_data("camera_init_speed") + else: + self.camera_target.around_speed += around_acc_speed + + if hasattr(self.camera_target, "around_speed"): + if abs(self.camera_target.around_speed) > abs(around_max_speed): + self.camera_target.around_speed = around_max_speed + + self.camera_target.planet.position += planet_direction * self.camera_target.around_speed + + print("around_speed", self.camera_target.around_speed) + + if hasattr(self.camera_target, "around_count"): + self.camera_target.around_count += 1 + + # camera.forward_speed = -0.05 + if abs(camera.forward_speed) > 0.01: + camera_forward_acc_speed = self.get_wormhole_data("camera_forward_acc_speed") + camera.forward_speed += camera_forward_acc_speed + # else: + # camera.forward_speed = 0 + + def go_last_universe(self, go_target): + if self.camera_target.planet.intersects(go_target).hit: + if not self.camera_target.go_target_hit: + self.camera_target.go_target_hit = True + self.camera_target.go_target_stage = "around_universe" + self.camera_target.go_target = self.target_universe + self.camera_target.speed = self.get_wormhole_data("camera_init_speed") + camera.speed = 1 # 在看上一个宇宙时候,停留一会 + # # camera.forward_speed = -0.05 + # if camera.forward_speed < 0: + # camera_forward_acc_speed = self.get_wormhole_data("camera_forward_acc_speed") + # camera.forward_speed += camera_forward_acc_speed + # else: + # camera.forward_speed = 0 + if hasattr(self.camera_target, "around_speed"): + if abs(self.camera_target.around_speed) > abs(10): + around_acc_speed = self.get_wormhole_data("around_acc_speed") + around_direction = self.get_wormhole_data("around_direction") + planet_direction = getattr(self.camera_target.planet, around_direction) + + self.camera_target.around_speed -= around_acc_speed + self.camera_target.planet.position += planet_direction * self.camera_target.around_speed + else: + delattr(self.camera_target, "around_speed") + + def camera_target_circle_glow(self): + from simulators.ursina.ursina_mesh import create_circle + from common.image_utils import find_texture + # self.camera_target.planet.enabled = False + texture = find_texture("circle_ring.png") + c = create_circle(parent=None, pos=self.camera_target.planet.position, scale=1, texture=texture) + + def c_blink(): + alpha = c.alpha + if c.alpha_direction == 1: + alpha += 0.08 + if alpha >= 1: + c.alpha_direction = 0 + alpha = 1 + else: + alpha -= 0.08 + print("alpha", alpha) + + c.alpha = alpha + c.scale = alpha + if c.alpha <= 0.9 and c.alpha_direction == 0 and self.camera_target.planet.enabled: + self.camera_target.planet.enabled = False + + if c.alpha <= 0: + c.enabled = False + c.update = lambda: None + + c.set_light_off(True) + c.look_at(camera) + c.alpha = 0.01 + c.scale = 0.01 + c.alpha_direction = 1 + + c.update = c_blink + # self.camera_target + + def on_timer_changed(self, time_data): + self.target_universe.planet.rotation_y -= 0.5 + if self.last_universe is not None: + self.last_universe.planet.rotation_y += 0.3 + camera_look_at(self.camera_target, rotation_z=0) + # camera.rotation_x -= 2 + + # self.camera_target.planet.look_at(self.target_universe.planet) + # self.camera_move(time_data) + from ursina import time, distance + + camera_max_speed = self.get_wormhole_data("camera_max_speed") + camera_acc_speed = self.get_wormhole_data("camera_acc_speed") + camera_target_max_speed = self.get_wormhole_data("camera_target_max_speed", ) + + if self.camera_target.go_target is not None: + go_target = self.camera_target.go_target.planet + if self.camera_target.go_target_stage == "around_universe": + # 摄像机镜头环绕目标宇运动(摄像机镜头暂时不去目标) + self.around_universe(go_target) + else: + # 摄像机镜头看向目标宇宙,并逐渐靠近目标 + self.camera_target.planet.look_at(go_target) + self.camera_target.planet.position = \ + lerp(self.camera_target.planet.position, go_target.position, + self.camera_target.speed * time.dt) + + # 摄像机镜头加速度计算(摄像机镜头圆滑效果),并对摄像机镜头移动速度进行限制 + self.camera_target.speed *= camera_acc_speed + if self.camera_target.speed > camera_target_max_speed: + self.camera_target.speed = camera_target_max_speed + + if self.camera_target.go_target_stage == "last_universe": + # 进入新的宇宙后,摄像机回看上一个宇宙的镜头 + self.go_last_universe(go_target) + + elif self.camera_target.go_target_stage == "target_universe": + # 摄像机镜头去往新的宇宙进行中 + if self.camera_target.planet.intersects(go_target).hit and not self.camera_target.go_target_hit: + # 摄像机镜头达到新的目标宇宙后,摄像机就不后退了 + self.camera_target.go_target_hit = True + camera.forward_speed = 0 + # TODO:隐藏摄像机目标 + self.camera_target_circle_glow() + # camera.speed = 3000 # TODO:这个不能反复执行 + + # self.camera_target.planet.position += self.camera_target.planet.forward*100 + # print(self.camera_target.planet.position) + # 摄像机加速度计算(摄像机圆滑效果) + camera.speed *= camera_acc_speed + if camera.speed > camera_max_speed: + camera.speed = camera_max_speed + + if camera.speed != 0: + dd = distance(camera.position, self.target_universe.planet.position) + camera.position = lerp(camera.position, self.target_universe.planet.position, camera.speed * time.dt / dd) + if camera.forward_speed != 0: + camera.position += camera.forward * camera.forward_speed + + # if self.camera_target.planet.intersects(self.target_universe.planet).hit: + if camera.intersects(self.target_universe.planet).hit: + self.universe_reset() + + self.update_text_panel() + + def build_events(self): + # 订阅事件后,上面2个函数功能才会起作用 + # 运行中,每时每刻都会触发 on_timer_changed + UrsinaEvent.on_timer_changed_subscription(wormhole_sim.on_timer_changed) + # 运行前会触发 on_ready + UrsinaEvent.on_ready_subscription(wormhole_sim.on_ready) + + def run(self): + + self.set_window_size((1920, 1079), False) + + self.build_events() + # 使用 ursina 查看的运行效果 + # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 + # position = 左-右+、上+下-、前+后- + ursina_run(self.bodies, SECONDS_PER_DAY * 24, + # position=(0, AU / 1200, -1.003 * AU), + # position=[-AU/100, 0, 0], + # position=[0, 0, -AU / 10], + # position=[0, 0, ], + position=[0, self.D, -self.D * 2], + cosmic_bg='', + gravity_works=False, + # bg_music='sounds/no_glory.mp3', + timer_enabled=True, + video_recoder=True, + show_exit_button=False, + show_grid=False, + show_camera_info=False, + show_control_info=False, + show_trail=False) + + +if __name__ == '__main__': + """ + + """ + wormhole_sim = WormholeSim(texture_dir="cosmic_pan_02") + wormhole_sim.run() diff --git a/simulators/ursina/ursina_mesh.py b/simulators/ursina/ursina_mesh.py index f94c63b..9e94259 100644 --- a/simulators/ursina/ursina_mesh.py +++ b/simulators/ursina/ursina_mesh.py @@ -471,8 +471,8 @@ def create_line(from_pos, to_pos, parent=None, alpha=1.0, len_scale=1, set_light return line -def create_circle(parent=None, pos=Vec3(0, 0, 0), thickness=1, scale=1, color=color.white, alpha=1): - circle = Entity(parent=parent, model="circle", thickness=thickness, scale=scale, position=pos, +def create_circle(parent=None, pos=Vec3(0, 0, 0), thickness=1, scale=1, color=color.white, alpha=1, texture=None): + circle = Entity(parent=parent, model="circle", texture=texture, thickness=thickness, scale=scale, position=pos, color=color, alpha=alpha, double_sided=True) return circle diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index 630ec21..7065fdf 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -99,7 +99,7 @@ class UrsinaSimulator(Simulator): c.enabled = False # Explosion animation - def body_explode(target=None, scale=1, fps=6): + def body_explode(target=None, scale=1, fps=6, explode_dir=None, explode_name="explosion"): # from panda3d.core import GeomUtils if body.planet.enabled: # TODO:下面代码保留,由于运行太快导致两个天体不是在表面碰撞,这样就要进行计算,希望在表面爆炸,但是需要耗费CPU资源,暂时注释 @@ -120,8 +120,14 @@ class UrsinaSimulator(Simulator): # 如果爆炸,则静止不动(停止并忽略引力) body.stop_and_ignore_gravity() body.planet.enabled = False - explosion_file = find_file("images/explosion") - explosion_file = os.path.join(explosion_file, "explosion") + if explode_dir is None: + explode_dir = "images/explosion" + + explosion_file = find_file(explode_dir) + if not os.path.exists(explosion_file): + return + + explosion_file = os.path.join(explosion_file, explode_name) # 获取体积数据(开三次方) volume_scale = pow(body.planet.model.get_bounds().volume, 1 / 3) # 根据体积、大小缩放判断爆炸的量 -- GitLab