blender010_大飞机C919
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
C919大飞机_构造飞机_代码细化
开始
- 配套视频
- 上次研究了父子关系
- 父亲旋转 儿子跟着
- 可以通过设置parent控制父子关系
- 可以 新建一个 空对象 None
- 作为 抽象的虚拟爸爸
- 然后 将 各种对象放入其中
- 虚拟爸爸👨 可以控制很多儿子👦👦👦

- 可以做出这样的交叉体吗?🤔
一个一个来
- 先来第一个 立方体
-
放到 父亲(空对象)里面
-
作为哥哥
import bpy
import mathclear current scene
bpy.ops.object.select_all(action="SELECT") # 选择所有物体
bpy.ops.object.delete() # 删除选定的物体create objects
empty_obj = bpy.data.objects.new("empty", None)
empty_obj.name = "Parent"
bpy.data.collections["Collection"].objects.link(empty_obj)
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, location=(0, 0, 0))
bpy.context.object.scale[0] = 3
bpy.context.object.parent = empty_obj
bpy.context.object.name = "elder_brother" -
运行结果

- 需要旋转一下

旋转
- shift + a
- 按 r

-
需要沿着 x 轴旋转 45度
bpy.context.object.rotation_euler[0] = 3.14 / 4
运行结果

- 哥哥有了

- 弟弟 应该在哥哥的基础上
- 再在 y 轴旋转 90度
更新代码
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, location=(0, 0, 0))
bpy.context.object.scale[0] = 3
bpy.context.object.parent = empty_obj
bpy.context.object.name = "younger_brother"
bpy.context.object.rotation_euler[0] = 3.14 / 4
bpy.context.object.rotation_euler[1] = 3.14 / 2
- 结果

- 尝试让新交叉体
- 再旋转45度
- 摆成 ✖️ 的模样
再旋转
- 通过 旋转父级对象
-
完成 子对象的旋转
import bpy
from math import piclear current scene
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()create objects
empty_obj = bpy.data.objects.new("empty", None)
empty_obj.name = "Parent"
bpy.data.collections["Collection"].objects.link(empty_obj)
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, location=(0, 0, 0))
bpy.context.object.scale[0] = 3
bpy.context.object.parent = empty_obj
bpy.context.object.name = "elder_brother"
bpy.context.object.rotation_euler[0] = 3.14 / 4
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, location=(0, 0, 0))
bpy.context.object.scale[0] = 3
bpy.context.object.parent = empty_obj
bpy.context.object.name = "younger_brother"
bpy.context.object.rotation_euler[0] = 3.14 / 4
bpy.context.object.rotation_euler[1] = 3.14 / 2
empty_obj.rotation_euler[1] = 3.14 / 4 -
从父级对象旋转

- 想做一些更复杂的东西
大飞机

- 先手工做一下试试
手动结果
- 先 插入一个 圆柱体

- 然后控制圆柱体
- z轴缩放为5
- x轴旋转为90度

- 下面试试代码
代码
import bpy
import math
from math import pi
# clear current scene
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=5)
- 确实出现了 圆柱体

- 可以观察到两个参数
- radius 半径
- depth 高度
- 机身有了 准备旋转
旋转结果
bpy.context.object.rotation_euler[0] = pi / 2
- 机身 延长 并旋转

- 准备加上 尾翼
尾翼准备
bpy.ops.mesh.primitive_cube_add()

控制
- 用 移动、旋转、缩放
- 控制 尾翼 到如下位置

- 尾翼参数如下

- 将参数设置
- 转化为 代码
尾翼
bpy.context.object.scale = (0.25,0.75,1)
bpy.context.object.rotation_euler[0] = pi / 4
bpy.context.object.location = (0, -3 ,1)
- 结果

准备 水平安定面

- 参数

代码
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (1,0.5,0.25)
bpy.context.object.location = (0, -3 ,1)
- 运行成功

- 准备加机翼
机翼状态

- 参数

转化为代码
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (5,1,0.25)
bpy.context.object.location = (0, -1 ,0)
- 可以得到飞机

- 现在需要把所有的部件
- 封装到c919中
- 并且每个对象都要
明确命名
封装 和 命名
import bpy
from math import pi
bpy.ops.object.select_all(action="SELECT") # 选择所有物体
bpy.ops.object.delete() # 删除选定的物体
c919 = bpy.data.objects.new("c919", None)
bpy.data.collections["Collection"].objects.link(c919)
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=9)
bpy.context.object.rotation_euler[0] = pi /2
bpy.context.object.parent = c919
bpy.context.object.name = "body"
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (0.2,0.75,1)
bpy.context.object.parent = c919
bpy.context.object.rotation_euler[0] = - pi / 4
bpy.context.object.location = (0, 5 ,1)
bpy.context.object.parent = c919
bpy.context.object.name = "tail1"
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (1,0.5,0.25)
bpy.context.object.location = (0, 5 ,1)
bpy.context.object.parent = c919
bpy.context.object.name = "tail2"
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (5,1,0.25)
bpy.context.object.location = (0, -1 ,0)
bpy.context.object.parent = c919
bpy.context.object.name = "wings"
- 结果

新属性总结
- 在原来基础属性基础上
- 添加了 名字、父级 属性
|----------------------|----------|--------------------|
| 属性名 | 所属类别 | 说明(简要) |
| location | 空间变换 | 坐标,格式为(x,y,z)浮点三元组 |
| rotation_euler | 空间变换(旋转) | 欧拉角,弧度制(x,y,z) |
| scale | 空间变换 | 缩放比例 |
| name | 基础标识 | 定义对象名称 |
| parent | 层级关系 | 设置父对象,子对象继承父对象变换 |
- 可以让 封装好的c919移动旋转吗?
尝试
- 控制 封装对象

总结 🤔🤔
- 这次我们通过代码制作出了
- 一架传统大飞机

- 飞机由几部分构成
- 机身 body
- 尾翼 tail1 + tail2
- 机翼 wings

- 可以让这个飞机进行旋转吗?
- 我们下次再说!👋
- 配套视频
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。