You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python制作类似Midjourney官网的字符动画?

实现类似Midjourney首页的螺旋转嵌套圆环动画(Python)

核心实现建议

  • 选对动画库:优先推荐pygame(2D动画控制灵活,适合自定义粒子运动);如果追求精细的数学动画效果,可选择Manim;若需要Web端展示,可结合PyScript让Python代码直接在浏览器运行。
  • 拆解动画模块:
    • 标题逐步生成:通过逐字符延迟渲染实现,或用遮罩层从中心向外展开显示完整标题,控制每帧的字符增量即可。
    • 螺旋运动:基于阿基米德螺旋参数方程 r = a + bθ 生成路径,让粒子沿轨迹运动,同时限制粒子数量避免性能问题。
    • 嵌套圆环过渡:当螺旋达到设定半径后,将粒子平滑映射到同心圆环的圆周路径,调整每个圆环的半径和粒子分布密度,形成嵌套效果。
  • 性能优化:用pygame.sprite批量管理粒子,或在matplotlib中使用LineCollection减少重复绘制调用,避免大量粒子导致的帧率下降。

示例代码(Pygame实现)

import pygame
import math
import sys

# 初始化环境
pygame.init()
WIDTH, HEIGHT = 800, 800
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
FONT = pygame.font.SysFont('Arial', 48, bold=True)

# 动画状态变量
title_text = "MIDJOURNEY"
current_char_count = 0
spiral_particles = []
total_particles = 50
theta = 0.0
spiral_a, spiral_b = 0, 5  # 阿基米德螺旋参数
transition_flag = False
transition_progress = 0.0

# 嵌套圆环参数
ring_radii = [100, 150, 200, 250]
ring_particles = [[] for _ in ring_radii]

def render_title():
    global current_char_count
    # 逐字符渲染标题
    display_content = title_text[:current_char_count]
    text_surface = FONT.render(display_content, True, (255, 255, 255))
    text_rect = text_surface.get_rect(center=(WIDTH//2, HEIGHT//2))
    screen.blit(text_surface, text_rect)
    # 控制字符出现速度(每150ms增加一个字符)
    if pygame.time.get_ticks() % 150 == 0 and current_char_count < len(title_text):
        current_char_count += 1

def update_spiral_to_ring():
    global theta, spiral_particles, transition_flag, transition_progress
    if not transition_flag:
        # 生成螺旋轨迹粒子
        r = spiral_a + spiral_b * theta
        x = WIDTH//2 + r * math.cos(theta)
        y = HEIGHT//2 + r * math.sin(theta)
        spiral_particles.append((x, y))
        # 保持粒子数量上限
        if len(spiral_particles) > total_particles:
            spiral_particles.pop(0)
        theta += 0.1
        # 触发过渡:螺旋半径达到最大圆环半径时切换
        if r > ring_radii[-1]:
            transition_flag = True
    else:
        # 平滑过渡到圆环轨迹
        transition_progress = min(transition_progress + 0.01, 1.0)
        for idx, particle in enumerate(spiral_particles):
            ring_index = idx % len(ring_radii)
            target_r = ring_radii[ring_index]
            # 计算圆环上的目标位置
            angle = (idx / total_particles) * math.pi * 2
            target_x = WIDTH//2 + target_r * math.cos(angle)
            target_y = HEIGHT//2 + target_r * math.sin(angle)
            # 线性插值实现平滑移动
            smooth_x = particle[0] + (target_x - particle[0]) * transition_progress
            smooth_y = particle[1] + (target_y - particle[1]) * transition_progress
            ring_particles[ring_index].append((smooth_x, smooth_y))
        # 过渡完成后清空螺旋粒子
        if transition_progress == 1.0:
            spiral_particles.clear()

def draw_animation_elements():
    # 绘制螺旋或圆环粒子
    if spiral_particles:
        for (x, y) in spiral_particles:
            pygame.draw.circle(screen, (100, 150, 255), (int(x), int(y)), 3)
    else:
        for ring in ring_particles:
            for (x, y) in ring:
                pygame.draw.circle(screen, (100, 150, 255), (int(x), int(y)), 3)
        # 绘制圆环轮廓(可选)
        for r in ring_radii:
            pygame.draw.circle(screen, (80, 120, 200), (WIDTH//2, HEIGHT//2), r, 1)

# 主循环
running = True
while running:
    screen.fill((0, 0, 0))
    # 处理退出事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    render_title()
    update_spiral_to_ring()
    draw_animation_elements()

    pygame.display.flip()
    clock.tick(30)

pygame.quit()
sys.exit()

可参考的GitHub项目

  • manim-examples:包含大量Manim制作的数学动画案例,可参考粒子运动轨迹和文字逐帧生成的实现逻辑。
  • pygame-animation-collection:收集了多种Pygame基础动画实例,其中螺旋、圆环类效果的代码可直接借鉴。
  • pyprocessing-examples:基于Processing的Python实现,有不少创意形态转换动画,适合参考螺旋转圆环的过渡逻辑。

内容的提问来源于stack exchange,提问作者Adan Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:04