|
在动画制作中,发光效果是一种非常吸引眼球的视觉元素,它可以为简单的线条增添动态和活力。 今天,我们将通过Manim框架来实现一个线条的发光效果,并逐步解析代码,让你轻松掌握这个技巧。 准备工作 首先确保安装Manim社区版(ManimCE): pip install manim 实现的思路 要让线条发光,我们需要在基础线条的周围添加一层层的“发光层”,并通过动态调整这些发光层的透明度和宽度,来模拟发光的效果。 主要思路和步骤如下: 创建基础线条:首先绘制一条普通的线条作为发光的基础。 添加发光层:在基础线条的周围添加多层线条,这些线条将作为发光效果的载体。 动态调整发光层属性:通过正弦波函数动态调整发光层的透明度和宽度,使其产生闪烁的发光效果。 实现的过程 按照实现的思路,下面逐步来实现: 创建基础线条 class PulsingGlowLine(Scene): def construct(self): # 创建基础直线 line = Line(LEFT, RIGHT, color=BLUE, stroke_width=2).scale(3) line.set_stroke(width=2) # 第一阶段:绘制基础直线 self.play(Create(line)) self.wait(0.5) 其中代码主要含义: Line(LEFT, RIGHT, color=BLUE, stroke_width=2):创建了一条从左到右的蓝色线条,宽度为2。 .scale(3):将线条放大3倍,使其更明显。 self.play(Create(line)):使用 Create 动画将线条绘制到场景中。 self.wait(0.5):暂停0.5秒,让用户有时间看清基础线条。 添加发光层 # 创建发光效果组 glow_group = VGroup() colors = [BLUE_A, BLUE_E, RED_A, RED_E] # 发光颜色序列 num_layers = 12 # 发光层数量 # 创建多层发光效果 for i in range(num_layers): glow = line.copy() phase = i / num_layers # 相位控制 # 设置发光层属性 glow.set_stroke( width=5 * (1 - phase) + 2, # 宽度递减 color=colors[i % len(colors)], opacity=0, # 初始完全透明 ) glow_group.add(glow) 其中代码主要含义: VGroup():是一个组合对象,用于管理多个图形对象。 colors:是一个颜色列表,用于为发光层指定不同的颜色。 num_layers:定义了发光层的数量。 在循环中:通过 line.copy() 复制基础线条,并调整其宽度、颜色和透明度。 width=5 * (1 - phase) + 2:使发光层的宽度从外到内逐渐减小。 opacity=0:将发光层的初始透明度设置为完全透明,后续通过动态调整透明度来实现发光效果。 动态调整发光层属性 # 将发光层放在基础线下方 glow_group.set_z_index(line.z_index - 1) self.add(glow_group, line) self.wait() # 定义更新函数实现脉冲效果 def update_glow(group, dt): # 使用正弦波生成动态参数 t = self.time * 2 # 控制脉冲速度 for i, glow in enumerate(group): phase = i * 0.15 # 相位偏移量 intensity = (np.sin(t + phase) + 1) / 2 # 0-1之间波动 # 动态调整属性 glow.set_stroke( opacity=intensity * 0.5, # 透明度波动 width=5 * intensity + 2, # 宽度波动 ) # 添加持续更新器 glow_group.add_updater(update_glow) self.wait(6) # 展示6秒动态效果 其中代码主要含义: glow_group.set_z_index(line.z_index - 1):将发光层放在基础线条的下方,避免遮挡基础线条。 update_glow:是一个更新函数,用于动态调整发光层的属性。 self.time:是ManimCE内置的时间变量,表示动画播放的时间。 np.sin(t + phase):生成一个在-1到1之间波动的值,通过(np.sin(t + phase) + 1) / 2 将其转换为0到1之间的值,作为发光强度intensity。 glow.set_stroke(opacity=intensity * 0.5, width=5 * intensity + 2):动态调整发光层的透明度和宽度,使其产生闪烁的效果。 glow_group.add_updater(update_glow):将更新函数绑定到发光层组,使其在动画播放过程中持续更新。 self.wait(6):让动画展示6秒的发光效果。 结束动画 # 移除更新器并保持最终状态 glow_group.remove_updater(update_glow) self.remove(glow_group) self.wait() 代码主要含义: glow_group.remove_updater(update_glow):移除更新函数,停止发光效果的动态变化。 self.remove(glow_group):将发光层组从场景中移除。 self.wait():暂停动画,等待用户手动停止。 整个代码运行效果如下: |

OpenAI在今日的线上直播中震撼发布了一款全新的云端AI编程智能体——Codex,标志着AI编程新时代的正式开启。由Greg Brockman带领的OpenAI六人团队向全球展示了这一强大工具,它能够在半小时内完成以往可能需要数天的 ...