3D螺旋动画:用Manim轻松实现DNA双螺旋结构
你还在为制作DNA动画烦恼吗?用Manim框架只需几行代码,就能创建专业级的双螺旋结构动画。读完本文,你将掌握三维建模、螺旋路径生成和遗传序列可视化的核心技巧,让抽象的DNA结构变得生动直观。
核心技术模块解析
Manim提供了丰富的三维建模工具,其中最关键的是Surface类和螺旋路径生成函数。通过组合这些工具,我们可以构建出逼真的DNA双螺旋结构。
三维表面建模基础
Surface类位于manim/mobject/three_d/three_dimensions.py,它允许我们通过参数方程定义复杂的三维表面。下面是创建一个简单螺旋面的示例:
from manim import *
class DNAScene(ThreeDScene):
def construct(self):
# 设置3D摄像机视角
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
# 定义DNA螺旋参数方程
def dna_helix(u, v):
radius = 1
height = 0.5
x = radius * np.cos(v)
y = radius * np.sin(v)
z = u * height
return np.array([x, y, z])
# 创建左侧螺旋链
left_strand = Surface(
dna_helix,
u_range=[-5, 5],
v_range=[0, TAU],
resolution=(10, 32),
fill_color=BLUE,
fill_opacity=0.8
)
# 创建右侧螺旋链(旋转180度)
right_strand = Surface(
lambda u, v: dna_helix(u, v + PI),
u_range=[-5, 5],
v_range=[0, TAU],
resolution=(10, 32),
fill_color=RED,
fill_opacity=0.8
)
self.add(left_strand, right_strand)
self.wait(2)
螺旋路径生成技术
Manim的路径工具模块提供了螺旋路径生成函数,位于manim/utils/paths.py。spiral_path函数可以生成平滑的螺旋轨迹,非常适合模拟DNA链的走向:
# 从 utils.paths 导入螺旋路径生成函数
from manim.utils.paths import spiral_path
# 创建沿螺旋路径运动的动画
def construct(self):
# ... 前面的代码省略 ...
# 创建DNA碱基对
base_pairs = VGroup()
for i in range(20):
# 计算每个碱基对的位置
angle = i * 0.5
x = np.cos(angle)
y = np.sin(angle)
z = i * 0.5 - 5
# 创建碱基对(使用圆柱表示)
pair = Cylinder(
radius=0.2,
height=1.5,
color=GREEN,
fill_opacity=0.9
).move_to([x, y, z])
# 旋转使碱基对垂直于螺旋轴
pair.rotate(angle, axis=OUT)
base_pairs.add(pair)
# 使用SpiralIn动画使碱基对沿螺旋路径飞入
self.play(
SpiralIn(base_pairs, scale_factor=2),
run_time=3
)
SpiralIn动画效果由manim/animation/creation.py中的SpiralIn类实现,它能让多个对象沿螺旋轨迹同时飞入场景,创造出非常震撼的视觉效果。
完整DNA动画实现
结合上述技术,我们可以创建一个完整的DNA双螺旋动画,包括两条反向平行的螺旋链和连接它们的碱基对。下面是完整的实现代码:
from manim import *
from manim.utils.paths import spiral_path
class DNAAnimation(ThreeDScene):
def construct(self):
# 设置3D摄像机
self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES)
# 1. 创建DNA骨架
def create_strand(color, rotation=0):
return Surface(
lambda u, v: np.array([
np.cos(v + rotation),
np.sin(v + rotation),
u * 0.5
]),
u_range=[-5, 5],
v_range=[0, TAU],
resolution=(10, 32),
fill_color=color,
fill_opacity=0.7
)
# 创建两条反向平行的螺旋链
left_strand = create_strand(BLUE)
right_strand = create_strand(RED, rotation=PI)
# 2. 创建碱基对
base_pairs = VGroup()
colors = [PURPLE, YELLOW, GREEN, ORANGE] # 四种碱基的颜色
for i in range(20):
angle = i * 0.3
z_pos = i * 0.5 - 5
# A-T碱基对
at_pair = Cylinder(
radius=0.2, height=1.4, color=colors[i%2], fill_opacity=0.9
).move_to([np.cos(angle), np.sin(angle), z_pos])
at_pair.rotate(angle, axis=OUT)
# G-C碱基对
gc_pair = Cylinder(
radius=0.2, height=1.4, color=colors[(i+2)%2], fill_opacity=0.9
).move_to([np.cos(angle + PI), np.sin(angle + PI), z_pos])
gc_pair.rotate(angle + PI, axis=OUT)
base_pairs.add(at_pair, gc_pair)
# 3. 添加动画效果
self.play(
Create(left_strand),
Create(right_strand),
run_time=2
)
self.play(
SpiralIn(base_pairs, scale_factor=3), # 使用螺旋进入动画
run_time=3
)
# 4. 旋转展示
self.play(
Rotate(
VGroup(left_strand, right_strand, base_pairs),
angle=TAU,
axis=OUT,
run_time=10
)
)
self.wait(2)
遗传序列可视化扩展
Manim不仅可以创建静态的DNA结构,还能动态展示遗传信息。通过结合Text和Write动画,我们可以将DNA序列与三维结构关联起来:
# 在DNAAnimation类的construct方法中添加
def construct(self):
# ... 前面的DNA创建代码 ...
# 创建DNA序列文本
dna_sequence = Text(
"ATCG-GCTA-TAGC-CGAT",
font_size=24
).to_edge(DOWN)
# 使用Write动画逐字显示序列
self.play(Write(dna_sequence), run_time=3)
# 创建序列与结构的对应关系
for i, char in enumerate("ATCGGCTATAGCCGAT"):
if char in "AT":
color = PURPLE if i%2 ==0 else YELLOW
else:
color = GREEN if i%2 ==0 else ORANGE
# 创建高亮效果
highlight = Circle(
radius=0.3,
color=color,
fill_opacity=0.5
).move_to(dna_sequence[i*2].get_center())
self.play(
Flash(highlight, color=color),
Indicate(base_pairs[i]), # 高亮对应的碱基对
run_time=0.5
)
高级技巧与性能优化
对于复杂的DNA动画,我们需要注意性能优化。以下是一些实用技巧:
-
调整分辨率:Surface类的resolution参数控制细节质量,降低它可以提高渲染速度:
Surface( # ...其他参数... resolution=(8, 16), # 降低u和v方向的采样点 ) -
使用缓存:Manim的缓存系统可以避免重复渲染相同的动画:
manim -p --use_cache dna_animation.py DNAAnimation -
分层渲染:复杂场景可以分解为多层,单独渲染后合成:
# 分别渲染不同部分 self.renderer.begin_ambient_camera_rotation(rate=0.1) self.play(Create(helix), run_time=2) self.wait(5) # 让摄像机旋转展示结构
总结与扩展应用
本文介绍的技术不仅适用于DNA动画,还可扩展到其他螺旋结构的可视化,如蛋白质分子、星系模型等。Manim的三维建模能力和动画系统为科学可视化提供了强大支持。
更多高级技巧可以参考官方文档:
- 三维场景指南:docs/guides/deep_dive.rst
- 动画效果参考:docs/reference_index/animations.rst
掌握这些技术后,你可以创建更加复杂的生物分子动画,甚至可以模拟DNA复制、转录等生物学过程。动手尝试吧,让科学可视化变得更加生动有趣!
点赞收藏本文,关注更多Manim科学可视化技巧,下期我们将介绍如何添加分子运动和交互效果!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00