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

关于在Manim项目中创建随机数值骰子动画的技术咨询

在Manim项目中创建随机数值骰子动画的技术咨询

嘿,我完全理解你刚接触Manim时面对代码的困惑——别担心,我会一步步带你实现这个随机骰子动画,尽量把内容拆解得简单易懂!

完整可运行代码示例

先给你一个直接能跑的代码,之后再拆解每部分的作用:

from manim import *
import random

class DiceAnimation(Scene):
    def construct(self):
        # 定义骰子的白色边框
        dice_square = Square(side_length=3, stroke_width=4, color=WHITE)
        
        # 预定义1-6点的圆点相对位置(以骰子中心为原点)
        dot_positions = [
            [(0, 0, 0)],                          # 1点:中心
            [(-1, 1, 0), (1, -1, 0)],             # 2点:对角
            [(-1, 1, 0), (0, 0, 0), (1, -1, 0)],  # 3点:对角+中心
            [(-1, 1, 0), (1, 1, 0), (-1, -1, 0), (1, -1, 0)], # 4点:四个角
            [(-1, 1, 0), (1, 1, 0), (0, 0, 0), (-1, -1, 0), (1, -1, 0)], # 5点:四角+中心
            [(-1, 1, 0), (0, 1, 0), (1, 1, 0), (-1, -1, 0), (0, -1, 0), (1, -1, 0)] # 6点:两行三列
        ]
        
        # 生成随机点数的骰子的核心函数
        def get_random_dice():
            dice_value = random.randint(1,6)
            # 根据点数创建对应的圆点组
            dots = VGroup(*[Circle(radius=0.3, color=BLACK, fill_opacity=1).move_to(pos) for pos in dot_positions[dice_value-1]])
            # 把边框和圆点组合成完整骰子
            dice = VGroup(dice_square, dots)
            return dice, dice_value
        
        # 初始显示第一个随机骰子
        current_dice, current_value = get_random_dice()
        self.play(FadeIn(current_dice))
        self.wait(1)
        
        # 模拟骰子滚动的动画循环
        for _ in range(3):
            next_dice, next_value = get_random_dice()
            # 用旋转+淡换的效果模拟滚动感
            self.play(
                Rotate(current_dice, angle=PI, run_time=0.5),
                FadeOut(current_dice, run_time=0.5),
                FadeIn(next_dice, run_time=0.5)
            )
            current_dice = next_dice
            self.wait(0.3)
        
        # 最后停留显示最终结果
        self.wait(2)

代码拆解说明

  • 导入依赖:from manim import *是Manim的核心库,import random用来生成随机点数。
  • 动画类结构:所有Manim动画都需要继承Scene类,construct方法是编写动画逻辑的主入口。
  • 骰子基础元素:
    • dice_square是骰子的白色边框,你可以通过side_length调整大小,stroke_width调整边框粗细。
    • dot_positions是预定义的1-6点的圆点位置,用相对坐标(以骰子中心为原点)定义,确保点数位置始终对应骰子。
  • 核心随机函数:get_random_dice()会随机生成1-6的数值,然后根据数值创建对应点数的圆点,再把边框和圆点组合成完整的骰子对象。
  • 动画流程:
    1. 先显示第一个随机骰子,停留1秒。
    2. 循环3次模拟骰子滚动:每次生成新的随机骰子,用旋转+淡入淡出的效果切换,模拟滚动的视觉感。
    3. 最后停留2秒展示最终点数。

自定义小技巧

  • 调整骰子大小:修改Square的side_length和Circle的radius参数即可。
  • 增强滚动真实感:可以把Rotate的角度改成2*PI(一圈),或者添加上下移动的动画,比如current_dice.animate.shift(UP)配合旋转。
  • 控制滚动次数:修改range(3)里的数字,就能改变骰子滚动的次数。

备注:内容来源于stack exchange,提问作者KolmogorovTierGod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 10:23:04