计算机图形学(Computer Graphics) 实战教程

计算机图形学(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:字符字型的演化 (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 EditingUV展开+图像编辑
Texture Paint直接在模型上绘制纹理
Shading着色器节点编辑器
Animation动画曲线/摄影表/Dope Sheet
Rendering渲染预览+合成节点
Compositing后期合成节点
ScriptingPython脚本+交互式控制台

实验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.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)

部件形状材质
HeadUV Sphere(radius=0.6)白色
BodyCone(radius1=0.8, inverted)白色
RibbonTorus红色
EyesUV 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

参数WideNarrowBrightDim
angle60°15°30°30°
energy200W200W1000W50W

实验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:惠氏螺纹 & 螺纹标准演化

年代标准特征
1841Whitworth(惠氏)BS 84, 55°牙型角, 英制
1864Sellers(美制)60°牙型角
1947ISO公制螺纹60°牙型角, 全球通用
当代MJ(航空)/UNJ/NPT管螺纹锥度

实验42:切割工具 Cut

工具快捷键说明
KnifeK自由划线切割
Loop CutCtrl+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

年代里程碑
1972Catmull+Parke计算机动画手
1986Luxo Jr.(Pixar成立, 台灯)
1995Toy Story — 第一部全CG长片
2001Shrek — 奥斯卡最佳动画长片
2023Spider-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:灯光详情

灯光类型能量特征
POINT500W点光源,全方向衰减
SUN3平行光,无衰减(位置无关)
SPOT300W锥形照射,spot_size/blend
AREA200W面光源,软阴影

实验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 & 分辨率

分辨率像素说明
SD640×480标准
HD1280×720高清
Full HD1920×1080全高清
2K2048×1080电影2K
4K(UHD)3840×2160超高清
Square1080×1080社交媒体

帧率:24fps(电影标准)。

实验60:Emoji笑脸 😊 (3D版)

部件形状材质颜色
FaceCylinder(扁平)Yellow (1,0.85,0.1)
Eyes ×2UV Sphere(small)Black (0.02,0.02,0.02)
MouthTorus(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_current42
frame_start1
frame_end100
fps24
当前时间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 FormulaV − E + F = 2
贝塞尔插值Bezier InterpolationB(t) = (1−t)³P₀ + 3(1−t)²tP₁ + 3(1−t)t²P₂ + t³P₃
抛物线运动Parabolic Motiony = v₀ᵧt − ½gt²
父子关系Parent-Childchild.parent = parent
骨骼绑定Riggingparent_set(type=‘ARMATURE_AUTO’)
关键帧Keyframekeyframe_insert(data_path, frame)
变形器Modifierobj.modifiers.new(name, type)

渲染对比

特性EeveeCycles
类型实时/光栅化物理/路径追踪
速度快(秒级)慢(分钟级)
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值