提交 28e024d5 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器

上级 2cc1c635
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
# python_version :3.9 # python_version :3.9
# ============================================================================== # ==============================================================================
import time import time
import math
from ursina import camera, application from ursina import camera, application
from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto
...@@ -17,6 +17,7 @@ from common.func import calculate_distance ...@@ -17,6 +17,7 @@ from common.func import calculate_distance
from objs import HalleComet, Obj from objs import HalleComet, Obj
from sim_scenes.func import camera_look_at, two_bodies_colliding, create_text_panel from sim_scenes.func import camera_look_at, two_bodies_colliding, create_text_panel
from sim_scenes.func import ursina_run, create_sphere_sky from sim_scenes.func import ursina_run, create_sphere_sky
from simulators.ursina.entities.world_grid import WorldGrid
from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
from simulators.ursina.ursina_mesh import create_orbit_line from simulators.ursina.ursina_mesh import create_orbit_line
...@@ -44,9 +45,9 @@ class HalleyCometSim: ...@@ -44,9 +45,9 @@ class HalleyCometSim:
self.pluto = Pluto(size_scale=1e5, show_trail=False) self.pluto = Pluto(size_scale=1e5, show_trail=False)
self.bodies = [ self.bodies = [
self.sun, # 太阳 self.sun, # 太阳
self.mercury, # 水星 # self.mercury, # 水星
self.venus, # 金星 # self.venus, # 金星
self.earth, # 地球 # self.earth, # 地球
self.mars, # 火星 self.mars, # 火星
self.jupiter, # 木星 self.jupiter, # 木星
self.saturn, # 土星 self.saturn, # 土星
...@@ -82,6 +83,39 @@ class HalleyCometSim: ...@@ -82,6 +83,39 @@ class HalleyCometSim:
self.build_solar_system() self.build_solar_system()
self.build_halley_comet() self.build_halley_comet()
def calculate_rotation_angles(self, point1, point2):
dx = point2.x - point1.x
dy = point2.y - point1.y
dz = point2.z - point1.z
roll = math.atan2(dy, dz)
pitch = math.atan2(dx, math.sqrt(dy ** 2 + dz ** 2))
yaw = math.atan2(math.sin(roll), math.cos(roll))
return roll, pitch, yaw
def calculate_angles(self, point1, point2):
import numpy as np
# 计算向量AB
AB = point1 - point2
# 计算向量AB与x轴、y轴和z轴之间的夹角
angle_x = np.arctan2(AB.y, AB.x) * 180 / np.pi
angle_y = np.arctan2(AB.z, np.sqrt(AB.x ** 2 + AB.y ** 2)) * 180 / np.pi
angle_z = np.arctan2(np.sqrt(AB.x ** 2 + AB.y ** 2), AB.z) * 180 / np.pi
return angle_x, angle_y, angle_z
def calculate_angles(self, point1, point2):
import numpy as np
# 计算向量AB
AB = point2 - point1
# 计算向量AB与x轴、y轴和z轴之间的夹角
angle_x = np.degrees(np.arctan2(AB.y, AB.x))
angle_y = np.degrees(np.arctan2(AB.z, np.sqrt(AB.x ** 2 + AB.y ** 2)))
angle_z = np.degrees(np.arctan2(np.sqrt(AB.x ** 2 + AB.y ** 2), AB.z))
return angle_x, angle_y, angle_z
def on_ready(self): def on_ready(self):
""" """
事件绑定后,模拟器运行前会触发 事件绑定后,模拟器运行前会触发
...@@ -95,13 +129,49 @@ class HalleyCometSim: ...@@ -95,13 +129,49 @@ class HalleyCometSim:
# camera.clip_plane_near = 0.1 # camera.clip_plane_near = 0.1
camera.clip_plane_far = 1000000 camera.clip_plane_far = 1000000
create_sphere_sky(scale=200000) create_sphere_sky(scale=200000)
WorldGrid().draw_axises(10)
application.time_scale = 5 application.time_scale = 5
self.orbit_lines = [] self.orbit_lines = []
for body in self.bodies[1:]: for body in self.bodies[1:]:
if isinstance(body, HalleComet): if isinstance(body, HalleComet):
continue continue
print("create_orbit_line", body) print("create_orbit_line", body)
orbit_line = create_orbit_line(self.sun, body,rotation_x=70) """
# 在 ursina 中,我以 sun.position 为中心, body.position 的所在位置(x,y,z) 画一个圆环(orbit_line)。
到 sun 中心点(x,y,z) 为半径,返回一个圆形轨道 orbit_line
orbit_line = create_orbit_line(sun, body)
# 帮我解决下面的问题,怎么修改下面的值,让 orbit_line 轨道线的倾斜和 body 匹配
orbit_line.rotation_x = ?
orbit_line.rotation_y = ?
orbit_line.rotation_z = ?
body.position - sun.position
"""
orbit_line = create_orbit_line(self.sun, body)
angle_x, angle_y, angle_z = self.calculate_angles(self.sun.planet.position,body.planet.position)
# # 获取body相对于self.sun的位置向量
# relative_position = body.planet.position - self.sun.planet.position
#
# rotation_x = -math.degrees(
# math.atan2(relative_position.y, math.sqrt(relative_position.x ** 2 + relative_position.z ** 2)))
# rotation_y = math.degrees(math.atan2(relative_position.x, relative_position.z))
# # 计算旋转角度
# orbit_line.rotation_x = rotation_x + 90
# orbit_line.rotation_z = 0
# orbit_line.rotation_y = rotation_y + 120
# #
# angle = math.atan2(relative_position.y, relative_position.x)
orbit_line.rotation_x = angle_x + 90
orbit_line.rotation_y = angle_y + 180
orbit_line.rotation_z = angle_z
orbit_line.body = body orbit_line.body = body
self.orbit_lines.append(orbit_line) self.orbit_lines.append(orbit_line)
...@@ -155,4 +225,5 @@ if __name__ == '__main__': ...@@ -155,4 +225,5 @@ if __name__ == '__main__':
show_camera_info=False, show_camera_info=False,
show_control_info=False, show_control_info=False,
show_timer=True, show_timer=True,
show_grid=False) show_grid=False
)
...@@ -16,15 +16,21 @@ class WorldGrid(Singleton, Entity): ...@@ -16,15 +16,21 @@ class WorldGrid(Singleton, Entity):
创建一个宇宙网格对象 创建一个宇宙网格对象
""" """
def draw_axises(self): def draw_axises(self, scale_factor=1):
""" """
画坐标轴 画坐标轴
@return: @return:
""" """
arrow_x, line_x, text_x = create_arrow_line((0, 0, 0), (10, 0, 0), label="X", color=color.red) len_scale = 0.5 * scale_factor
arrow_y, line_y, text_y = create_arrow_line((0, 0, 0), (0, 10, 0), label="Y", color=color.green) arrow_scale = 1 * scale_factor
arrow_z, line_z, text_z = create_arrow_line((0, 0, 0), (0, 0, 10), label="Z", color=color.yellow) text_scale = 50 * scale_factor
arrow_x, line_x, text_x = create_arrow_line((0, 0, 0), (10, 0, 0), label="X", len_scale=len_scale,
arrow_scale=arrow_scale, text_scale=text_scale, color=color.red)
arrow_y, line_y, text_y = create_arrow_line((0, 0, 0), (0, 10, 0), label="Y", len_scale=len_scale,
arrow_scale=arrow_scale, text_scale=text_scale, color=color.green)
arrow_z, line_z, text_z = create_arrow_line((0, 0, 0), (0, 0, 10), label="Z", len_scale=len_scale,
arrow_scale=arrow_scale, text_scale=text_scale, color=color.yellow)
def __init__(self, position=None, scale=None): def __init__(self, position=None, scale=None):
super().__init__() super().__init__()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册