diff --git a/sim_scenes/earth/earth_3d.py b/sim_scenes/earth/earth_3d.py index a00c3af157daf0a17265882b0710487617acd800..db831fa41563562b5f85a83e9708c4c36b1ae321 100644 --- a/sim_scenes/earth/earth_3d.py +++ b/sim_scenes/earth/earth_3d.py @@ -7,13 +7,8 @@ # python_version :3.8 # ============================================================================== from bodies import Earth -from common.consts import SECONDS_PER_HOUR, SECONDS_PER_DAY, AU -from sim_scenes.func import ursina_run, camera_look_at, create_3d_card -from simulators.ursina.entities.body_timer import TimeData -from simulators.ursina.entities.camera3d import Camera3d -from simulators.ursina.ursina_config import UrsinaConfig -from simulators.ursina.ursina_event import UrsinaEvent -from ursina import camera +from common.consts import SECONDS_PER_HOUR +from sim_scenes.func import ursina_run if __name__ == '__main__': """ @@ -34,54 +29,15 @@ if __name__ == '__main__': bodies = [earth, clouds] - # camera.camera_pos = "right" - # camera_l2r = 0.002 * AU * UrsinaConfig.SCALE_FACTOR - # - # - # def switch_position(): - # if camera.camera_pos == "right": # 摄像机右眼 - # camera.world_position[0] -= 2 * camera_l2r - # camera.camera_pos = "left" - # elif camera.camera_pos == "left": # 摄像机左眼 - # camera.world_position[0] += 2 * camera_l2r - # camera.camera_pos = "right" - # - # - # camera.switch_position = switch_position - init_pos = (1.45 * earth.radius * UrsinaConfig.SCALE_FACTOR, - 0, - -30000 * UrsinaConfig.SCALE_FACTOR) - Camera3d.init(init_pos) - # def on_ready(): - # - # Camera3d.init_on_ready(init_pos) - # earth.camera3d = Camera3d() - # earth.camera3d.position = (1.45 * earth.radius * UrsinaConfig.SCALE_FACTOR, - # 0, - # -30000 * UrsinaConfig.SCALE_FACTOR) - # - # # camera_look_at(earth, rotation_z=0) - # # camera.fov = 40 - # earth._3d_card = create_3d_card() - - # def on_before_evolving(evolve_args): - # Camera3d.exec_on_before_evolving(evolve_args) - # earth._3d_card.switch_color() - # earth.camera3d.switch_position() - # if earth._3d_card.switch_flag == 1: - # evolve_args["evolve_dt"] = 0.0 - - # 订阅事件后,上面的函数功能才会起作用 - # # 运行前会触发 on_ready - # UrsinaEvent.on_ready_subscription(on_ready) - # UrsinaEvent.on_before_evolving_subscription(Camera3d.exec_on_before_evolving) + # 3D摄像机初始化 + from simulators.ursina.entities.camera3d import Camera3d + Camera3d.init() # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, SECONDS_PER_HOUR / 2, - # position=(1.2 * earth.radius, 0, -30000), - position=(0, 0, 0), + position=(1.45 * earth.radius, 0, -30000), show_grid=False, show_camera_info=False, show_control_info=False, diff --git a/sim_scenes/fiction/transformed_mars_ani_3d.py b/sim_scenes/fiction/transformed_mars_ani_3d.py index 6609073621b2927517ad52a2df998e532a6cfbb1..57cea8499859b152f37a5c1cbe7c16ed40f10c0d 100644 --- a/sim_scenes/fiction/transformed_mars_ani_3d.py +++ b/sim_scenes/fiction/transformed_mars_ani_3d.py @@ -35,9 +35,9 @@ def create_satellites(): for i, info in enumerate(satellite_infos): # Satellite Satellite2 satellite = Satellite2(name=f'卫星{i + 1}', mass=4.4e10, - size_scale=2e2, color=(255, 200, 0), - init_position=info["position"], - init_velocity=info["velocity"]) + size_scale=2e2, color=(255, 200, 0), + init_position=info["position"], + init_velocity=info["velocity"]) # info["satellite"] = satellite satellites.append(satellite) return satellites @@ -83,13 +83,8 @@ def transformed_mars_ani(transformed_texture=None, texture=None, camera3d=False) bodies = bodies + satellites bodies.append(clouds) - init_pos = (1.80 * mars.radius, - 0, - -38000) if camera3d: - init_pos = np.array(init_pos) * UrsinaConfig.SCALE_FACTOR - Camera3d.init(init_pos) - init_pos = (0, 0, 0) + Camera3d.init() def on_ready(): # 为了较好的立体效果,可以增加太阳光线,光线指向火星(target=mars) @@ -147,7 +142,7 @@ def transformed_mars_ani(transformed_texture=None, texture=None, camera3d=False) # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, SECONDS_PER_HOUR / 2, - position=init_pos, + position=(1.80 * mars.radius, 0, -38000), show_grid=False, show_camera_info=False, show_control_info=False, diff --git a/sim_scenes/fiction/transformed_planet.py b/sim_scenes/fiction/transformed_planet.py index a1ff4e551786e532be18045498faf51c68630d6c..5925b9146527f5b6a43711680b543dc1a413c605 100644 --- a/sim_scenes/fiction/transformed_planet.py +++ b/sim_scenes/fiction/transformed_planet.py @@ -43,19 +43,14 @@ def run_transformed_planet(transformed_texture=None, texture=None, with_clouds=T bodies.append(clouds) - init_pos = (1.45 * earth.radius, - 0, - -30000) if camera3d: - init_pos = np.array(init_pos) * UrsinaConfig.SCALE_FACTOR - Camera3d.init(init_pos) - init_pos = (0, 0, 0) + Camera3d.init() # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, SECONDS_PER_HOUR / 2, - position=init_pos, + position=(1.45 * earth.radius, 0, -30000), show_grid=False, show_camera_info=False, show_control_info=False, diff --git a/sim_scenes/func.py b/sim_scenes/func.py index 4d131ad418b66bdd121f572af7320fc6bc291522..6ca214c03b49bbc7f42c9045b1af3734a0b76a15 100644 --- a/sim_scenes/func.py +++ b/sim_scenes/func.py @@ -154,6 +154,12 @@ def ursina_run(bodies, for body in body_sys.bodies: body.show_name = True + from simulators.ursina.entities.camera3d import Camera3d + if Camera3d.is_ready and position != (0, 0, 0): + from simulators.ursina.ursina_config import UrsinaConfig + Camera3d.o.init_position = np.array(position) * UrsinaConfig.SCALE_FACTOR + position = (0, 0, 0) + if save_as_json is not None: try: body_sys.save_to_json(save_as_json, {"dt": dt, "position": position, diff --git a/sim_scenes/solar_system/hd_mercury_3d.py b/sim_scenes/solar_system/hd_mercury_3d.py index 5a4fa618b1f4b0686cc06757efc87aaa522745c2..ca4cd1e1bd8443935d503b3ca7b68e7604ecebb2 100644 --- a/sim_scenes/solar_system/hd_mercury_3d.py +++ b/sim_scenes/solar_system/hd_mercury_3d.py @@ -9,8 +9,6 @@ from bodies import Mercury from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY from sim_scenes.func import ursina_run -from simulators.ursina.entities.camera3d import Camera3d -from simulators.ursina.ursina_config import UrsinaConfig if __name__ == '__main__': """ @@ -22,14 +20,14 @@ if __name__ == '__main__': size_scale=1, show_name=False) ] mercury = bodies[0] - init_pos = (2.0 * mercury.radius * UrsinaConfig.SCALE_FACTOR, - 0, - -14000 * UrsinaConfig.SCALE_FACTOR) - Camera3d.init(init_pos) + + # 3D摄像机初始化 + from simulators.ursina.entities.camera3d import Camera3d + Camera3d.init() # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- - ursina_run(bodies, SECONDS_PER_DAY, position=(0, 0, 0), + ursina_run(bodies, SECONDS_PER_DAY, position= (2.0 * mercury.radius, 0, -14000), # cosmic_bg="textures/cosmic1.jpg", view_closely=0.001) diff --git a/simulators/ursina/entities/camera3d.py b/simulators/ursina/entities/camera3d.py index 25fe84022eb419e59db40d47cb4b2cae40e879e9..897311b839209939d09d9e2d478aafedb899377a 100644 --- a/simulators/ursina/entities/camera3d.py +++ b/simulators/ursina/entities/camera3d.py @@ -6,7 +6,8 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.8 # ============================================================================== -from ursina import Entity, camera +import numpy as np +from ursina import Entity, camera, Vec3 from common.consts import AU from sim_scenes.func import create_3d_card @@ -20,6 +21,7 @@ class OCamera: class Camera3d(Entity): o = OCamera() + is_ready = False def __init__(self, **kwargs): super().__init__() @@ -43,7 +45,9 @@ class Camera3d(Entity): pass @staticmethod - def init(init_pos): + def init(init_pos=None): + Camera3d.is_ready = True + def on_ready(): Camera3d.init_on_ready(init_pos) @@ -52,13 +56,24 @@ class Camera3d(Entity): @staticmethod def init_on_ready(position): + if hasattr(Camera3d.o, "init_position"): + position = Camera3d.o.init_position + elif position is None: + position = camera.position + else: + position = np.array(position) * UrsinaConfig.SCALE_FACTOR + Camera3d.o.camera3d = Camera3d() Camera3d.o.camera3d.position = position Camera3d.o._3d_card = create_3d_card() @staticmethod def exec_on_before_evolving(evolve_args): + Camera3d.o._3d_card.switch_color() Camera3d.o.camera3d.switch_position() if Camera3d.o._3d_card.switch_flag == 1: evolve_args["evolve_dt"] = 0.0 + + # if isinstance(camera.parent, Camera3d): + # camera.position = Vec3(0, 0, 0) diff --git a/simulators/ursina/entities/ursina_player.py b/simulators/ursina/entities/ursina_player.py index 504888d2d77abef0671b05526df858623f32744f..803b907851c2597acb473a4b5ca64af5fa01de1e 100644 --- a/simulators/ursina/entities/ursina_player.py +++ b/simulators/ursina/entities/ursina_player.py @@ -40,6 +40,7 @@ class UrsinaPlayer(FirstPersonController): self.position = Vec3(pos[0], pos[1], pos[2]) # 将摄像机位置设置为 x=0、y=1、z=0 的位置 camera.position = Vec3(pos[0], pos[1], pos[2]) + # camera.player = self # self.x = 90 # self.position = Vec3(pos[0], pos[1], pos[2]) # 将摄像机的观察角度绕 x 轴旋转 45 度,绕 y 轴旋转 0 度,绕 z 轴旋转 0 度