From d41c662f08a79951fbe1eaf5988bc044a09cb904 Mon Sep 17 00:00:00 2001 From: march3 Date: Sun, 26 Mar 2023 18:02:11 +0800 Subject: [PATCH] =?UTF-8?q?Python=E8=B6=85=E4=BA=BA-=E5=AE=87=E5=AE=99?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sim_scenes/interest/__init__.py | 0 sim_scenes/interest/images/eye.png | Bin 0 -> 3182 bytes sim_scenes/interest/the_eye_of_god.py | 86 ++++++++++++++++++++++++ sim_scenes/interest/utils/__init__.py | 0 sim_scenes/interest/utils/body_utils.py | 77 +++++++++++++++++++++ simulators/views/ursina_view.py | 10 ++- 6 files changed, 170 insertions(+), 3 deletions(-) create mode 100644 sim_scenes/interest/__init__.py create mode 100644 sim_scenes/interest/images/eye.png create mode 100644 sim_scenes/interest/the_eye_of_god.py create mode 100644 sim_scenes/interest/utils/__init__.py create mode 100644 sim_scenes/interest/utils/body_utils.py diff --git a/sim_scenes/interest/__init__.py b/sim_scenes/interest/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sim_scenes/interest/images/eye.png b/sim_scenes/interest/images/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..0a0024bf88cfe1528599280998b7b3ca8f7dcb9c GIT binary patch literal 3182 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 255 and pixel[1] >= 255 and pixel[1] >= 255: + continue + body_str = body_template % (f"星球{h}:{w}", pixel[0], pixel[1], pixel[2], scale, + w * interval_factor, -h * interval_factor, scale) + bodies_str += body_str + ",\n" + + bodies_str += "]" + return eval(bodies_str, params) + + +if __name__ == '__main__': + show_eye_of_god() diff --git a/sim_scenes/interest/utils/__init__.py b/sim_scenes/interest/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sim_scenes/interest/utils/body_utils.py b/sim_scenes/interest/utils/body_utils.py new file mode 100644 index 0000000..b8ceb08 --- /dev/null +++ b/sim_scenes/interest/utils/body_utils.py @@ -0,0 +1,77 @@ +# -*- coding:utf-8 -*- +# title :Body工具类 +# description :Body工具类 +# author :Python超人 +# date :2023-03-26 +# link :https://gitcode.net/pythoncr/ +# python_version :3.8 +# ============================================================================== + + +def gen_eye_bodies(pixel_image, params, body_template=None): + """ + 根据像素图片以及参数,自动生成星球,注意图片像素不能太多,否则会导致电脑运行太慢 + @param pixel_image: + @param params: + @return: + """ + from PIL import Image + + img = Image.open(pixel_image).convert('RGBA') + width, height = img.size + interval_factor = 20 # 星球间距因子 + if body_template is None: + body_template = 'Body(name="%s", mass=mass, color=(%d, %d, %d), size_scale=%.4f, ' \ + 'init_position=get_position([0, %g * D, %g * D], %.4f), init_velocity=[0, 0, 0], ignore_mass=True)' + bodies_str = "[" + + # 以图片像素为坐标,对角线的距离 + distance_hw = pow(pow(width, 2) + pow(height, 2), 1 / 2) + + for h in range(0, height): + # row = [] + for w in range(0, width): + # 以图片像素为坐标,每个像素点到中心的距离 + distance_to_center = pow(pow(w - width / 2, 2) + pow(h - height / 2, 2), 1 / 2) + # 让 body 从中心开始,离摄像机越远, body 的缩放值越大(scale 就越大,) + scale = (distance_to_center / (distance_hw * 10) + 1) # 中心最近 1.0 ~ 1.05 + # TODO: 队列反向排列(中心最远 1.05 ~ 1.0) + # scale = 1.05 - scale + 1.0 + # print(scale) + # 获取像素的颜色 + pixel = img.getpixel((w, h)) + # 对于纯白色的颜色,就忽略,不生成星球(这样像素中纯白色越多,对电脑的压力就越少) + if pixel[0] >= 255 and pixel[1] >= 255 and pixel[1] >= 255: + continue + body_str = body_template % (f"星球{h}:{w}", pixel[0], pixel[1], pixel[2], scale, + w * interval_factor, -h * interval_factor, scale) + bodies_str += body_str + ",\n" + + bodies_str += "]" + return eval(bodies_str, params) + + +if __name__ == '__main__': + import random + from bodies import Body + + D = 600 + mass = 0.9e25 + # camera_pos = 左-右+、上+下-、前+后- + camera_pos = (-100 * D, 0, -5000 * D) + + + def get_position(pos, scale): + # [ 远+近- , 左+右- , 上+下-] + return pos[0] + (scale - 1.0) * 300 * (random.randint(90, 110)) * D, pos[1], pos[2] + # return pos[0], pos[1], pos[2] + + + bodies: list = gen_eye_bodies(pixel_image="../images/eye.png", + params={"D": D, + "Body": Body, + "mass": mass, + "get_position": get_position, + "camera_pos": camera_pos}) + + print(bodies) diff --git a/simulators/views/ursina_view.py b/simulators/views/ursina_view.py index d6fa3fa..bda27f4 100644 --- a/simulators/views/ursina_view.py +++ b/simulators/views/ursina_view.py @@ -95,8 +95,14 @@ class Planet(Entity): self.init_scale = scale if hasattr(body_view, "texture"): texture = load_texture(body_view.texture) + # color.white + self.plant_color = color.white else: texture = None + b_color = self.body_view.color + if len(b_color) == 3: + b_color = (b_color[0], b_color[1], b_color[2], 1.0) + self.plant_color = color.rgba(*b_color) if hasattr(self.body_view.body, "torus_stars"): # 创建一个星环小天体群(主要模拟小行星群,非一个天体) @@ -108,9 +114,7 @@ class Planet(Entity): rotation = (0, 0, 0) UrsinaEvent.on_reset_subscription(self.on_reset) - # color.white - self.plant_color = color.white - # self.plant_color = color.rgba(*self.body_view.color) + super().__init__( # model="sphere", model=model, -- GitLab