关于在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秒。
- 循环3次模拟骰子滚动:每次生成新的随机骰子,用旋转+淡入淡出的效果切换,模拟滚动的视觉感。
- 最后停留2秒展示最终点数。
自定义小技巧
- 调整骰子大小:修改
Square的side_length和Circle的radius参数即可。 - 增强滚动真实感:可以把
Rotate的角度改成2*PI(一圈),或者添加上下移动的动画,比如current_dice.animate.shift(UP)配合旋转。 - 控制滚动次数:修改
range(3)里的数字,就能改变骰子滚动的次数。
备注:内容来源于stack exchange,提问作者KolmogorovTierGod
相关产品推荐
相关产品推荐

