提交 540bbe04 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器

上级 af6c0d96
...@@ -7,13 +7,8 @@ ...@@ -7,13 +7,8 @@
# python_version :3.8 # python_version :3.8
# ============================================================================== # ==============================================================================
from bodies import Earth from bodies import Earth
from common.consts import SECONDS_PER_HOUR, SECONDS_PER_DAY, AU from common.consts import SECONDS_PER_HOUR
from sim_scenes.func import ursina_run, camera_look_at, create_3d_card from sim_scenes.func import ursina_run
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
if __name__ == '__main__': if __name__ == '__main__':
""" """
...@@ -34,54 +29,15 @@ if __name__ == '__main__': ...@@ -34,54 +29,15 @@ if __name__ == '__main__':
bodies = [earth, clouds] bodies = [earth, clouds]
# camera.camera_pos = "right" # 3D摄像机初始化
# camera_l2r = 0.002 * AU * UrsinaConfig.SCALE_FACTOR from simulators.ursina.entities.camera3d import Camera3d
# Camera3d.init()
#
# 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)
# 使用 ursina 查看的运行效果 # 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后- # position = 左-右+、上+下-、前+后-
ursina_run(bodies, SECONDS_PER_HOUR / 2, ursina_run(bodies, SECONDS_PER_HOUR / 2,
# position=(1.2 * earth.radius, 0, -30000), position=(1.45 * earth.radius, 0, -30000),
position=(0, 0, 0),
show_grid=False, show_grid=False,
show_camera_info=False, show_camera_info=False,
show_control_info=False, show_control_info=False,
......
...@@ -35,9 +35,9 @@ def create_satellites(): ...@@ -35,9 +35,9 @@ def create_satellites():
for i, info in enumerate(satellite_infos): for i, info in enumerate(satellite_infos):
# Satellite Satellite2 # Satellite Satellite2
satellite = Satellite2(name=f'卫星{i + 1}', mass=4.4e10, satellite = Satellite2(name=f'卫星{i + 1}', mass=4.4e10,
size_scale=2e2, color=(255, 200, 0), size_scale=2e2, color=(255, 200, 0),
init_position=info["position"], init_position=info["position"],
init_velocity=info["velocity"]) init_velocity=info["velocity"])
# info["satellite"] = satellite # info["satellite"] = satellite
satellites.append(satellite) satellites.append(satellite)
return satellites return satellites
...@@ -83,13 +83,8 @@ def transformed_mars_ani(transformed_texture=None, texture=None, camera3d=False) ...@@ -83,13 +83,8 @@ def transformed_mars_ani(transformed_texture=None, texture=None, camera3d=False)
bodies = bodies + satellites bodies = bodies + satellites
bodies.append(clouds) bodies.append(clouds)
init_pos = (1.80 * mars.radius,
0,
-38000)
if camera3d: if camera3d:
init_pos = np.array(init_pos) * UrsinaConfig.SCALE_FACTOR Camera3d.init()
Camera3d.init(init_pos)
init_pos = (0, 0, 0)
def on_ready(): def on_ready():
# 为了较好的立体效果,可以增加太阳光线,光线指向火星(target=mars) # 为了较好的立体效果,可以增加太阳光线,光线指向火星(target=mars)
...@@ -147,7 +142,7 @@ def transformed_mars_ani(transformed_texture=None, texture=None, camera3d=False) ...@@ -147,7 +142,7 @@ def transformed_mars_ani(transformed_texture=None, texture=None, camera3d=False)
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后- # position = 左-右+、上+下-、前+后-
ursina_run(bodies, SECONDS_PER_HOUR / 2, ursina_run(bodies, SECONDS_PER_HOUR / 2,
position=init_pos, position=(1.80 * mars.radius, 0, -38000),
show_grid=False, show_grid=False,
show_camera_info=False, show_camera_info=False,
show_control_info=False, show_control_info=False,
......
...@@ -43,19 +43,14 @@ def run_transformed_planet(transformed_texture=None, texture=None, with_clouds=T ...@@ -43,19 +43,14 @@ def run_transformed_planet(transformed_texture=None, texture=None, with_clouds=T
bodies.append(clouds) bodies.append(clouds)
init_pos = (1.45 * earth.radius,
0,
-30000)
if camera3d: if camera3d:
init_pos = np.array(init_pos) * UrsinaConfig.SCALE_FACTOR Camera3d.init()
Camera3d.init(init_pos)
init_pos = (0, 0, 0)
# 使用 ursina 查看的运行效果 # 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后- # position = 左-右+、上+下-、前+后-
ursina_run(bodies, SECONDS_PER_HOUR / 2, ursina_run(bodies, SECONDS_PER_HOUR / 2,
position=init_pos, position=(1.45 * earth.radius, 0, -30000),
show_grid=False, show_grid=False,
show_camera_info=False, show_camera_info=False,
show_control_info=False, show_control_info=False,
......
...@@ -154,6 +154,12 @@ def ursina_run(bodies, ...@@ -154,6 +154,12 @@ def ursina_run(bodies,
for body in body_sys.bodies: for body in body_sys.bodies:
body.show_name = True 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: if save_as_json is not None:
try: try:
body_sys.save_to_json(save_as_json, {"dt": dt, "position": position, body_sys.save_to_json(save_as_json, {"dt": dt, "position": position,
......
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
from bodies import Mercury from bodies import Mercury
from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY
from sim_scenes.func import ursina_run from sim_scenes.func import ursina_run
from simulators.ursina.entities.camera3d import Camera3d
from simulators.ursina.ursina_config import UrsinaConfig
if __name__ == '__main__': if __name__ == '__main__':
""" """
...@@ -22,14 +20,14 @@ if __name__ == '__main__': ...@@ -22,14 +20,14 @@ if __name__ == '__main__':
size_scale=1, show_name=False) size_scale=1, show_name=False)
] ]
mercury = bodies[0] mercury = bodies[0]
init_pos = (2.0 * mercury.radius * UrsinaConfig.SCALE_FACTOR,
0, # 3D摄像机初始化
-14000 * UrsinaConfig.SCALE_FACTOR) from simulators.ursina.entities.camera3d import Camera3d
Camera3d.init(init_pos) Camera3d.init()
# 使用 ursina 查看的运行效果 # 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后- # 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", # cosmic_bg="textures/cosmic1.jpg",
view_closely=0.001) view_closely=0.001)
...@@ -6,7 +6,8 @@ ...@@ -6,7 +6,8 @@
# link :https://gitcode.net/pythoncr/ # link :https://gitcode.net/pythoncr/
# python_version :3.8 # 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 common.consts import AU
from sim_scenes.func import create_3d_card from sim_scenes.func import create_3d_card
...@@ -20,6 +21,7 @@ class OCamera: ...@@ -20,6 +21,7 @@ class OCamera:
class Camera3d(Entity): class Camera3d(Entity):
o = OCamera() o = OCamera()
is_ready = False
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__() super().__init__()
...@@ -43,7 +45,9 @@ class Camera3d(Entity): ...@@ -43,7 +45,9 @@ class Camera3d(Entity):
pass pass
@staticmethod @staticmethod
def init(init_pos): def init(init_pos=None):
Camera3d.is_ready = True
def on_ready(): def on_ready():
Camera3d.init_on_ready(init_pos) Camera3d.init_on_ready(init_pos)
...@@ -52,13 +56,24 @@ class Camera3d(Entity): ...@@ -52,13 +56,24 @@ class Camera3d(Entity):
@staticmethod @staticmethod
def init_on_ready(position): 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 = Camera3d()
Camera3d.o.camera3d.position = position Camera3d.o.camera3d.position = position
Camera3d.o._3d_card = create_3d_card() Camera3d.o._3d_card = create_3d_card()
@staticmethod @staticmethod
def exec_on_before_evolving(evolve_args): def exec_on_before_evolving(evolve_args):
Camera3d.o._3d_card.switch_color() Camera3d.o._3d_card.switch_color()
Camera3d.o.camera3d.switch_position() Camera3d.o.camera3d.switch_position()
if Camera3d.o._3d_card.switch_flag == 1: if Camera3d.o._3d_card.switch_flag == 1:
evolve_args["evolve_dt"] = 0.0 evolve_args["evolve_dt"] = 0.0
# if isinstance(camera.parent, Camera3d):
# camera.position = Vec3(0, 0, 0)
...@@ -40,6 +40,7 @@ class UrsinaPlayer(FirstPersonController): ...@@ -40,6 +40,7 @@ class UrsinaPlayer(FirstPersonController):
self.position = Vec3(pos[0], pos[1], pos[2]) self.position = Vec3(pos[0], pos[1], pos[2])
# 将摄像机位置设置为 x=0、y=1、z=0 的位置 # 将摄像机位置设置为 x=0、y=1、z=0 的位置
camera.position = Vec3(pos[0], pos[1], pos[2]) camera.position = Vec3(pos[0], pos[1], pos[2])
# camera.player = self
# self.x = 90 # self.x = 90
# self.position = Vec3(pos[0], pos[1], pos[2]) # self.position = Vec3(pos[0], pos[1], pos[2])
# 将摄像机的观察角度绕 x 轴旋转 45 度,绕 y 轴旋转 0 度,绕 z 轴旋转 0 度 # 将摄像机的观察角度绕 x 轴旋转 45 度,绕 y 轴旋转 0 度,绕 z 轴旋转 0 度
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册