螺丝工厂vtkThreadFactory
(1)
缘起
几年前的探索在Python里应用Openscad实现3D建模之3D螺纹建模初探3
新的参考:
- generating nice threads in openscad
- vtkRotationalExtrusionFilter
辅助AI: coze
笔记📒:
openscad
代码分析
// 半径缩放函数,用于生成起始和结束段的锥度过度效果
function lilo_taper(x, N, tapered_fraction) =
// 计算最小值,确保缩放值在适当范围内,用于生成平滑过渡的Higbee 倒角效果
min(min(1, (1.0 / tapered_fraction) * (x / N)), (1 / tapered_fraction) * (1 - x / N));
// 模块定义: 生成一个具有 Higbee 倒角的螺旋螺纹,可以附着到一个圆柱表面
module straight_thread(section_profile, pitch = 4, turns = 3, r = 10, higbee_arc = 45, fn = 120)
{
// 设置细分精度
$fn = fn;
// 计算步数:总圈数 * 每圈细分数
steps = turns * $fn;
// 生成螺旋造型的主逻辑
thing = [ for (i = [0:steps])
transform(
// 每步的旋转角度,减90度使之始终与X方向对齐
rotation([0, 0, 360 * i / $fn - 90]) *
// 逐步上升,在半径r处具体位置,模型随i上升
translation([0, r, pitch * i / $fn]) *
// 将截面旋转90度使其竖直
rotation([90, 0, 0]) *
// 沿Z轴方向解旋转
rotation([0, 90, 0]) *
// 使用缩放以实现Higbee 倒角效应,初始化缩放是0.01~1之间
scaling([0.01 + 0.99 * lilo_taper(i / turns, steps / turns, (higbee_arc / 360) / turns), 1, 1]),
// 使用定义的截面轮廓
section_profile
)
];
// 将转换后的点集皮肤成一个连续的形状
skin(thing);
}
function lilo_taper
详细说明:
- 输入参数:
x: 当前点的标识(通常是步进值)。
N: 总标识数量(通常是总步数)。
tapered_fraction: 反映锥度部分的比例,即起始和结束段的锥度部分占整个长度的比例。 - 内部表达式:
min(min(1, (1.0 / tapered_fraction) * (x / N)), (1 / tapered_fraction) * (1 - x / N)):
(1.0 / tapered_fraction) * (x / N):
这里的 (x / N) 表示当前点在整个长度中的位置占比。
将占比乘以 (1.0 / tapered_fraction),计算缩放比。
(1 / tapered_fraction) * (1 - x / N):
这里的 (1 - x / N) 表示当前点距离结束的比例(从结束点向起始点反向计算)。
同样,将这个比例乘以 (1.0 / tapered_fraction),计算缩放比。
min(1, (1.0 / tapered_fraction) * (x / N)):
取1和计算出的缩放比中的最小值,确保缩放比不会超过1。
min( ..., (1 / tapered_fraction) * (1 - x / N)):
最后通过再取一次最小值,确保当前点的缩放系数位于合理范围内,平滑生成锥度效果。 - 应用场景
用于螺纹的起始和结束锥形设计:
确保螺纹的起始和结束部分平滑变化,避免突然的截断或锐边。
即形成 Higbee 倒角,这种倒角的目的是消除螺纹齿的尖端,以便更平稳地开始和终止螺纹的啮合。 - 关键点
缩放过程:
x: 当前步进的计数。
N: 总步数。
tapered_fraction: 锥度比例,影响螺纹的起始和结束部分的平滑度。
min 函数用来确保缩放系数合适,不会出现过大或过小的情况,导致意外的几何形变。
通过这段代码,可以实现对螺纹起始和结束部分的锥度缩放,保证这部分的几何形状平滑过渡,提高螺纹啮合的效果和质量。
vtk
+ python
代码分析:
应用vtkRotationalExtrusionFilter, 可以实现类似的螺旋堆叠:
如:
代码参见
未完待续…