oeasy blender 010 制作一个c919飞机,理解层级关系

blender010_大飞机C919

  • 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。

C919大飞机_构造飞机_代码细化

开始

  • 父亲旋转 儿子跟着
  • 可以通过设置parent控制父子关系
  • 可以 新建一个 空对象 None
  • 作为 抽象的虚拟爸爸
  • 然后 将 各种对象放入其中
  • 虚拟爸爸👨 可以控制很多儿子👦👦👦
  • 可以做出这样的交叉体吗?🤔
一个一个来
  • 先来第一个 立方体
  • 放到 父亲(空对象)里面

  • 作为哥哥

    import bpy
    import math

    clear 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 pi

    clear 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

  • 从父级对象旋转

  • 想做一些更复杂的东西
大飞机
  • 先手工做一下试试
手动结果
  • 先 插入一个 圆柱体
  • 然后控制圆柱体
  1. z轴缩放为5
  2. 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 即可。
相关推荐
overmind1 天前
oeasy blender 005 调用函数添加猴头Monkey
blender
overmind1 天前
oeasy blender007 让对象在空间列阵
blender
Nan_Shu_6141 天前
学习: Blender 动画篇
学习·blender
overmind1 天前
oeasy blender008 三轴旋转效果
blender
Nan_Shu_6141 天前
学习: Blender 合成篇
学习·blender
成都渲染101云渲染66661 天前
Blender云渲染平台哪个好?2026全面对比与选择指南
blender
CG_MAGIC2 天前
Blender幕后花絮:王国受袭——叛乱
3d·blender·贴图·建模教程·渲云渲染
overmind2 天前
oeasy blender 004 在脚本工作区选择对象删除
blender
overmind2 天前
oeasy blender 003 blender中的游乐场,用参数运行模式
blender