【Blender Python】7.一些运算、三角函数以及随机

概述

要用Blender进行程序生成,数学计算是少不了的,Python支持一些常规的表达式计算,而另外一些相关的数学函数则在math模块中。

一些基础的运算

取余、除法、整除

python 复制代码
>>> 21 % 4
1

>>> 21 / 4
5.25

>>> 21 // 4
5
  • %是取余,/是除法,//是整除,不保留小数

乘法

python 复制代码
>>> 3 * 3
9

>>> 3 * 3.0
9.0

>>> 3 * "="
'==='

>>> 3 * "._"
'._._._'

>>> 3 * C.active_object
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'int' and 'Object'
  • 整数与整数相乘,结果还是一个整数
  • 整数与浮点数相乘,结果是一个浮点数
  • 字符或字符串乘以一个整数,结果返回其重复多次组成的字符串
  • 数字类型乘以对象或其他不能相乘的类型,会返回类型错误
python 复制代码
>>> 2 * 5
10

>>> 2 ** 5
32

>>> 2 ** 5 ** 6
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
ValueError: Exceeds the limit (4300 digits) for integer string conversion; use sys.set_int_max_str_digits() to increase the limit

>>> (2 ** 5 ) ** 6
1073741824

*代表乘法,**代表幂运算,例如:2 ** 5代表$ 2^5 。 ' ( 2 ∗ ∗ 5 ) ∗ ∗ 6 ' 代表 。`(2 ** 5 ) ** 6`代表 。'(2∗∗5)∗∗6'代表 (2^5)^6 。要表示 。要表示 。要表示 2^{5^6} $则需要表示为2 ** (5 ** 6 )

math模块

具体可以参考:Python math 模块 | 菜鸟教程 (runoob.com)。这里只专注于最常用的三角函数部分。

两个常量

首先是两个三角函数相关的常量:

python 复制代码
import bpy
import math

print(math.pi)  # 代表π = 3.141592653589793
print(math.tau) # 代表2π = 6.283185307179586

在脚本文件中的print()并不会在脚本界面的Python控制台中输出内容。而是要打开Blender的系统控制台。

打开后可以看到输出的信息:

角度和弧度转换

<font style="color:rgb(0, 0, 0);">degrees()</font><font style="color:rgb(0, 0, 0);">radians()</font>用于角度和弧度的转换

python 复制代码
import bpy
import math

print(math.degrees(math.pi))   # 180.0
print(math.degrees(math.tau))  # 360.0
print(math.radians(90))        # 1.5707963267948966
print(math.radians(180))       # 3.141592653589793

利用三角函数实现环形阵列

python 复制代码
import bpy
import math

# 环形阵列
def circle_array(r,steps):
    ang = math.tau/steps
    for i in range(steps):
        i_ang = ang * i
        pos = (r * math.cos(i_ang),r * math.sin(i_ang),0)
        bpy.ops.mesh.primitive_cube_add(location=pos)


circle_array(10,6)

执行后的效果:

可以看到在XY平面上,环形阵列了6个立方体。

python 复制代码
circle_array(10,12)

让立方体跟随旋转

上面的环形阵列,立方体并没有跟随阵列进行旋转。

python 复制代码
import bpy
import math

# 环形阵列
def circle_array(r,steps):
    ang = math.tau/steps
    for i in range(steps):
        i_ang = ang * i
        pos = (r * math.cos(i_ang),r * math.sin(i_ang),0)
        bpy.ops.mesh.primitive_cube_add(location=pos)
        bpy.context.object.rotation_euler.z = i_ang

circle_array(10,12)

改进后,可以看到立方体跟随阵列进行了旋转。

可以看到三角函数还是很重要的,尤其是在从方到圆,以及旋转上的应用。

随机

除了三角函数,随机在程序生成中也是很重要的,Python中的随机数生成由<font style="color:rgb(17, 17, 17);">random</font>模块掌管,具体可参考Python 随机数生成 | 菜鸟教程 (runoob.com)

这里结合环形阵列,添加一个随机范围的高度。

python 复制代码
import bpy
import math
import random

# 环形阵列 + 随机高度
def circle_array(r,steps,min_z,max_z):
    ang = math.tau/steps
    for i in range(steps):
        i_ang = ang * i
        pos = (r * math.cos(i_ang),r * math.sin(i_ang),random.randint(min_z, max_z))
        bpy.ops.mesh.primitive_cube_add(location=pos)
        bpy.context.object.rotation_euler.z = i_ang

circle_array(10,12,-5,5)
python 复制代码
circle_array(10,12,-1,1)

一点小改进

之前编写的代码,执行前都需要手动全选和删除场景中原来的对象。很是麻烦。所以这节我们改进一下。首先是添加清除当前场景中的所有物体的指令,然后是编写主函数,执行操作。

swift 复制代码
import bpy
import math
import random

# 环形阵列 + 随机高度
def circle_array(r,steps,min_z,max_z):
    ang = math.tau/steps
    for i in range(steps):
        i_ang = ang * i
        pos = (r * math.cos(i_ang),r * math.sin(i_ang),random.randint(min_z, max_z))
        bpy.ops.mesh.primitive_cube_add(location=pos)
        bpy.context.object.rotation_euler.z = i_ang


# 主函数
if __name__ == '__main__':
    # 清除当前场景中的所有物体
    bpy.ops.object.select_all(action='SELECT')
    bpy.ops.object.delete()
    # 执行环形阵列
    circle_array(10,12,-1,1)

我们通过if __name__ == '__main__':设定主函数,并在其中执行清除当前场景中的所有物体以及调用环形阵列函数的代码。

则点击运行按钮时,每次都会执行主函数内容,而不再需要手动全选和删除。

总结

本节内容,介绍了一些基础运算的细节,以及引入程序生成必备的三角函数和随机。不详之处后改后补。

相关推荐
hummhumm3 分钟前
第 32 章 - Go语言 部署与运维
java·运维·开发语言·后端·python·sql·golang
大佬,救命!!!23 分钟前
Python编程整理汇总(基础汇总版)
开发语言·笔记·python·pycharm·学习方法·启发式算法
Python私教24 分钟前
Python 使用 Token 认证方案连接 Kubernetes (k8s) 的详细过程
开发语言·python·kubernetes
攻城狮_Dream25 分钟前
Python 版本的 2024详细代码
开发语言·python·pygame
卧式纯绿27 分钟前
自动驾驶3D目标检测综述(三)
人工智能·python·深度学习·目标检测·3d·cnn·自动驾驶
儒雅芝士33 分钟前
Ros2 操作指令记录
c++·python·机器人
晚风_END36 分钟前
postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)
服务器·开发语言·数据库·python·sql·postgresql·数据库开发
我要学编程(ಥ_ಥ)1 小时前
初始Python篇(7)—— 正则表达式
python·正则表达式
阿猿先森1 小时前
PyQt6+pyqtgraph折线图绘制显示
开发语言·python
CodeDevMaster1 小时前
Python办公自动化:用xlrd轻松读取Excel文件
python·excel