Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0701
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在:
个人网站: `https://oeasy.org`
蓝桥云课: `https://www.lanqiao.cn/courses/3584`
GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
Gitee: `https://gitee.com/overmind1980/oeasypython`
---- 上次学习的是
-次学习的是
- twist
- 扭曲
| 衍生词 | 词性 | 词义 |
|---|---|---|
| twist | v./n. | 扭转;拧;弯曲;剧情转折 |
| twister | n. | 扭转的人/物;龙卷风;绕口令 |
| twisty | adj. | 弯弯曲曲的;曲折的 |
| twistable | adj. | 可扭转的;可弯曲的 |
| intertwist | v. | 使互相缠绕;交织 |
| untwist | v. | 解开;松开(缠绕的东西) |
- 可以做个螺丝钉吗?🤔
- 螺丝钉
- 不需要螺母
- 在木头里面
- 自己就可以
- 攻出螺纹来
import bpy
import math
def create_cube_spring():
# 1. 清理场景
if bpy.context.object and bpy.context.object.mode != 'OBJECT':
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 2. 参数设置
num_cubes = 100 # 立方体数量
cube_size = 1 # 立方体大小
radius = 2.0 # 弹簧半径 (偏离中心的距离)
height = 15 # 总高度
turns = 9 # 旋转圈数
step_height = height / num_cubes
parts = []
start_z = -4
# 3. 创建一摞偏心的立方体
# 关键点:为了让Twist形成弹簧(螺旋),物体不能在中心,必须偏离Z轴一定距离(radius)
for i in range(num_cubes):
z_pos = start_z + (i * step_height) + (step_height / 2)
bpy.ops.mesh.primitive_cube_add(
size=cube_size,
location=(radius, 0, z_pos) # X轴偏移 = 半径
)
cube = bpy.context.active_object
cube.name = f"Spring_Seg_{i}"
# 稍微调整一下比例,让它顺着螺旋方向长一点
# 比如沿Y轴拉长一点,这样连起来更像线
cube.scale = (1, 1.5, 1)
bpy.ops.object.transform_apply(scale=True)
parts.append(cube)
# 4. 合并为一个对象
bpy.ops.object.select_all(action='DESELECT')
for part in parts:
part.select_set(True)
# 激活第一个物体
bpy.context.view_layer.objects.active = parts[0]
bpy.ops.object.join()
spring_obj = bpy.context.active_object
spring_obj.name = "Cube_Spring"
# 5. 重置原点到世界中心 (0,0,0)
# 这一点至关重要!Twist修改器是绕着物体原点旋转的。
# 如果原点在物体几何中心(即偏心位置),Twist只会让它自转。
# 只有原点在(0,0,0),物体在(R,0,Z),Twist才会把它绕成螺旋线。
bpy.context.scene.cursor.location = (0.0, 0.0, 0.0)
bpy.ops.object.origin_set(type='ORIGIN_CURSOR')
# 6. 添加 Twist 修改器
twist_mod = spring_obj.modifiers.new(name="Spring_Twist", type='SIMPLE_DEFORM')
twist_mod.deform_method = 'TWIST'
twist_mod.deform_axis = 'Z'
twist_mod.angle = math.radians(360 * turns)
print(f"弹簧生成完毕: {num_cubes}个立方体, 半径{radius}m, 旋转{turns}圈")
bpy.ops.mesh.primitive_cylinder_add()
bpy.context.object.scale = (1.5, 1.5, 5)
bpy.ops.mesh.primitive_cylinder_add(
vertices=6,
radius=4,
depth=2,
location=(0, 0, -6)
)
if __name__ == "__main__":
create_cube_spring()
- 要把他们3个object合并
- 选中之后 合并
- 螺纹被拉直了
- 想要join
- 并且保存螺纹
- 应该怎么办?
- ctrl+z
- 撤销回来
- 选中螺纹部分
- 发现对象里面有
- 网格体mesh
- 变形器modifier
- 发现对象里面有
- 在变形器调板上
- 点击应用变形器
- apply
- 变形器消失
- 只剩下网格
- 也就是说
- 已经把变形器
- 应用到了网格(mesh)中的
- 每一个点(vertex)上了
- 然后再选中三个对象合并
- 合成了
1个网格体
- 添加 修改器
- taper
- 锥化
- 锥化 是 锥化了
- 但是 上下颠倒 了
- 需要先把网格上下颠倒
- 然后再添加锥化修改器
- 沿着z轴进行锥化
- 锥化因子 (factor) 为 1
- 锥化范围 控制在 锥头[0, 0.5]
- 螺栓 变成了螺钉
- 可以把这个过程做成代码吗?
import bpy
import math
def create_cube_spring():
# 1. 清理场景
if bpy.context.object and bpy.context.object.mode != 'OBJECT':
bpy.ops.object.mode_set(mode='OBJECT')
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
# 2. 参数设置
num_cubes = 100 # 立方体数量
cube_size = 1 # 立方体大小
radius = 2.0 # 弹簧半径 (偏离中心的距离)
height = 15 # 总高度
turns = 9 # 旋转圈数
step_height = height / num_cubes
parts = []
start_z = -4
# 3. 创建一摞偏心的立方体
# 关键点:为了让Twist形成弹簧(螺旋),物体不能在中心,必须偏离Z轴一定距离(radius)
for i in range(num_cubes):
z_pos = start_z + (i * step_height) + (step_height / 2)
bpy.ops.mesh.primitive_cube_add(
size=cube_size,
location=(radius, 0, z_pos) # X轴偏移 = 半径
)
cube = bpy.context.active_object
cube.name = f"Spring_Seg_{i}"
# 稍微调整一下比例,让它顺着螺旋方向长一点
# 比如沿Y轴拉长一点,这样连起来更像线
cube.scale = (1, 1.5, 1)
bpy.ops.object.transform_apply(scale=True)
parts.append(cube)
# 4. 合并为一个对象
bpy.ops.object.select_all(action='DESELECT')
for part in parts:
part.select_set(True)
# 激活第一个物体
bpy.context.view_layer.objects.active = parts[0]
bpy.ops.object.join()
spring_obj = bpy.context.active_object
spring_obj.name = "Cube_Spring"
# 5. 重置原点到世界中心 (0,0,0)
# 这一点至关重要!Twist修改器是绕着物体原点旋转的。
# 如果原点在物体几何中心(即偏心位置),Twist只会让它自转。
# 只有原点在(0,0,0),物体在(R,0,Z),Twist才会把它绕成螺旋线。
bpy.context.scene.cursor.location = (0.0, 0.0, 0.0)
bpy.ops.object.origin_set(type='ORIGIN_CURSOR')
# 6. 添加 Twist 修改器
twist_mod = spring_obj.modifiers.new(name="Spring_Twist", type='SIMPLE_DEFORM')
twist_mod.deform_method = 'TWIST'
twist_mod.deform_axis = 'Z'
twist_mod.angle = math.radians(360 * turns)
bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Spring_Twist")
print(f"弹簧生成完毕: {num_cubes}个立方体, 半径{radius}m, 旋转{turns}圈")
bpy.ops.mesh.primitive_cylinder_add()
bpy.context.object.scale = (1.5, 1.5, 5)
bpy.ops.mesh.primitive_cylinder_add(
vertices=6,
radius=4,
depth=2,
location=(0, 0, -6)
)
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.join()
bpy.ops.object.editmode_toggle()
bpy.ops.transform.mirror(orient_type='GLOBAL', constraint_axis=(False, False, True), use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)
bpy.ops.object.modifier_add(type='SIMPLE_DEFORM')
bpy.context.object.modifiers["SimpleDeform"].deform_method = 'TAPER'
bpy.context.object.modifiers["SimpleDeform"].deform_axis = 'Z'
bpy.context.object.modifiers["SimpleDeform"].limits[1] = 0.5
bpy.context.object.modifiers["SimpleDeform"].factor = 1
if __name__ == "__main__":
create_cube_spring()
- screw
- 原本指“母猪” scrofa**
- 母猪的尾巴是螺旋卷曲的形态
- 用这个词代指“螺旋状的工具”
- 14世纪
- 进入中古英语
- 木工用的螺旋工具、钻孔器
| 维度 | Bolt(螺栓) | Screw(螺丝) |
|---|---|---|
| 词源核心 | 古日耳曼语“杆、栓” | 拉丁语“旋转挖掘”(母猪拱土) |
| 工具特征 | 无螺纹,带头部的金属栓,需配螺母 | 带连续螺纹,可自攻/配螺母 |
| 核心动作 | 插入 + 螺母固定(无旋转) | 旋转 + 拧入(自攻/配合螺纹) |
| 拆卸属性 | 可拆卸(拧开螺母即可) | 可拆卸(反向旋转退出) |
| 典型场景 | 钢结构、机械固定(高强度) | 家具、电器、轻型固定(精密/自攻) |
- screw in/out
- 拧紧螺丝
-
screw up
- 拧过头了
- 拧豁了
-
taper 应该怎么理解呢?
-
taper 核心词源
- papyrus(纸莎草)
- 经古英语异化演变而来
-
拉丁语 papyrus
- 纸莎草
- 借入古英语为 papur
- paper
- 古代常以其髓部制作灯芯
- 中世纪拉丁语/罗曼语中用于指“蜡烛灯芯”
- tapur/taper,本义为“蜡烛、灯芯”
- 16世纪起
- 基于细长蜡烛“一端渐细”的外形
- taper 衍生出动词
- “(使)逐渐变细、缩减”之义
| 对比维度 | Bolt | Screw |
|---|---|---|
| 核心词源/本义 | 源于“杆状固定物”,本义为门闩、箭 | 源于“旋转动作”隐喻(母猪拱土) |
| 形态演变 | 从门闩、箭 → 带螺母配合的螺栓 | 从木质粗制旋转件 → 带螺纹的螺丝 |
| 固定原理 | 插入式+螺母配合,无螺纹 | 旋转+螺纹锚固,可自攻 |
| 引申义侧重 | 快速、突然 | 口语化隐喻:压榨、搞砸等 |
- 先有的
螺栓呢?🤔 - 还是先有的
螺钉呢?🤔 - 下次再说!👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。

















