想象你是一位航空爱好者,从小痴迷于飞机模型。某天,你决定用Blender软件亲手“造”一架C919国产大飞机。但面对复杂的3D建模,你很快发现:机身、机翼、尾翼这些部件如何精准组合?旋转机翼时,为什么整个机身也跟着扭曲?这些问题背后,隐藏着一个关键概念——层级关系。它就像飞机的骨架,支撑着所有部件的协同工作。本文将以C919飞机模型为例,带你从零开始理解Blender中的层级关系,并掌握3D建模的核心技巧。
一、层级关系:3D建模的“家庭树”
在Blender中,层级关系就像一棵家庭树:父物体是“家长”,子物体是“孩子”。当“家长”移动时,“孩子”会跟着动;但“孩子”的独立变换(如旋转、缩放)不会影响“家长”。这种单向控制机制,是构建复杂模型的基石。
1.1 父子关系的“魔法”
以两个立方体为例:
- 创建第一个立方体(父物体),缩放X轴为3倍。
- 创建第二个立方体(子物体),保持默认尺寸。
- 在物体模式下,先选中子物体,按住Shift再选中父物体,按
Ctrl+P建立父子关系。
此时旋转父立方体,子立方体会像机械臂末端一样同步运动。但若单独旋转子立方体,父立方体保持静止。这种“单向跟随”特性,正是层级关系的核心。
1.2 空对象:看不见的“指挥官”
当模型部件增多时,直接使用可见物体作为父级会导致视觉混乱。此时,空对象(Empty) 就派上了用场。它像提线木偶的操纵杆,本身不可见,却能控制所有关联物体。
案例:制作旋转展示台
- 创建空对象(
Shift+A→Empty→Arrows)。 - 将需要控制的物体(如产品模型、灯光)设为空对象的子级。
- 为空对象添加旋转动画:在时间轴第1帧设置旋转值为0,第24帧设置为360度,按
I插入关键帧。
播放动画时,所有子物体会围绕空对象中心旋转,形成专业的产品展示效果。这种技术同样适用于建筑群动画中的日照模拟、战场场景中的部队调度等复杂场景。
二、从基础几何体到C919:建模实战
理解了层级关系后,我们开始用Blender“造”一架C919飞机。整个过程分为三步:基础部件创建→层级结构搭建→细节优化。
2.1 基础部件:用圆柱体和立方体“搭积木”
C919的主要部件包括机身、机翼、尾翼和发动机。我们可以用Blender的基础几何体快速搭建这些部件:
机身
- 创建圆柱体(
Shift+A→Mesh→Cylinder),设置半径为1、深度为5。 - 旋转X轴90度(
R→X→90),使圆柱体水平放置。 - 缩放Z轴5倍(
S→Z→5),拉长机身。
机翼
- 创建立方体(
Shift+A→Mesh→Cube),设置尺寸为(5,1,0.25)。 - 移动到机身中部(
G→Y→-1),作为左侧机翼。 - 复制左侧机翼(
Shift+D),沿Y轴镜像移动到右侧(G→Y→2)。
尾翼
- 创建立方体,设置尺寸为(1,0.5,0.25)。
- 移动到机身尾部(
G→Y→-3),旋转X轴45度(R→X→45),形成上反角。
2.2 层级结构:用空对象“组装”飞机
部件创建完成后,需要通过层级关系将它们组合成一架完整的飞机。这里我们引入两个空对象:
C919_Body:作为机身的父级,控制整个飞机的移动和旋转。C919_Wings:作为机翼的父级,方便后续添加机翼动画(如折叠、振动)。
操作步骤
- 创建空对象
C919_Body,命名为“机身控制中心”。 - 选中机身、尾翼和发动机,按
Ctrl+P将它们设为C919_Body的子级。 - 创建空对象
C919_Wings,命名为“机翼控制中心”。 - 选中左右机翼,按
Ctrl+P将它们设为C919_Wings的子级。 - 将
C919_Wings设为C919_Body的子级,完成整机组装。
此时,旋转C919_Body,整个飞机会同步运动;而单独旋转C919_Wings,机翼会相对于机身独立旋转。这种层级设计,让模型的控制更加灵活高效。
2.3 细节优化:让飞机更逼真
基础模型搭建完成后,可以通过以下技巧提升真实感:
倒角处理
机翼和尾翼的边缘通常有圆角。选中边缘,按Ctrl+B设置倒角半径(如0.1),使模型更平滑。
表面细分
为机身添加表面细分修改器(Modifier→Subdivision Surface),将视图层级设置为2,使曲面更流畅。
材质贴图
为机身添加金属材质,调整基础色为银灰色,粗糙度为0.2,金属度为0.9;为机翼添加白色涂装,降低金属度至0.1。
三、Python脚本:自动化建模的“加速器”
手动调整每个部件的位置和层级关系虽然直观,但效率较低。Blender的Python API(bpy模块)允许我们用代码自动化建模流程。以下是一个完整的C919建模脚本示例:
import bpy
import math
from math import pi
# 清空场景
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
# 创建机身(圆柱体)
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=5)
body = bpy.context.object
body.name = "Body"
body.rotation_euler[0] = pi/2 # 旋转90度
body.scale[2] = 5 # 缩放Z轴
# 创建机翼(立方体)
bpy.ops.mesh.primitive_cube_add(size=2)
wing_left = bpy.context.object
wing_left.name = "Wing_Left"
wing_left.scale = (5, 1, 0.25)
wing_left.location = (0, -1, 0)
# 复制右侧机翼
wing_right = wing_left.copy()
wing_right.location = (0, 1, 0)
bpy.context.collection.objects.link(wing_right)
# 创建尾翼(立方体)
bpy.ops.mesh.primitive_cube_add(size=2)
tail = bpy.context.object
tail.name = "Tail"
tail.scale = (1, 0.5, 0.25)
tail.location = (0, -3, 1)
tail.rotation_euler[0] = pi/4 # 上反角45度
# 创建空对象:机身控制中心
empty_body = bpy.data.objects.new("C919_Body", None)
bpy.context.collection.objects.link(empty_body)
empty_body.location = (0, 0, 0)
# 设置父子关系
body.parent = empty_body
wing_left.parent = empty_body
wing_right.parent = empty_body
tail.parent = empty_body
# 创建空对象:机翼控制中心(可选)
empty_wings = bpy.data.objects.new("C919_Wings", None)
bpy.context.collection.objects.link(empty_wings)
empty_wings.location = (0, 0, 0)
wing_left.parent = empty_wings
wing_right.parent = empty_wings
empty_wings.parent = empty_body
运行这段代码后,Blender会自动生成一架基础结构的C919飞机,所有部件的层级关系也已设置完成。通过修改脚本中的参数(如尺寸、位置、旋转角度),可以快速调整模型细节。
四、常见问题与解决方案
在建模过程中,你可能会遇到以下问题:
4.1 子物体意外偏移
原因:局部坐标系与世界坐标系混淆。
解决:选中子物体,按Alt+G清除位置、Alt+R清除旋转、Alt+S清除缩放,然后重新设置变换属性。
4.2 层级循环错误
现象:Blender弹出警告“父物体A是B的子物体,同时B又是A的子物体”。
解决:在大纲视图(Outliner)中检查层级关系,使用Clear Parent(Alt+P)解除错误关联。
4.3 动画制作时部件扭曲
原因:子物体的权重分配不均(常见于骨骼绑定)。
解决:进入权重绘制模式(Ctrl+Tab→Weight Paint),用笔刷工具调整顶点权重值(0-1之间),观察实时变形效果进行微调。
五、总结:从层级关系到3D建模的思维跃迁
通过制作C919飞机模型,我们掌握了Blender中层级关系的核心逻辑:
- 单向控制:父物体影响子物体,子物体不影响父物体。
- 空对象应用:用不可见的空对象管理复杂模型的层级结构。
- Python自动化:通过脚本快速生成和调整模型,提升效率。
这些技能不仅适用于飞机建模,还能迁移到角色动画、机械装配、建筑可视化等任何需要层级化控制的场景。下次当你打开Blender时,不妨试着用层级关系的视角观察模型——你会发现,3D建模的本质,就是通过合理的层级设计,让复杂的系统变得简单可控。