Skip to content

Latest commit

 

History

History
389 lines (284 loc) · 9.24 KB

640-2027973-rotation_旋转_角度值_弧度制转化.sy.md

File metadata and controls

389 lines (284 loc) · 9.24 KB
show version enable_checker
step
1.0
true

python_blender

开始

  • 上次研究了location参数的设置
    • (1,2,3) 代表着 xyz 三个轴数值
    • 分别是(1m,2m,3m)
    • 定义了对象的位置

图片描述

  • 除了location参数之外
    • primitive_cube_add 函数
    • 还有一个 rotation参数
    • 这个参数怎么用呢?

构建环境

  • 还是在Code/b1.py中修改代码
import bpy
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for num in range(13):
    bpy.ops.mesh.primitive_monkey_add(size = 1)
    bpy.context.object.location = (0,num,0)
  • 然后进入blender中
    • 在文本调板中
    • Relaod
    • Run

图片描述

  • 得到一排猴子
    • 想让猴子并排站立

俯仰轴

import bpy
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for num in range(13):
    bpy.ops.mesh.primitive_monkey_add(size = 1)
    bpy.context.object.location = (0,num,0)
    bpy.context.object.rotation_euler[0] = 3.14 / 6
  • 猴子在红轴方向上旋转60度
    • 低头 60度

图片描述

  • 0号旋转轴 为
    • 俯仰轴
    • pitch
    • 负责 低头抬头
  • 现在全都低头认错
    • 我要他们趾高气扬起来

横滚轴

import bpy
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for num in range(13):
    bpy.ops.mesh.primitive_monkey_add(size = 1)
    bpy.context.object.location = (0,num,0)
    bpy.context.object.rotation_euler[1] = 3.14 / 6
  • 猴子在绿轴方向上 旋转 60度
    • 歪头 60度

图片描述

  • 1号旋转轴 为
    • 横滚轴
    • bank
    • 负责 歪头

航向轴

import bpy
bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for num in range(13):
    bpy.ops.mesh.primitive_monkey_add(size = 1)
    bpy.context.object.location = (0,num,0)
    bpy.context.object.rotation_euler[2] = 3.14 / 6
  • 猴子 在垂直于红绿轴平面的 z轴上旋转 60度
    • 转头 60度

图片描述

  • 2号坐标轴 为

    • 航向轴
    • heading
    • 负责转头
  • 来一面 猴子墙

基础墙面

import bpy

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for x in range(10):
    for z in range(10):
        bpy.ops.mesh.primitive_monkey_add(size=1)
        bpy.context.object.location=(x,0,z)
  • 效果

图片描述

  • 加点随机效果

随机转动

import bpy
import random

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for x in range(10):
    for z in range(10):
        r = random.random()
        bpy.ops.mesh.primitive_monkey_add(size=1)
        bpy.context.object.location=(x,0,z)
        bpy.context.object.rotation_euler[1] = r
  • 方向单一

图片描述

  • 尝试修改

修改角度

import bpy
import random

bpy.ops.object.select_all(action="SELECT")
bpy.ops.object.delete()
for x in range(10):
    for z in range(10):
        r = random.random()
        bpy.ops.mesh.primitive_monkey_add(size=1)
        bpy.context.object.location=(x,0,z)
        bpy.context.object.rotation_euler[1] = r-0.5
  • 效果

图片描述

  • 清空场景
    • 想做个加号+

建立立方体

  • shift + a
    • 建立一个立方体
  • 找到scale x 属性
    • 设置为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度

代码实现

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

图片描述

  • 一周
    • 角度制 360°
    • 弧度制 2*π ≈ 6.28
  • 直角
    • 角度制 90°
    • 弧度制 π/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 = 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))
    bpy.context.object.scale = (1,0.2,0.2)

修改参数

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)
  • 结果

图片描述

总结 🤔

  • 这次 研究了 旋转函数

    • rotation_euler 旋转
  • xyz 三个轴向的旋转值构成一个列表

    • rotation_euler[0] 是 x
    • rotation_euler[1] 是 y
    • rotation_euler[2] 是 z
  • 如果一个 造型 做出来了

    • 想让他以一个整体的方式 旋转 该怎么办呢?
  • 如果我想得到乘号

图片描述

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