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

Python超人-宇宙模拟器

上级 af6c0d96
......@@ -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,
......
......@@ -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,
......
......@@ -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,
......
......@@ -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,
......
......@@ -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)
......@@ -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)
......@@ -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 度
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册