Skip to content

Latest commit

 

History

History
399 lines (284 loc) · 11.1 KB

File metadata and controls

399 lines (284 loc) · 11.1 KB
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
    • 撤销回来

图片描述

  • 选中螺纹部分
    • 发现对象里面有
      1. 网格体mesh
      2. 变形器modifier

图片描述

  • 在变形器调板上
    • 点击应用变形器
    • apply

效果

  • 变形器消失
    • 只剩下网格

图片描述

  • 也就是说
    • 已经把变形器
    • 应用到了网格(mesh)中的
    • 每一个点(vertex)上了

图片描述

合并

  • 然后再选中三个对象合并

图片描述

  • 合成了1个网格体

taper

  • 添加 修改器
    • 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世纪
    • 进入中古英语
    • 木工用的螺旋工具、钻孔器

螺栓vs 螺钉

维度 Bolt(螺栓) Screw(螺丝)
词源核心 古日耳曼语“杆、栓” 拉丁语“旋转挖掘”(母猪拱土)
工具特征 无螺纹,带头部的金属栓,需配螺母 带连续螺纹,可自攻/配螺母
核心动作 插入 + 螺母固定(无旋转) 旋转 + 拧入(自攻/配合螺纹)
拆卸属性 可拆卸(拧开螺母即可) 可拆卸(反向旋转退出)
典型场景 钢结构、机械固定(高强度) 家具、电器、轻型固定(精密/自攻)
  • screw in/out
    • 拧紧螺丝

图片描述

  • screw up

    • 拧过头了
    • 拧豁了
  • taper 应该怎么理解呢?

taper

  • taper 核心词源

    • papyrus(纸莎草)
    • 经古英语异化演变而来
  • 拉丁语 papyrus

    • 纸莎草
    • 借入古英语为 papur
    • paper

图片描述

  • 古代常以其髓部制作灯芯
    • 中世纪拉丁语/罗曼语中用于指“蜡烛灯芯”
    • tapur/taper,本义为“蜡烛、灯芯”

图片描述

  • 16世纪起
    • 基于细长蜡烛“一端渐细”的外形
    • taper 衍生出动词
      • “(使)逐渐变细、缩减”之义

总结

对比维度 Bolt Screw
核心词源/本义 源于“杆状固定物”,本义为门闩、箭 源于“旋转动作”隐喻(母猪拱土)
形态演变 从门闩、箭 → 带螺母配合的螺栓 从木质粗制旋转件 → 带螺纹的螺丝
固定原理 插入式+螺母配合,无螺纹 旋转+螺纹锚固,可自攻
引申义侧重 快速、突然 口语化隐喻:压榨、搞砸等

图片描述

  • 先有的 螺栓 呢?🤔
  • 还是先有的 螺钉 呢?🤔
  • 下次再说!👋

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