Skip to content

Latest commit

 

History

History
386 lines (277 loc) · 9.89 KB

642-2112839-C919大飞机_构造飞机_代码细化.sy.md

File metadata and controls

386 lines (277 loc) · 9.89 KB
show version enable_checker
step
1.0
true

python_blender

开始

  • 上次研究了父子关系

    • 父亲旋转 儿子跟着
    • 可以通过设置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 进入 rotation模式

图片描述

  • 需要沿着 x 轴旋转 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] = pi / 4

运行结果

图片描述

  • 哥哥有了
    • 弟弟 应该在哥哥的基础上 再转

图片描述

  • 再在 x 轴旋转 90度

更新代码

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] = pi / 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] = pi / 4
bpy.context.object.rotation_euler[1] = pi / 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] = pi / 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] = pi / 4
bpy.context.object.rotation_euler[1] = pi / 2
empty_obj.rotation_euler[1] = pi/4
  • 从父级对象旋转

图片描述

  • 想做一些更复杂的东西

大飞机

图片描述

  • 先手工做一下试试

手动结果

  • 先 插入一个 圆柱体

图片描述

  • 然后控制圆柱体
    1. z轴缩放为5
    2. x轴旋转为90度

图片描述

  • 下面试试代码

代码

import bpy
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=2)
  • 确实出现了 圆柱体

图片描述

  • 可以观察到两个参数
    • radius 半径
    • depth 高度

调整参数

import bpy
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=5)
  • 尝试修改代码

图片描述

  • 机身有了 准备旋转

旋转结果

  • 机身可以再长一点
import bpy
from math import pi
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=5)
bpy.context.object.rotation_euler[0] = pi / 2
  • 机身 延长 并旋转

图片描述

  • 准备加上 尾翼

尾翼准备

图片描述

  • 尾翼参数如下

图片描述

  • 现需要 转化为 代码

尾翼

import bpy
from math import pi

bpy.ops.object.select_all(action="SELECT") # 选择所有物体
bpy.ops.object.delete() # 删除选定的物体
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=7)
bpy.context.object.rotation_euler[0] = pi /2
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (0.25,0.75,1)
bpy.context.object.rotation_euler[0] = pi / 4
bpy.context.object.location = (0, -3 ,1)
  • 结果

图片描述

准备尾翼细节

图片描述

  • 参数

图片描述

代码

import bpy
from math import pi

bpy.ops.object.select_all(action="SELECT") # 选择所有物体
bpy.ops.object.delete() # 删除选定的物体
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=9)
bpy.context.object.rotation_euler[0] = pi /2
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (0.2,0.75,1)
bpy.context.object.rotation_euler[0] = - pi / 4
bpy.context.object.location = (0, 5 ,1)
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (1,0.5,0.25)
bpy.context.object.location = (0, 5 ,1)
  • 运行成功

图片描述

  • 准备加机翼

机翼状态

图片描述

  • 参数

图片描述

转化为代码

import bpy
from math import pi

bpy.ops.object.select_all(action="SELECT") # 选择所有物体
bpy.ops.object.delete() # 删除选定的物体
bpy.ops.mesh.primitive_cylinder_add(radius=1, depth=9)
bpy.context.object.rotation_euler[0] = pi /2
bpy.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.scale = (0.2,0.75,1)
bpy.context.object.rotation_euler[0] = - pi / 4
bpy.context.object.location = (0, 5 ,1)
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.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.ops.mesh.primitive_cube_add(size=2)
bpy.context.object.name = "body"
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"
  • 结果

图片描述

  • 可以让 封装好的c919移动旋转吗?

尝试

  • 控制 封装对象

图片描述

总结 🤔🤔

  • 这次我们通过代码制作出了
    • 一架传统大飞机

图片描述

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

图片描述

  • 可以让这个飞机进行旋转吗?
  • 我们下次再说!👋