究極炫酷3D立方體宇宙

演示動畫:https://life.mdjsjd.me/2024/12/27/3d-cube-animation/

一個使用Python和Pygame制作的炫酷3D立方體動畫效果。結合了多種視覺特效,包括:

  • 動態旋轉的3D立方體
  • 炫彩漸變的顏色系統
  • 星空背景粒子效果
  • 動態殘影拖尾效果
  • 深度透視投影

主要特性

  • 動態變換: 立方體會進行多維度旋轉和形變
  • 顏色系統: 支持多種配色方案的平滑漸變
  • 星空背景: 動態的星空粒子背景效果
  • 視覺特效: 包含殘影、脈沖等視覺效果

實現細節

該動畫主要由以下幾個核心類組成:

  • ColorPalette: 處理顏色漸變
  • StarField: 生成星空背景
  • AdvancedCubeAnimation: 控制立方體變換與渲染

使用了多種數學變換矩陣實現3D效果:

  • 旋轉矩陣
  • 錯切變換
  • 透視投影

運行方式

1.安裝依賴:

pip install pygame numpy opencv-python

2.代碼:

import pygame
import math
import numpy as np
import random
import cv2
import os# 初始化Pygame
pygame.init()# 屏幕設置
WIDTH, HEIGHT = 1200, 800
screen = pygame.display.set_mode((WIDTH, HEIGHT), pygame.DOUBLEBUF | pygame.HWSURFACE)
pygame.display.set_caption("🚀 究極炫酷3D立方體宇宙 🌌")
clock = pygame.time.Clock()# 顏色和漸變
class ColorPalette:def __init__(self):self.palettes = [[(255, 50, 50), (50, 255, 50), (50, 50, 255)],  # 經典RGB[(255, 100, 0), (255, 200, 0), (200, 0, 255)],  # 霓虹[(0, 255, 255), (255, 0, 255), (255, 255, 0)],  # 賽博朋克[(100, 0, 255), (0, 255, 100), (255, 0, 100)],  # 科技感]self.current_palette = random.choice(self.palettes)self.transition_speed = 0.02self.color_index = 0self.next_color_index = (self.color_index + 1) % len(self.current_palette)self.color_progress = 0def get_interpolated_color(self):start_color = self.current_palette[self.color_index]end_color = self.current_palette[self.next_color_index]r = start_color[0] + (end_color[0] - start_color[0]) * self.color_progressg = start_color[1] + (end_color[1] - start_color[1]) * self.color_progressb = start_color[2] + (end_color[2] - start_color[2]) * self.color_progressself.color_progress += self.transition_speedif self.color_progress >= 1:self.color_progress = 0self.color_index = self.next_color_indexself.next_color_index = (self.color_index + 1) % len(self.current_palette)return (int(r), int(g), int(b))# 背景星空特效
class StarField:def __init__(self, num_stars=200):self.stars = []for _ in range(num_stars):x = random.randint(0, WIDTH)y = random.randint(0, HEIGHT)z = random.uniform(0, 1)self.stars.append([x, y, z])def move_stars(self):for star in self.stars:star[2] -= 0.05if star[2] <= 0:star[0] = random.randint(0, WIDTH)star[1] = random.randint(0, HEIGHT)star[2] = 1def draw(self, screen):for star in self.stars:size = int((1 - star[2]) * 3)brightness = int(255 * (1 - star[2]))color = (brightness, brightness, brightness)pygame.draw.circle(screen, color, (int(star[0]), int(star[1])), size)# 3D變換矩陣(增加更多變換方式)
def create_transformation_matrices():matrices = {'rotate_x': lambda angle: np.array([[1, 0, 0],[0, math.cos(angle), -math.sin(angle)],[0, math.sin(angle), math.cos(angle)]]),'rotate_y': lambda angle: np.array([[math.cos(angle), 0, math.sin(angle)],[0, 1, 0],[-math.sin(angle), 0, math.cos(angle)]]),'rotate_z': lambda angle: np.array([[math.cos(angle), -math.sin(angle), 0],[math.sin(angle), math.cos(angle), 0],[0, 0, 1]]),'shear_x': lambda s: np.array([[1, s, 0],[0, 1, 0],[0, 0, 1]]),'shear_y': lambda s: np.array([[1, 0, 0],[s, 1, 0],[0, 0, 1]])}return matrices# 立方體生成器(增加隨機性和復雜性)
def create_dynamic_cube(size=1, complexity=1):half = size / 2base_vertices = np.array([[-half, -half, -half],[half, -half, -half],[half, half, -half],[-half, half, -half],[-half, -half, half],[half, -half, half],[half, half, half],[-half, half, half]])# 隨機擾動頂點if complexity > 0:noise = np.random.uniform(-complexity * 0.1, complexity * 0.1, base_vertices.shape)base_vertices += noisereturn base_vertices# 投影函數(改進的透視投影)
def advanced_project(point, distance=5, width=WIDTH, height=HEIGHT):x, y, z = point# 非線性深度縮放scale_factor = 1 / (1 + math.exp(-z))perspective_factor = distance / (distance + z + 0.1)x_proj = x * perspective_factor * width * 0.3y_proj = y * perspective_factor * height * 0.3return (int(x_proj + width / 2),int(y_proj + height / 2),scale_factor)# 主動畫類(增加更多動態效果)
class AdvancedCubeAnimation:def __init__(self):self.matrices = create_transformation_matrices()self.cube = create_dynamic_cube(complexity=1.5)self.color_palette = ColorPalette()self.starfield = StarField()# 多樣的動畫參數self.rotation_params = {'x': {'angle': 0, 'speed': 0.02, 'amplitude': 1},'y': {'angle': 0, 'speed': 0.015, 'amplitude': 1.2},'z': {'angle': 0, 'speed': 0.01, 'amplitude': 0.8}}# 額外的變形參數self.morph_params = {'shear_x': 0,'shear_y': 0,'morph_speed_x': 0.05,'morph_speed_y': 0.03}# 炫酷特效參數self.effect_params = {'pulse_scale': 1,'pulse_speed': 0.02,'trail_mode': False,'glitch_mode': False}def update_transformations(self):# 更新旋轉for axis, params in self.rotation_params.items():params['angle'] += params['speed'] * params['amplitude']# 更新形變self.morph_params['shear_x'] = math.sin(pygame.time.get_ticks() * 0.001) * 0.5self.morph_params['shear_y'] = math.cos(pygame.time.get_ticks() * 0.002) * 0.5# 脈沖效果self.effect_params['pulse_scale'] = 1 + math.sin(pygame.time.get_ticks() * self.effect_params['pulse_speed']) * 0.2def apply_transformations(self):# 組合變換矩陣Rx = self.matrices['rotate_x'](self.rotation_params['x']['angle'])Ry = self.matrices['rotate_y'](self.rotation_params['y']['angle'])Rz = self.matrices['rotate_z'](self.rotation_params['z']['angle'])Sx = self.matrices['shear_x'](self.morph_params['shear_x'])Sy = self.matrices['shear_y'](self.morph_params['shear_y'])# 組合旋轉和形變transformation = Rz @ Ry @ Rx @ Sy @ Sxreturn self.cube @ transformation.Tdef draw_cube(self, screen):# 應用變換transformed_cube = self.apply_transformations()# 立方體的邊edges = [(0, 1), (1, 2), (2, 3), (3, 0),  # 底面(4, 5), (5, 6), (6, 7), (7, 4),  # 頂面(0, 4), (1, 5), (2, 6), (3, 7)   # 連接邊]# 獲取動態顏色base_color = self.color_palette.get_interpolated_color()# 繪制邊for edge in edges:start = transformed_cube[edge[0]]end = transformed_cube[edge[1]]start_2d = advanced_project(start)end_2d = advanced_project(end)# 根據深度調整線條depth_factor = start_2d[2]line_width = max(1, int(4 * depth_factor))# 應用脈沖和顏色變化pulse_color = tuple(int(c * (0.7 + depth_factor * 0.3)) for c in base_color)pygame.draw.line(screen, pulse_color, start_2d[:2], end_2d[:2], line_width)def main():# 初始化animation = AdvancedCubeAnimation()# 視頻導出準備os.makedirs('output', exist_ok=True)# OpenCV視頻寫入器fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter('output/3d_cube_animation.mp4', fourcc, 60.0, (WIDTH, HEIGHT))# 創建背景background = pygame.Surface(screen.get_size())background = background.convert()# 總幀數和持續時間frame_count = 0max_frames = 600  # 10秒 * 60幀while frame_count < max_frames:# 背景處理(拖尾效果)background.set_alpha(50)screen.blit(background, (0, 0))# 繪制星空背景animation.starfield.move_stars()animation.starfield.draw(screen)# 繪制立方體animation.update_transformations()animation.draw_cube(screen)# 更新顯示pygame.display.flip()# 捕獲幀frame_surface = screen.copy()frame_data = pygame.surfarray.array3d(frame_surface)frame_data = frame_data.transpose([1, 0, 2])# 轉換為 OpenCV 格式 (BGR)frame_bgr = cv2.cvtColor(frame_data, cv2.COLOR_RGB2BGR)out.write(frame_bgr)frame_count += 1clock.tick(60)# 釋放資源out.release()pygame.quit()print("視頻導出完成!保存在 output/3d_cube_animation.mp4")if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64655.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是 Azure OpenAI ?了解微軟 Azure OpenAI 和 OpenAI 的關系

一、什么是Azure OpenAI &#xff1f; 微軟已與 OpenAI 合作以實現三個主要目標&#xff1a; ?利用 Azure 的基礎結構&#xff08;包括安全性、合規性和區域可用性&#xff09;&#xff0c;幫助用戶構建企業級應用程序。 ?在微軟產品&#xff08;包括 Azure AI 產品以及以外…

Linux day 1129

家人們今天繼續學習Linux&#xff0c;ok話不多說一起去看看吧 三.Linux常用命令 3.1 Linux命令體驗 3.1.1 常用命令演示 在這一部分中&#xff0c;我們主要介紹幾個常用的命令&#xff0c;讓大家快速感 受以下 Linux 指令的操作方式。主要包含以下幾個指令&#xff1a; ls命…

mysql8 從C++源碼角度看 Statement cancelled due to timeout or client request異常

##Statement cancelled due to timeout or client request 異常 Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client requestat com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1932)at …

【數據結構-單調隊列】力扣1438. 絕對差不超過限制的最長連續子數組

給你一個整數數組 nums &#xff0c;和一個表示限制的整數 limit&#xff0c;請你返回最長連續子數組的長度&#xff0c;該子數組中的任意兩個元素之間的絕對差必須小于或者等于 limit 。 如果不存在滿足條件的子數組&#xff0c;則返回 0 。 示例 1&#xff1a; 輸入&#x…

SAP HCM 標準報表與前臺操作的增強差異邏輯分析(rhgrenz4)

導讀 增強差異:SAP的HCM模塊組織和人事增強都有標準的增強點&#xff0c;不管你調用標準的函數還是前臺操作都會觸發對應的增強。所以很多業務不需要考慮那么多分散點&#xff0c;只要找到一個合適的增強點&#xff0c;就能解決很多和外圍系統集成的業務邏輯&#xff0c;今天遇…

【Spring】Spring DI(依賴注入)詳解——自動裝配——手動裝配與自動裝配的區別

在spring開發中&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是實現松耦合和高內聚設計的重要模式。它使得對象的創建和管理與其依賴關系分離&#xff0c;從而提高了代碼的可維護性、可測試性和靈活性。Spring框架通過IoC&#xff08;控制反…

EZ-USB? FX3 USB 5 Gbps 外設控制器

EZ-USB? FX3 USB 5 Gbps 外設控制器 EZ-USB? FX3 提供 USB 5Gbps 至 32 位數據總線&#xff0c;并配備 ARM9&#xff0c;可為任何系統添加 USB 3.0 連接 英飛凌的 EZ-USB? FX3 是業界用途最廣泛的 USB 外圍設備控制器&#xff0c;可以為幾乎任何系統添加 USB 5Gbps 連接。 …

【數據倉庫】spark大數據處理框架

文章目錄 概述架構spark 架構角色下載安裝啟動pyspark啟動spark-sehll啟動spark-sqlspark-submit經驗 概述 Spark是一個性能優異的集群計算框架&#xff0c;廣泛應用于大數據領域。類似Hadoop&#xff0c;但對Hadoop做了優化&#xff0c;計算任務的中間結果可以存儲在內存中&a…

數據庫容災備份的意義+分類+執行工具!

數據庫容災解決方案的背景 數據庫容災&#xff08;Disaster Recovery&#xff0c;DR&#xff09;解決方案的背景主要源于企業對數據安全性、業務連續性和系統高可用性的需求。隨著數字化轉型的加速&#xff0c;企業的數據量迅猛增長&#xff0c;數據庫已成為支撐核心業務的關鍵…

PDF怎么壓縮得又小又清晰?5種PDF壓縮方法

PDF 文件在日常辦公與學習中使用極為頻繁&#xff0c;可想要把它壓縮得又小又清晰卻困難重重。一方面&#xff0c;PDF 格式本身具有高度兼容性&#xff0c;集成了文字、圖像、矢量圖等多樣元素&#xff0c;壓縮時難以兼顧不同元素特性&#xff0c;稍不注意&#xff0c;文字就會…

SpringBoot數據字典字段自動生成對應code和desc

效果&#xff1a;接口會返回orderType&#xff0c;但是這個orderType是枚舉的類型&#xff08;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff09;&#xff0c;我想多返回一個orderTypeDesc給前端展示&#xff0c;這樣前端就可以直接拿orderTypeDesc使用了。 1. 定義注解 …

【YashanDB知識庫】imp導入數據庫時,報錯YAS-08023

本文內容來自YashanDB官網&#xff0c;原文內容請見 https://www.yashandb.com/newsinfo/7849010.html?templateId1718516 **【問題分類】**數據導入導出 **【關鍵字】**imp、YAS-08023 【問題描述】 導出數據庫時&#xff0c;使用以下命令&#xff0c;導出正常&#xff1…

又一年。。。。。。

2024&#xff0c;渾渾噩噩的一年。 除了100以內的加減法&#xff08;數據&#xff0c;數據&#xff0c;還是數據。。。。。。&#xff09;&#xff0c;似乎沒做些什么。 臉盲癥越來越重的&#xff0c;怕是哪天連自己都不認得自己的了。 看到什么&#xff0c;聽到什…

FreeRTOS: ISR(中斷服務例程)和 TCB(任務控制塊)

在討論 ISR&#xff08;中斷服務例程&#xff09;和 TCB&#xff08;任務控制塊&#xff0c;Task Control Block&#xff09;時&#xff0c;我們實際上是在探討 FreeRTOS 中兩個不同但又相互關聯的概念&#xff1a;一個是用于處理硬件或軟件觸發的中斷事件&#xff0c;另一個是…

GoldenDB組件及對應的用戶和進程

1. GoldenDB組件及對應的用戶和進程 GoldenDB數據庫由管理節點、全局事務節點GTM、計算節點CN、數據節點DN等組成。 1.1. 管理節點 管理節點分為集群管理、Insight運維管理平臺&#xff08;InsightServer、RDB、ZK&#xff09;。 1.1.1. 集群管理 1. 集群管理包括Metadatas…

OpenStack系列第四篇:云平臺基礎功能與操作(Dashboard)

文章目錄 1. 鏡像&#xff08;Image&#xff09;添加鏡像查看鏡像刪除鏡像 2. 卷&#xff08;Volume&#xff09;創建卷查看卷刪除卷 3. 網絡&#xff08;虛擬網絡&#xff09;創建網絡查看網絡刪除網絡 4. 實例類型創建實例類型查看實例類型刪除實例類型 4. 密鑰對&#xff08…

CSDN編輯器

這里寫自定義目錄標題 歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants 創建一個自定義列表如何創建一個…

MTK 平臺關于WIFI 6E P2P的解說

一 前言 官方 P2P 6E 設計原理,請查看這個網站 hostap - hostapd/wpa_supplicant 配置:p2p_6ghz_disable 允許上層指定是否允許6G連接 僅允許6G用于WFD –不允許6G用于純P2P 缺點:存在很多 IOT issues 如:一些物聯網設備無法識別6G類/信道,可能存在物聯網問…

四大自平衡樹對比:AVL樹、紅黑樹、B樹與B+樹

AVL樹、紅黑樹、B樹和B樹的對比與應用場景 樹系列相關文章&#xff08;置頂&#xff09; 1、從鏈表到平衡樹&#xff1a;二叉查找樹的退化與優化 2、自平衡二叉查找樹&#xff1a;如何讓二叉查找樹始終保持高效 3、AVL樹入門&#xff1a;理解自平衡二叉查找樹的基礎 4、紅黑樹全…

Linux下讀取Windows下保存的文件,報錯信息中出現“^M“時如何解決?【由于Windows和Linux的換行方式不同造成的-提供兩種轉換方式】

Windows 和 Linux 的文本文件使用的換行符不同&#xff1a; Windows 使用 \r\n &#xff08;回車 換行&#xff09;。Linux 使用 \n &#xff08;換行&#xff09;。 因此&#xff0c;當在 Linux 系統上運行帶有 Windows 換行符的腳本或讀取相關文件時&#xff0c;可能會出現…