计算机图形学(Computer Graphics) 实战教程
上机环境: 华为云 FlexusX ecs-88e7-0001 | Ubuntu 24.04 | 8vCPU/16GiB
核心工具: Python 3.12.3 | Blender 4.0.2 | Pillow 11.3 | OpenCV 4.13
实验总数: 86个 | 系列第9篇
目录
- 第一部分:字符字型的演化(实验1-11)
- 第二部分:Blender静帧(实验12-32)
- 第三部分:Blender建模细节(实验33-57)
- 第四部分:2D动画+动画原理+粒子+骨骼+材质(实验58-86)
- 总结与对比表
一、字符字型的演化
实验1:字符字型的演化 (Evolution of Character Glyphs)
人类文字演化的核心驱动力 — 载体 × 工具:
| 年代 | 阶段 | 特征 |
|---|---|---|
| ~3200 BCE | 楔形文字(Cuneiform) | 苏美尔人用芦苇在泥板上压印 |
| ~3000 BCE | 埃及象形文字(Hieroglyph) | 刻在石碑/纸莎草上的图形文字 |
| ~1200 BCE | 甲骨文(Oracle Bone) | 商朝龟甲兽骨上的刻痕 |
| ~800 BCE | 腓尼基字母(Phoenician) | 22个辅音字母,现代字母表的祖先 |
| ~500 BCE | 希腊字母(Greek Alphabet) | 加入元音,奠定西方文字基础 |
| ~100 CE | 罗马大写体(Roman Capitals) | 图拉真柱铭文,比例系统 |
| ~800 CE | 加洛林小写体(Carolingian) | 查理曼大帝推广的标准化书写体 |
| ~1450 CE | 谷腾堡活字(Gutenberg) | 哥特体(Textura),42行圣经 |
| ~1500 CE | 意大利斜体(Italic) | Aldus Manutius为袖珍书设计 |
| ~1750 CE | 过渡体(Transitional) | Baskerville,笔画粗细对比加强 |
| ~1800 CE | 现代体(Didone/Modern) | Bodoni/Didot,极致粗细对比 |
| ~1900 CE | 无衬线体(Sans-serif) | Futura/Gill Sans,包豪斯功能主义 |
| ~1980 CE | 数字字体(Digital) | PostScript→TrueType→OpenType |
| ~2010 CE | 可变字体(Variable) | OpenType 1.8,单文件多轴变化 |
载体演变: 泥板 → 纸莎草 → 羊皮纸 → 纸 → 屏幕
工具演变: 芦苇笔 → 羽毛笔 → 金属活字 → 照相排版 → 数字代码
实验2:指示灯 — LED/辉光管/霓虹灯
┌─── 电子显示技术演变 ───┐
│ 1950s 辉光管(Nixie Tube) — 170V冷阴极,温暖光芒 │
│ 1910 霓虹灯(Neon Lamp) — 玻璃管充氖气,高压交流 │
│ 1967 VFD(真空荧光) — 低压25V,日系音响广泛使用 │
│ 1962 LED(发光二极管) — Holonyak红光,中村修二蓝光 │
│ 1987 OLED(有机发光) — 邓青云发明,自发光超薄柔性 │
└───────────────────────┘
生成对比图 exp02_indicators.png (600×200)。
实验3:七段数码管 — 7-Segment & 4511驱动
7段命名:a(顶) b(右上) c(右下) d(底) e(左下) f(左上) g(中)
段位映射:
'0': abcdef '1': bc '2': abdeg '3': abcdg '4': bcfg
'5': acdfg '6': acdefg '7': abc '8': abcdefg '9': abcdfg
'A': abcefg 'b': cdefg 'C': adef 'd': bcdeg 'E': adefg
'F': aefg
4511 BCD→7段译码器:A0/A1/A2/A3 → LT(全亮测试)/BI(消隐)/RBI → a~g
生成0-9数码管图 exp03_7seg.png (800×140)。
实验4:七段数码管显示字母 & BP寻呼机
7段可识别字母(部分):
| A=abcefg | B=cdefg | C=adef | D=bcdeg | E=adefg | F=aefg |
| H=bcefg | I=bc | J=bcde | L=def | O=abcdef | P=abefg | S=acdfg | U=bcdef |
BP寻呼机演变:1921年警用单向无线电 → 1950s Bellboy → 1980s数字机 → 1990s汉字机
生成BP寻呼机显示效果 exp04_bp_pager.png (700×200)。
实验5:14段数码管/米字管
14段 = 上下横 + 左右3竖 + 中间2横,可显示完整字母表。多见于微波炉/音响面板。
典型驱动:MAX6954(4位×14段, I2C), HT16K33(16×8矩阵)。
实验6:谷腾堡活字 & 哥特字体
谷腾堡活字技术三要素:
| 技术 | 说明 |
|---|---|
| 可调式铸字模(hand mould) | 快速批量铸造相同字模 |
| 油性油墨(oil-based ink) | 替代水性墨,金属活字附着 |
| 螺旋压印机(screw press) | 取自葡萄酒压榨机,均匀施压 |
年代线:
~1440 谷腾堡改良活字印刷
~1455 42行圣经,1282页
~1465 Sweynheym&Pannartz在意大利印刷
~1470 Nicolas Jenson奠定Venetian风格
~1495 Aldus Manutius发明Italic斜体
~1500 欧洲已印刷2000万册书籍(Incunabula摇篮本时代结束)
实验7:TTY/电传打字机/点阵字库
- Teletype Model 33 (1963):ASCII编码,110bps
- 菊轮打印机(Daisy Wheel):可更换花瓣轮,字模击打
- 点阵打印机(Dot Matrix):9针/24针,Epson MX-80(1980)
编码演化:Baudot码(5bit, 1870) → ASCII(7bit, 1963) → EBCDIC(8bit, 1964)
生成TTY风格输出 exp07_tty.png (500×150)。
实验8:屏幕点阵字体 3×5 / 5×7 / 雅达利字库
5×7点阵显示 “HELLO”:
# # ##### # # ###
# # # # # # #
##### #### # # # #
# # # # # # #
# # # # # # #
# # # # # # #
# # ##### ##### ##### ###
- 雅达利2600(1977):内置8×8 ROM字体,128字符
- Commodore 64(1982):8×8 PETSCII
- IBM PC(1981):BIOS内含8×16字符ROM
实验9:ASCII演化
ASCII码表 (0x20-0x7E,95个可打印字符):
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
20 ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~
编码演化时间线:Morse(1837) → Baudot(1870) → FIELDATA(1960) → ASCII(1963) → EBCDIC(1964) → ASCII修订(1967) → Unicode 1.0(1991) → Unicode 15.1(2023, 149,813字符)。
实验10:Code Page 437 & IBM 5150
- IBM 5150 (1981):8088 4.77MHz, 16KB-256KB RAM, CGA 320×200×4色
- Code Page 437:框线字符(╔═╗║╚╝)、数学符号(√∞±)、扑克花色(♠♥♦♣)
- CGA 16色:8基色 + 8亮色变体
生成CP437框线字符展示 exp10_cp437.png (600×200)。
实验11:汉字打印机 & 汉字字形码
汉字16×16点阵字模 (GB2312) — "中"字:
················ 0000
·······██······· 0180
·······██······· 0180
·······██······· 0180
····████████···· 0FF0
····██··██·██··· 0CD8
····██··██·██··· 0CD8
····████████···· 0FF0
····██··██·██··· 0CD8
····██··██·██··· 0CD8
····██··██·██··· 0CD8
····████████···· 0FF0
·······██······· 0180
·······██······· 0180
·······██······· 0180
················ 0000
编码标准演变:GB2312(1980, 7445字符) → GBK(1995, 21886字符) → GB18030-2022(87887汉字)。
二、Blender静帧
Blender版本:4.0.2 | Python API:bpy 模块
实验12:Blender安装和Workflow
Blender工作流6步法:
1. Modeling(建模) — 创建几何体, 编辑点线面
2. Shading(着色) — 材质/纹理/节点编辑器
3. Lighting(光照) — 点光/日光/面积光/HDRI
4. Animation(动画) — 关键帧/曲线编辑/骨骼
5. Rendering(渲染) — Eevee(实时)/Cycles(物理)/Workbench
6. Compositing(合成) — 节点式后期处理
实验13:Workspace工作区
| 工作区 | 用途 |
|---|---|
| Layout | 默认布局,3D视图+大纲+属性 |
| Modeling | 建模专用,编辑模式工具 |
| Sculpting | 雕刻专用,动态拓扑+多级精度 |
| UV Editing | UV展开+图像编辑 |
| Texture Paint | 直接在模型上绘制纹理 |
| Shading | 着色器节点编辑器 |
| Animation | 动画曲线/摄影表/Dope Sheet |
| Rendering | 渲染预览+合成节点 |
| Compositing | 后期合成节点 |
| Scripting | Python脚本+交互式控制台 |
实验14:参数运行模式 — 游乐场
for i in range(5):
bpy.ops.mesh.primitive_cube_add(
size=1.0, location=(i * 2.2, 0, 0))
参数化建模理念:代码即模型 — 改参数 = 重新生成。
实验15:脚本工作区 — 选择/删除
bpy.ops.mesh.primitive_cube_add(location=(0, 0, 0))
bpy.ops.mesh.primitive_uv_sphere_add(location=(2, 0, 0))
bpy.ops.mesh.primitive_cylinder_add(location=(4, 0, 0))
# 选择Sphere并删除
sphere.select_set(True)
bpy.ops.object.delete()
对象创建后3个 → 删除Sphere后2个。
实验16:猴头Monkey — Suzanne
bpy.ops.mesh.primitive_monkey_add(size=2.0, location=(0, 0, 0))
| 属性 | 值 |
|---|---|
| 顶点数(vertices) | 507 |
| 面数(faces) | 500 |
| 边数(edges) | 1005 |
Suzanne是Blender的吉祥物,2002年起出现在每个版本。保存 exp16_suzanne.blend。
实验17:文本块 — 保存/读取/执行 .py
text_block = bpy.data.texts.new("my_blender_script")
text_block.write('import bpy\nprint("Hello from Blender!")')
Blender内置文本编辑器可直接保存和执行Python脚本。
实验18:阶梯阵列 — Location XYZ
10个立方体,location = (i*1.1, 0, i*0.5) 形成阶梯:
Cube.000: (0.0, 0.0, 0.0)
Cube.001: (1.1, 0.0, 0.5)
...
Cube.009: (9.9, 0.0, 4.5)
实验19:三轴旋转 & 加号制作
# 横条绕Y轴旋转90°
bar_h.rotation_euler = (0, math.radians(90), 0)
加号 = 竖圆柱 + 横圆柱(rotation Y=90°)。
弧度转角度:90° = 1.5708 rad | π rad = 180.0°。
旋转模式:XYZ Euler(万向节死锁可用四元数避免)。
实验20:父子关系 Parent-Child
child.parent = parent # 子跟随父运动
# 移动父对象 → 所有子对象跟随
parent.location.x = 2.0
层级结构:Sun(父) → Planet_0~3(子),移动Sun即带动所有行星。
实验21:C919大飞机(简化建模)
部件清单:
Fuselage — 机身(圆柱体, radius=0.5, depth=6)
Nose — 机头(球体, 缩放(1,0.5,1))
LeftWing — 左翼(立方体缩放0.15×1.8×3.5)
RightWing — 右翼(对称)
TailVertical — 垂直尾翼
TailHorizontal— 水平尾翼
Engine_Left — 左发动机
Engine_Right — 右发动机
C919:COMAC制造,2017首飞,158座,航程5555km。
实验22:三向旋转 — Heading/Pitch/Bank
Heading/Yaw (Z轴) — 航向偏航,左右转
Pitch (X轴) — 俯仰,抬头/低头
Bank/Roll (Y轴) — 横滚,侧倾
实验23:角度与弧度转化
| 角度 | 弧度 | π倍数 |
|---|---|---|
| 0° | 0.000000 | π×0.00 |
| 30° | 0.523599 | π×0.17 |
| 45° | 0.785398 | π×0.25 |
| 60° | 1.047197 | π×0.33 |
| 90° | 1.570796 | π×0.50 |
| 180° | 3.141593 | π×1.00 |
| 360° | 6.283185 | π×2.00 |
math.radians(deg) # 角度→弧度
math.degrees(rad) # 弧度→角度
实验24:飞机编队阵列
四种经典阵型:
| 阵型 | 排列方式 | 战术意义 |
|---|---|---|
| 一字长蛇阵(Line) | 直线排开 | 并行搜索 |
| 人字阵(V-Shape) | 尖兵前出,两侧梯次掩护 | 防御拦截 |
| 方阵(Square) | 矩形编队 | 密集防守 |
| 楔形阵(Wedge) | 锥形攻击编队 | 中央突破 |
实验25:材质与颜色 — diffuse_color
mat = bpy.data.materials.new("Red")
mat.diffuse_color = (1, 0, 0, 1) # RGBA
obj.data.materials.append(mat)
创建6个材质球:红/绿/蓝/黄/青/品红。
实验26:清空场景 — 批量清理
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
bpy.ops.outliner.orphans_purge(do_recursive=True)
清空后 objects=0, meshes=0, materials=0。
实验27:晴天娃娃 (Teru Teru Bozu)
| 部件 | 形状 | 材质 |
|---|---|---|
| Head | UV Sphere(radius=0.6) | 白色 |
| Body | Cone(radius1=0.8, inverted) | 白色 |
| Ribbon | Torus | 红色 |
| Eyes | UV Sphere(radius=0.08) ×2 | 黑色 |
日本传统习俗:祈求晴天。
实验28:摄影机控制
| 视角 | 坐标 | 旋转 |
|---|---|---|
| Front | (0, -8, 0) | (90°, 0, 0) |
| Top | (0, 0, 8) | (0, 0, 0) |
| Side(Right) | (8, 0, 0) | (90°, 0, 90°) |
| 45° Perspective | (5, -5, 3) | (75°, 0, 45°) |
| Isometric(等轴测) | (5, -5, 5) | (55°, 0, 45°) |
焦距:50mm(默认),传感器尺寸:36mm。
实验29:渲染 — Eevee vs Cycles
bpy.context.scene.render.engine = 'BLENDER_EEVEE' # 实时渲染
bpy.context.scene.render.engine = 'CYCLES' # 物理渲染
| 引擎 | 特点 | 适用场景 |
|---|---|---|
| Eevee | 实时/快速/近似GI | 预览/动画/游戏 |
| Cycles | 物理准确/路径追踪/慢 | 最终产品/建筑可视化 |
| Workbench | 极简/无材质 | 建模阶段预览 |
实验30:聚光灯 Spot Light
| 参数 | Wide | Narrow | Bright | Dim |
|---|---|---|---|---|
| angle | 60° | 15° | 30° | 30° |
| energy | 200W | 200W | 1000W | 50W |
实验31:基础几何体总览
bpy.ops.mesh.primitive_cube_add(size) → 立方体
bpy.ops.mesh.primitive_uv_sphere_add(radius) → UV球体
bpy.ops.mesh.primitive_ico_sphere_add(radius) → 20面体球
bpy.ops.mesh.primitive_cylinder_add(radius, depth) → 圆柱
bpy.ops.mesh.primitive_cone_add(r1, r2, depth) → 锥体
bpy.ops.mesh.primitive_torus_add(major_r, minor_r) → 环体
bpy.ops.mesh.primitive_monkey_add(size) → 猴头
实验32:场景/建筑/器物/载具(过渡)
场景建模三大类:
建筑(Architecture) — 房屋/桥梁/寺庙
器物(Vessels/Object) — 花瓶/工具/家具
载具(Vehicles) — 车/船/飞机
三、Blender建模细节
实验33:场景/建筑/器物/载具
建筑: 房屋/桥梁/城堡/寺庙/教堂/摩天楼
器物: 花瓶/碗/杯/工具/家具/武器
载具: 汽车/飞机/轮船/坦克/机甲
自然: 树木/石头/地形/水流/火焰
实验34:米开朗基罗 & 营造法式
- 米开朗基罗:“我看到了天使在大理石中” → Subtractive雕刻建模哲学
- 营造法式(1103, 李诫):中国第一部建筑规范
- 四梁八柱:传统木构承重核心
- 歇山式屋顶:九脊顶,等级仅次于庑殿顶
- 斗栱(Dougong):榫卯承重+装饰,不用钉子
实验35:解析几何 & 笛卡尔
笛卡尔(1596-1650) 1637年《几何学》建立坐标系。“我思故我在”。
# 3D点云: 参数方程
for t in range(20):
x = t
y = 2 * math.sin(0.8 * t)
z = math.cos(0.8 * t)
解析几何 = 用代数描述几何 — 所有CG的数学基础。
实验36:三视图 (Orthographic Views)
| 视图 | 方向 | 显示维度 |
|---|---|---|
| 前视图(Front) | -Y | 宽度 × 高度 |
| 顶视图(Top) | -Z | 宽度 × 深度 |
| 右视图(Right) | +X | 深度 × 高度 |
Blender快捷键:Numpad 1=前 / 3=右 / 7=顶 / 5=正交透视切换
实验37:画法几何 & 蒙日投影
蒙日(Gaspard Monge, 1746-1818),1795年《画法几何学》。拿破仑远征的科学顾问。
蒙日投影 → 现代CG管线:
Object → World → View → Clip → NDC → Screen
实验38:修改模型 — 点线面/变形器/雕刻
立方体:V=8, E=12, F=6 → V - E + F = 2(欧拉公式验证)
建模方法三类:
1. 编辑模式: 直接操作顶点/边/面
2. 变形器(Modifier): 非破坏性,可堆叠
3. 雕刻(Sculpting): 笔刷式,适合有机体
实验39:Simple Deform — Twist 扭曲
mod = cube.modifiers.new(name="Twist", type='SIMPLE_DEFORM')
mod.deform_method = 'TWIST'
mod.angle = math.radians(180) # 180°扭曲
mod.deform_axis = 'Z'
效果:绕Z轴线性旋转顶点,角度沿轴递增。
实验40:Taper 锥化
mod.deform_method = 'TAPER'
mod.factor = -0.5 # 负值=底部粗顶部细
螺钉造型 = Taper(锥度) + Twist(螺纹)。
实验41:惠氏螺纹 & 螺纹标准演化
| 年代 | 标准 | 特征 |
|---|---|---|
| 1841 | Whitworth(惠氏) | BS 84, 55°牙型角, 英制 |
| 1864 | Sellers(美制) | 60°牙型角 |
| 1947 | ISO公制螺纹 | 60°牙型角, 全球通用 |
| 当代 | MJ(航空)/UNJ/NPT | 管螺纹锥度 |
实验42:切割工具 Cut
| 工具 | 快捷键 | 说明 |
|---|---|---|
| Knife | K | 自由划线切割 |
| Loop Cut | Ctrl+R | 平行环切 |
| Bisect | — | 平面切割,一分为二 |
| Subdivide | — | 均匀细分 |
实验43:Bend 弯曲变形器
mod.deform_method = 'BEND'
mod.angle = math.radians(120) # 120°弯曲
mod.deform_axis = 'Z'
用途:管道弯曲/弹簧/钢管造型。
实验44:工程制图 → CAD → BIM
1963: Sketchpad(Ivan Sutherland) — 第一个CAD
1982: AutoCAD 1.0 — DWG格式
1987: Pro/ENGINEER — 参数化建模
1995: SolidWorks — 中端3D CAD普及
2002: Revit — BIM(Building Information Modeling)
BIM = 3D模型 + 工程数据 + 全生命周期管理。
实验45:角色/人物/动物建模
角色建模方法:
Box Modeling — 立方体逐步细化,适合硬表面
Sculpting — 数字黏土,有机体最佳
Retopology — 高模→重拓扑低模,游戏管线必备
Parametric — MakeHuman/Daz3D参数化
实验46:CG动画兴起 — Pixar
| 年代 | 里程碑 |
|---|---|
| 1972 | Catmull+Parke计算机动画手 |
| 1986 | Luxo Jr.(Pixar成立, 台灯) |
| 1995 | Toy Story — 第一部全CG长片 |
| 2001 | Shrek — 奥斯卡最佳动画长片 |
| 2023 | Spider-Verse风格化渲染 |
核心人物:Ed Catmull(曲面细分) + John Lasseter(故事) + Steve Jobs(投资人)。
实验47:Bevel 倒角
mod = cube.modifiers.new(name="Bevel", type='BEVEL')
mod.width = 0.2 # 倒角宽度
mod.segments = 3 # 段数(平滑度)
mod.limit_method = 'ANGLE' # 角度阈值限制
3ds Max: Fillet | Maya: Bevel | Blender: Bevel
实验48:Extrude 挤出 & Knife 刀子
- E键 = Extrude Region(挤出选区)
- Alt+E = Extrude Along Normals(沿法线挤出)
- K键 = Knife(刀子切割)
- Knife Project:用另一个物体投影切割
实验49:点线面建模方法
20面体(Icosphere, subdivisions=1):
V=42, E=120, F=80 → V - E + F = 2 ✓
G键移动 / S键缩放 / R键旋转
Ctrl+B 倒角边 / X 删除
E 挤出面 / I 内插面 / F 填充
1=顶点 / 2=边 / 3=面 选择模式
实验50:修改器 — Bevel详解
| 参数 | 效果 |
|---|---|
| Width=0.1/Seg=2 | 硬边小倒角 |
| Width=0.3/Seg=4 | 圆角中等倒角 |
| Width=0.5/Seg=6 | 大圆角平滑 |
限制方法:ANGLE(角度阈值) | WEIGHT(边权重)
剖面类型:SUPER_ELLIPSE(超椭圆) | CUSTOM(自定义曲线)
实验51:曲线 Spline
三种曲线类型:
| 类型 | 特点 |
|---|---|
| Bezier | 控制点+手柄,最常用 |
| NURBS | 权重控制,工业精度 |
| Poly | 折线段,简单直接 |
曲线→网格:Alt+C
倒角深度 → 管道/面条/电线
锥化对象 → 一头粗一头细
挤出 → 带状面
实验52:融球建模 (Metaball)
等势面(Iso-surface)原理:距离近的融球自动合并。
| Metatype | 说明 |
|---|---|
| Ball | 球体核心 |
| Capsule | 胶囊形 |
| Plane | 平面影响 |
| Ellipsoid | 椭球 |
| Cube | 方形影响 |
适用:有机体/流体/云/熔岩/卡通角色。
实验53:Extrude — 苹果落地
苹果 = Sphere + Cylinder(茎) + Plane(叶)。纪念牛顿1666年万有引力灵感。
实验54:灯光详情
| 灯光类型 | 能量 | 特征 |
|---|---|---|
| POINT | 500W | 点光源,全方向衰减 |
| SUN | 3 | 平行光,无衰减(位置无关) |
| SPOT | 300W | 锥形照射,spot_size/blend |
| AREA | 200W | 面光源,软阴影 |
实验55:Loop Cut 环切
Ctrl+R → 平行于现有边的环形切割。与Subdivide区别:LoopCut沿特定方向,Subdivide全局细分。
实验56:代码构建三角面
mesh.from_pydata(verts, edges, faces)
手动构建房屋三角网:9个顶点,14个三角面。
所有3D渲染最终都是三角面!GPU只认三角形。
实验57:建模细节总结
Blender变形器类型(部分):ARMATURE/ARRAY/BEVEL/BOOLEAN/BUILD/CAST/CURVE/DECIMATE/DISPLACE/EDGE_SPLIT/HOOK/LAPLACIANDEFORM/LATTICE/MASK/MESH_CACHE/MESH_SEQUENCE_CACHE/MIRROR/MULTIRES/NODES/OCEAN/PARTICLE_INSTANCE…
共50+种变形器可组合使用。
四、动画与高级特性
实验58:2D动画 (Grease Pencil)
2017年Blender 2.79引入Grease Pencil 2.0:可在3D空间画2D线条。
三种模式:Object / Edit / Draw / Sculpt。
类比:Photoshop时间轴 + After Effects矢量动画 + 3D空间定位。
实验59:Python代码生成2D & 分辨率
| 分辨率 | 像素 | 说明 |
|---|---|---|
| SD | 640×480 | 标准 |
| HD | 1280×720 | 高清 |
| Full HD | 1920×1080 | 全高清 |
| 2K | 2048×1080 | 电影2K |
| 4K(UHD) | 3840×2160 | 超高清 |
| Square | 1080×1080 | 社交媒体 |
帧率:24fps(电影标准)。
实验60:Emoji笑脸 😊 (3D版)
| 部件 | 形状 | 材质颜色 |
|---|---|---|
| Face | Cylinder(扁平) | Yellow (1,0.85,0.1) |
| Eyes ×2 | UV Sphere(small) | Black (0.02,0.02,0.02) |
| Mouth | Torus(half) | Dark brown |
实验61:CSV → 3D柱形图
# 数据结构
Jan: Sales=120, Costs=80
Feb: Sales=145, Costs=85
Mar: Sales=160, Costs=90
Apr: Sales=155, Costs=95
May: Sales=190, Costs=100
Jun: Sales=210, Costs=110
12根柱子(蓝=Sales, 红=Costs),数据可视化。
实验62:场景恢复与重建
Blender场景管理:
.blend1 = 前一版本的备份
Ctrl+Z = Undo(默认32步)
Append = 从其他.blend导入对象
Asset Browser = Blender 3.0+资产管理
Python脚本 = 场景的精确描述,任意时间可重建
实验63:文字效果
bpy.ops.object.text_add(location=(0, 0, 0))
text_obj.data.body = "Computer Graphics"
text_obj.data.extrude = 0.15 # 3D挤出
text_obj.data.bevel_depth = 0.02 # 倒角深度
实验64:关键帧动画
scene.frame_set(1)
cube.location = (-5, 0, 0)
cube.keyframe_insert(data_path="location", frame=1)
scene.frame_set(24)
cube.location = (0, 0, 2)
cube.keyframe_insert(data_path="location", frame=24)
scene.frame_set(48)
cube.location = (5, 0, 0)
cube.keyframe_insert(data_path="location", frame=48)
3个关键帧:(-5,0,0) → (0,0,2) → (5,0,0),48帧动画。
实验65:打组与运动 — 小鸡啄米
层级结构:Body → Head → Beak。
动画:5个关键帧,头部旋转模拟啄米动作(0°→20°→0°→20°→0°)。
实验66:运动类型汇总
| 运动类型 | data_path | 说明 |
|---|---|---|
| 平移(Translation) | location | 直线运动 |
| 旋转(Rotation) | rotation_euler | 绕轴旋转 |
| 缩放(Scale) | scale | 大小变化 |
| 摆线(Cycloid) | sin/cos | 车轮轨迹 |
| 螺旋(Helix) | 旋转+平移 | 弹簧/DNA |
| 摆动(Oscillation) | sin | 钟摆 |
| 自由落体(Free Fall) | ½gt² | 抛物线 |
实验67:灯光运动 & 颜色变化
3个关键帧 × RGB颜色渐变:红(帧1) → 绿(帧24) → 蓝(帧48)。
实验68:摄影机环绕运动
轨迹:半径8的圆圈,高度3。72帧(3秒@24fps)完成360°环绕。
摄影机运动类型:Dolly(推拉) / Truck(平移) / Pedestal(升降) / Pan(摇摄)。
实验69:综合运动 — 武打片
双猴对打场景:
- Fighter_A:前进出拳→后退→前进反击→后退
- Fighter_B:后闪→跳起躲避→落地→归位
实验70:帧信息输出
| 属性 | 值 |
|---|---|
| frame_current | 42 |
| frame_start | 1 |
| frame_end | 100 |
| fps | 24 |
| 当前时间 | 1.75s |
| 插值方式 | BEZIER (默认) |
实验71:插值方式 (Interpolation/Easing)
| 类型 | 效果 |
|---|---|
| CONSTANT | 阶梯式,无过渡 |
| LINEAR | 匀速直线 |
| BEZIER | 缓入缓出,最自然(默认) |
| SINE | 正弦缓动,极柔和 |
| QUAD/CUBIC/QUART | 二次/三次/四次加速 |
| ELASTIC | 弹簧效果,越过终点回弹 |
| BACK | 先反向再前进 |
| BOUNCE | 弹跳,落地反弹 |
线性插值:B(t) = (1-t)P₀ + tP₁
实验72:Mesh波浪效果
mod = plane.modifiers.new(name="Wave", type='WAVE')
mod.height = 0.3 # 波高
mod.speed = 0.5 # 波速
mod.width = 1.5 # 波宽
实验73:正弦波动画
40个球体,y = 2sin(0.4x + φ),φ随帧变化,每帧全部球体重算位置。
实验74:抛物线投篮
公式:x = v₀ₓ·t, y = v₀ᵧ·t − ½g·t²
v₀ₓ=0.1667, v₀ᵧ=0.15, g=0.006 → 最高点 t≈25帧, y_max≈1.88。
实验75:点运动 — Lissajous曲线
x = 4sin(1.3t), y = 3cos(0.7t), z = sin(t)+1。120帧持续5秒。
实验76:刚体动力学 Rigid Body
| 属性 | 值 |
|---|---|
| 类型 | Active(受物理影响) |
| 质量 | 1.0 kg |
| 弹性(restitution) | 0.7 |
| 重力 | -9.8 m/s² (Z轴) |
碰撞时:v_new = −restitution × v_old。
实验77:三人场景调度
Character_A(right走位) + B(forward走位) + C(left走位) → 三人集结于中心。
实验78:林间小路 & 小汽车
汽车 = 盒体+4轮子,8棵树(圆柱干+球冠),匀速运动72帧。
实验79:静止场景 — 牛吃草
草地(Icosphere变形牛) + 20个Cone草簇,自然场景静态渲染。
实验80:下雪动画 (Particle System)
settings.type = 'EMITTER'
settings.count = 200 # 粒子数
settings.lifetime = 80 # 生命周期(帧)
settings.frame_start = 1
settings.frame_end = 100
settings.render_type = 'OBJECT'
settings.instance_object = snowflake # 雪花对象
粒子总数(全寿命) ≈ 200×(100+80)/100 ≈ 360个。
实验81:声音可视化
32个频谱柱,模拟频率带(bass→treble),每帧用正弦波模拟音频振幅驱动高度。
实际应用:librosa读取音频 → FFT分频段 → bar.scale.z → 实时动画。
实验82:骨骼基础 (Armature)
骨骼层级:
UpperArm(head=0,0,0 → tail=0,0,2) [根骨]
└── Forearm(head=0,0,2 → tail=0,0,3.5) [connected]
└── Hand(head=0,0,3.5 → tail=0,0.2,4) [connected]
IK(Inverse Kinematics):末端→根
FK(Forward Kinematics):根→末端
Connected:子骨尾=父骨头,连续链。
实验83:自动权重绑定 (Rigging)
bpy.ops.object.parent_set(type='ARMATURE_AUTO')
网格:ArmMesh(圆柱细分) + 骨骼:ArmArmature(2根)。绑定后自动生成顶点组(Vertex Groups)。
实验84:人形骨骼层级
Root/Hips → [Spine, LeftUpLeg, RightUpLeg]
Spine → [Spine1, Spine2, Neck, L/R Shoulder]
Neck → [Head]
LeftUpLeg → LeftLeg → LeftFoot
LeftShoulder → LeftArm → LeftForeArm → LeftHand
工具:Mixamo(自动绑定) / Rigify(Blender内置Meta-Rig)。
实验85:权重绘制 (Weight Painting)
权重绘制要点:
1. 关节处平滑过渡 — 不能硬切
2. 最大影响数(Max Influences) — 游戏4, 离线8
3. 权重归一化(Normalize) — 和=1
4. 权重镜像(Mirror) — X轴对称
5. 笔刷: Draw/Blur/Gradient/Smear
实验86:玻璃/半透明材质
bsdf.inputs['Transmission Weight'].default_value = 0.8
bsdf.inputs['IOR'].default_value = 1.45
bsdf.inputs['Roughness'].default_value = 0.05
mat.blend_method = 'BLEND'
| 材质 | IOR(折射率) |
|---|---|
| 水 | 1.33 |
| 玻璃 | 1.45 |
| 钻石 | 2.42 |
总结与对比表
四大模块概览
| 模块 | 实验数 | 核心技能 |
|---|---|---|
| 字符字型演化 | 11 | 显示技术史/点阵/ASCII/Unicode |
| Blender静帧 | 21 | 基础建模/材质/灯光/摄影机/渲染 |
| Blender建模细节 | 25 | 变形器/曲线/融球/三角面/灯光 |
| 动画+粒子+骨骼+材质 | 29 | 关键帧/物理/粒子/骨骼绑定/材质节点 |
关键概念速查
| 概念 | 英文 | 核心公式/API |
|---|---|---|
| 欧拉公式 | Euler’s Formula | V − E + F = 2 |
| 贝塞尔插值 | Bezier Interpolation | B(t) = (1−t)³P₀ + 3(1−t)²tP₁ + 3(1−t)t²P₂ + t³P₃ |
| 抛物线运动 | Parabolic Motion | y = v₀ᵧt − ½gt² |
| 父子关系 | Parent-Child | child.parent = parent |
| 骨骼绑定 | Rigging | parent_set(type=‘ARMATURE_AUTO’) |
| 关键帧 | Keyframe | keyframe_insert(data_path, frame) |
| 变形器 | Modifier | obj.modifiers.new(name, type) |
渲染对比
| 特性 | Eevee | Cycles |
|---|---|---|
| 类型 | 实时/光栅化 | 物理/路径追踪 |
| 速度 | 快(秒级) | 慢(分钟级) |
| GI | 近似(SSAO/Irradiance Volume) | 精确(路径追踪) |
| 反射 | Cubemap/SSR | 真实光线追踪 |
| 适用 | 动画/游戏/预览 | 建筑/产品/电影最终输出 |
ASCII架构:从像素到场景
┌─────────────────────────────────────────────────────┐
│ CG 管线总览 │
├──────────┬──────────┬──────────┬────────────────────┤
│ 字符字型 │ Blender │ 建模细节 │ 动画+高级特性 │
│ (11实验) │ 静帧(21) │ (25实验) │ (29实验) │
├──────────┼──────────┼──────────┼────────────────────┤
│ . → 七段 │ 工作流 │ 变形器 │ 关键帧动画 │
│ . → ASCII│ Monkey │ Bevel │ 粒子系统 │
│ . → CP437│ C919 │ Bend │ 骨骼绑定 │
│ . → 汉字 │ 材质颜色 │ Curve │ 刚体物理 │
│ . → Unicode│ 灯光 │ 三角面 │ 玻璃材质 │
└──────────┴──────────┴──────────┴────────────────────┘
│
┌───────┴────────┐
│ Render输出 │
│ PNG/动画/视频 │
└────────────────┘
上机环境: 华为云 FlexusX x2e.8u.16g | Ubuntu 24.04 | Python 3.12.3 | Blender 4.0.2
实验总数: 86个 | 全部在服务器真实执行
生成时间: 2026-07-01
系列: 第9篇 | 前8篇累计664实验/272KB
4931

被折叠的 条评论
为什么被折叠?



