Skip to content

Latest commit

 

History

History
343 lines (252 loc) · 7.56 KB

File metadata and controls

343 lines (252 loc) · 7.56 KB
Error in user YAML: (<unknown>): did not find expected key while parsing a block mapping at line 1 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 0681
  • 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。

三轴旋转效果_加号制作_角度弧度转化

开始

  • 配套视频
  • 上次控制了视角的变化
    • 所有对象 为全景 Frame All
    • 所选对象 为全景 Frame Selected
    • 还可以 手动改变
键鼠配合 操作 效果
鼠标中键 滚动 镜头推拉
鼠标中键 按住拖动 镜头旋转
shift + 鼠标中键 点击拖动 镜头平移
  • 后面加入了随机的因素
    • 一字长蛇
    • 方阵
    • 立体魔方
    • 加入了随机性
  • 最后做了
    • 圆形
    • 螺旋形
    • 旋转楼梯
    • 都用到了角度的计算
  • 如何理解角度??🤔

建立立方体

  • 清空场景
  • shift + a
    • 建立一个立方体
  • 找到scale[0]
    • 设置为3
import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.mesh.primitive_cube_add(size = 1)
bpy.context.object.scale[0] = 3
  • 可以看到
    • 立方体在x方向
    • 缩放为原来三倍

图片描述

  • 现在需要
    • 把横变成竖

旋转

  • 尝试旋转此立方体
    • 选中立方体
    • shift + 空格 之后 r
    • 可以 旋转立方体

图片描述

  • xyz 三个轴的缩放值构成一个列表
    • scale[0] 是 x
    • scale[1] 是 y
    • scale[2] 是 z

绿色坐标轴

  • 总共有三个轴向
    • 我想沿着绿色的轴向旋转

图片描述

  • 设置 旋转值
    • 第二个分量 为90度
    • ctrl 可以以5度为单位旋转

具体代码

  • 将对象拖动到游乐场
    • 找到对应的参数

图片描述

  • 尝试设置

代码实现

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.mesh.primitive_cube_add(size = 1)
bpy.context.object.scale[0] = 3
bpy.context.object.rotation_euler[1] = 1.5708
  • 原来
    • 旋转就是
    • 改变object.rotation_euler

图片描述

  • xyz 三个轴向的旋转值构成一个列表
    • rotation_euler[0] 是 x轴 保持
    • rotation_euler[1] 是 y轴 设置为 1.5708
    • rotation_euler[2] 是 z轴 保持

效果

图片描述

  • 原来的横
    • 变成了竖

图片描述

等效

  • 在下面三个地方操作是等效的
    • 3d 视图 手动旋转
    • 属性视图 修改值
    • python 视图 写代码

图片描述

  • 这个1.5708怎么来的呢?

角度 弧度

  • 弧度制
    • 将和半径相等的弧长对应的角度
    • 定义为1

图片描述

  • 一周
    • 弧度制 2*π ≈ 6.28
    • 角度制 360°
  • 直角
    • 角度制 360 / 4 = 90°
    • 弧度制 2π /4 = π/2 ≈ 1.5708
  • 想要在此竖的基础上
    • 再来一个横

一竖一横

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
bpy.ops.mesh.primitive_cube_add(size = 1)
bpy.context.object.scale[0] = 3
bpy.context.object.rotation_euler[1] = 1.5708
bpy.ops.mesh.primitive_cube_add(size = 1)
bpy.context.object.scale[0] = 3
  • 得到结果

图片描述

新形状

  • 如果 想做
    • 下面这个造型

图片描述

  • 该如何修改代码

代码

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for num in range(3):
	bpy.ops.mesh.primitive_cube_add(size = 1)
	bpy.context.object.scale[num] = 3
  • 效果

图片描述

新想法

  • 可以布下圆形之阵吗?

图片描述

批量旋转

import bpy
from math import pi,cos,sin
r = 3
n = 24
for i in range(n):
    theta = i * pi * 2/n
    pos = (r*cos(theta), r*sin(theta), 0)
    bpy.ops.mesh.primitive_cube_add(size=0.6,location=pos,
    rotation=(0,0,theta)) 
  • 效果

图片描述

再修改scale

import bpy
from math import pi,cos,sin
r = 4
n = 40
for i in range(n):
    theta = i * pi * 2/n
    pos = (r*cos(theta), r*sin(theta), 0)
    bpy.ops.mesh.primitive_cube_add(size=0.6,location=pos,rotation=(0,0,theta))
    bpy.context.object.scale = (0.5,0.1,0.1)

修改参数

import bpy
from math import pi,cos,sin
r = 4
n = 100
for i in range(n):
    theta = i * pi * 2/n
    pos = (r*cos(theta), r*sin(theta), 0)
    bpy.ops.mesh.primitive_cube_add(size=0.6,location=pos,rotation=(0,0,theta))
    bpy.context.object.scale = (1,0.2,0.2)
  • 结果

图片描述

手掌效果

  • 各个手指都是掰开了的👋

图片描述

import bpy

mat = bpy.data.materials.new('red')
color = (0.7,0.2,0.1,1)
mat.diffuse_color = color
bpy.ops.mesh.primitive_cube_add()
hand=bpy.context.object
hand.location=(0,0,0,)
hand.scale=(0.3,1,1)
hand.data.materials.append(mat)
   

bpy.ops.mesh.primitive_cube_add()
finger1=bpy.context.object
finger1.location=(0,-1.2,0.2,)
finger1.scale=(0.3,1,0.3)
finger1.data.materials.append(mat)

bpy.ops.mesh.primitive_cube_add()
finger2=bpy.context.object
finger2.location=(0,-0.8,1.3,)
finger2.scale=(0.3,0.15,1.5)
finger2.data.materials.append(mat)

bpy.ops.mesh.primitive_cube_add()
finger3=bpy.context.object
finger3.location=(0,-0.3,1.3,)
finger3.scale=(0.3,0.15,1.5)
finger3.data.materials.append(mat)

bpy.ops.mesh.primitive_cube_add()
finger4=bpy.context.object
finger4.location=(0,0.3,1.3,)
finger4.scale=(0.3,0.15,1.5)
finger4.data.materials.append(mat)

bpy.ops.mesh.primitive_cube_add()
finger5=bpy.context.object
finger5.location=(0,0.8,1.3,)
finger5.scale=(0.3,0.15,1.5)
finger5.data.materials.append(mat)

bpy.ops.mesh.primitive_plane_add()
plane=bpy.context.object
plane.scale=(10,10,1,)
plane.location=(0,0,-1)
  

总结 🤔

  • 这次
    • 物体的旋转
    • 角度和弧度制的转化
    • 布下了圆形之阵
  • 如果一个 造型 做出来了
    • 比如加号
    • 想让他以一个整体的方式 旋转
    • 旋转 为 乘号

图片描述

  • 应该如何修改代码呢?
  • 我们下次再说!👋
  • 配套视频

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。