提交 70e991aa 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器

上级 68b368fb
# -*- coding:utf-8 -*-
# title :地球3D效果
# description :地球3D效果
# author :Python超人
# date :2023-11-28
# link :https://gitcode.net/pythoncr/
# python_version :3.8
# ==============================================================================
from bodies import Earth, Moon, Jupiter
from common.consts import SECONDS_PER_HOUR, AU
from objs import CoreValagaClas
from objs.sci_fi_space_station import ScifiSpaceStation
from sim_scenes.func import ursina_run, create_sphere_sky
from sim_scenes.universe_sim_scenes import UniverseSimScenes
from simulators.ursina.entities.entity_utils import create_directional_light
from simulators.ursina.ursina_event import UrsinaEvent
if __name__ == '__main__':
"""
地球3D效果(透视3D地球)
"""
space_station = ScifiSpaceStation(name="空间站",
size_scale=0.4,
# init_position=[0.46 * mars_radius, 0, -3.55e4],
# init_position=[9e3, -2.3e3, -32e3],
init_position=[10.5e3, -1e3, -52e3],
init_velocity=[0, 0, 0]) \
.set_ignore_gravity(True).set_light_disable(True)
space_ship = CoreValagaClas(name="飞船", mass=1e30, color=(111, 140, 255),
# init_position=[0, 0, 0],
# init_position=[D, 0, -D],
# init_position=[0, D * 1.15, -D * 2.05],
init_position=[9e3, -1e3, -38e3],
init_velocity=[0, 0, 0],
# texture="core_valaga_clas_light.jpg",
# size_scale=self.SIZE_SCALE * 1e3
size_scale=0.6
).set_ignore_gravity(True).set_light_disable(True)
# 创建带有云层的地球
earth = Earth(
# texture="earth_hd.jpg",
# texture="earth_hd_trans.png",
rotation_speed=100,
texture="earth-huge.jpg",
rotate_angle=-25,
init_position=[0, 0, 0],
init_velocity=[0, 0, 0],
size_scale=1)
moon = Moon(init_position=[AU / 60, AU / 80, AU / 10],
distance_scale=0.01,
size_scale=3,
init_velocity=[-(29.79 + 1.03) * 40, 0, 0], ).set_ignore_gravity(True)
jupiter = Jupiter(init_position=[3 * AU / 100, AU / 20, AU / 5], texture="jupiter_hd.jpg",
distance_scale=0.01,
size_scale=0.2,
init_velocity=[-(29.79 + 1.03) * 30, 0, 0], ).set_ignore_gravity(True)
# 创建云层(texture纹理图使用了透明云层的图片,云层的 size_scale 要稍微比地球大一点)
clouds = Earth(name="地球云层", texture="earth-huge-cn-flag.png",
rotate_angle=-25,
rotation_speed=100,
size_scale=1.001, parent=earth)
bodies = [earth, clouds, moon, jupiter, space_ship, space_station]
# bodies = [earth]
# TODO: 开启3D摄像机
from simulators.ursina.entities.camera3d import Camera3d
# 3D摄像机初始化(两眼到鼻梁的距离为1000公里效果)
Camera3d.init(eye_distance=400)
# 录制:
# sim_video_3d_cap.bat featured earth_3d earth_3d.mp4
sky = None
def on_ready():
global sky
from ursina import application
application.time_scale = 0.0001
# 运行前触发
sky = create_sphere_sky(texture="bg_pan2.jpg", scale=10000, rotation_x=20, rotation_y=160, rotation_z=20)
# sky = create_sphere_sky(texture="cosmic_pan_02\cosmic_pan_1.jpg", scale=10000, rotation_y=150)
earth.planet.rotation_y = -100
clouds.planet.rotation_y = -100
clouds.planet.alpha = 0.5
# moon.planet.rotation_x = -90
moon.planet.rotation_y = 100
# 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter)
create_directional_light(position=(10.5e3, -1e3, -175e3), light_num=1, target=moon, look_at_target_always=True)
def on_timer_changed(time_data):
global sky
# print(earth.planet.rotation_y)
sky.rotation_z -= 0.004
p = space_ship.init_position
space_ship.init_position = (p[0], p[1], p[2] + 0.5e1)
space_station.planet.rotation_z += 0.1
p = space_station.init_position
space_station.init_position = (p[0], p[1], p[2] + 0.5e1)
if abs(earth.planet.rotation_y) > 600:
exit(0)
print("earth.rotation_y", abs(earth.planet.rotation_y))
# from ursina import camera, Vec3, time
# camera.parent.position += Vec3(0.0000001 * time_data.dt, 0, -0.0000003 * time_data.dt)
# Camera3d.look_to(earth.planet)
# camera.parent.look_at(earth.planet)
# # camera.rotation_x = 0
# # camera.rotation_y = 0
# camera.rotation_z = 0
UniverseSimScenes.set_window_size((1920, 1079), False)
UrsinaEvent.on_ready_subscription(on_ready)
UrsinaEvent.on_timer_changed_subscription(on_timer_changed)
# 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后-
ursina_run(bodies,
SECONDS_PER_HOUR / 20,
# SECONDS_PER_HOUR,
position=(1.90 * earth.radius, 0, -40000),
cosmic_bg="", # 无背景(黑色)
show_grid=False, # 不显示网格
show_camera_info=False, # 不显示摄像机信息
show_control_info=False, # 不显示控制提示信息
show_exit_button=False,
timer_enabled=True,
view_closely=0.001) # 近距离观看 view_closely=True或0.001
......@@ -23,7 +23,6 @@ import math
import numpy as np
def create_name_text(parent):
"""
......@@ -190,7 +189,8 @@ def create_trail_sphere(parent, pos):
# return value, direction
def create_directional_light(position, target=None, shadows=False, light_num=1, light_color=None):
def create_directional_light(position, target=None, shadows=False, light_num=1, light_color=None,
look_at_target_always=False):
"""
创建平行光(DirectionalLight)
@param position: 光源位置
......@@ -228,13 +228,23 @@ def create_directional_light(position, target=None, shadows=False, light_num=1,
if target is not None:
for light in lights:
if hasattr(target, "planet"):
if hasattr(target.planet, "main_entity"):
light.look_at(target.planet.main_entity)
_target = target.planet.main_entity
else:
light.look_at(target.planet)
_target = target.planet
else:
light.look_at(target)
_target = target
if look_at_target_always:
def light_update():
light.look_at(_target)
light.update = light_update
if shadows:
return lit_with_shadows_shader
......@@ -414,9 +424,10 @@ def create_foreground(foreground_img):
texture=foreground_img,
color=color.white,
origin=(-.48, .48, -.48),
scale=(width*2, height),
scale=(width * 2, height),
position=(-0.86, -0.33, 0)
)
# foreground = Entity(model='quad', scale=(1, 1), texture=foreground_img, eternal=True)
# 设置前景图片层的位置和缩放
......@@ -493,8 +504,8 @@ def create_trail_info(body, trail):
if __name__ == '__main__':
from ursina import *
app = Ursina()
create_foreground("sun.jpg")
EditorCamera()
app.run()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册