Skip to content

Latest commit

 

History

History
363 lines (253 loc) · 8.36 KB

File metadata and controls

363 lines (253 loc) · 8.36 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 4 column 1
---
show: step
version: 1.0 
enable_checker: true
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

  • oeasy Python 0683
  • 这是 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 进入 rotation模式

图片描述

  • 需要沿着 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 即可。