OpenSCAD能否参数化拉伸造型?如何随高度调整凸起幅度?
OpenSCAD实现线性拉伸时凸起幅度随高度变化的方案
问题核心解释
你提到的$t参数是不存在的,OpenSCAD的linear_extrude会一次性生成整个拉伸实体,内部的代码仅执行一次来生成基础2D图形,不会在拉伸的每个高度层重复运行,所以echo只输出一次,也没有随拉伸进度变化的内置变量。
解决方案:逐层手动构建拉伸实体
通过for循环手动遍历每个高度层,用translate定位每层位置,结合小高度的linear_extrude实现。这样可以直接用循环索引作为层级参数,控制每层的凸起幅度。
修改后的完整代码
function f(r, t, T, peak_width, a) = (t % T > peak_width) ? r : r + a * sin(180 * (t % T) / peak_width); module periodic_envelope(da, r, num_bumps, peak_width, amplitude) { T = 360/num_bumps; pts = [ for (t = [0:da:360]) [f(r, t, T, peak_width, amplitude) * cos(t), f(r, t, T, peak_width, amplitude) * sin(t)] ]; polygon(pts); } peak_width = 18.0; // degrees amplitude = 10; r = 30; thickness = 2; da = 0.5; num_bumps = 4; height = 120; scale_factor = 1.2; h_step = 1; // 每层高度,值越小平滑度越高,渲染时间越长 // 逐层构建拉伸实体 for (i = [0:floor(height/h_step)-1]) { // 计算当前层的进度比例(0到1) layer_ratio = i / (floor(height/h_step) - 1); // 计算当前层的凸起幅度(可自定义变化曲线) current_amplitude = amplitude * (1 + layer_ratio); // 计算当前层的缩放比例(对应原linear_extrude的scale参数) current_scale = 1 + (scale_factor - 1) * layer_ratio; // 当前层的Z轴位置 z_pos = i * h_step; translate([0, 0, z_pos]) { linear_extrude(height = h_step, scale = current_scale) { difference() { periodic_envelope(da, r, num_bumps, peak_width, current_amplitude); periodic_envelope(da, r-thickness, num_bumps, peak_width, current_amplitude); } } } }
关键说明
- 用循环索引
i作为层级标识,通过layer_ratio将其转换为0到1的比例值,方便调整幅度的变化趋势(线性、非线性均可修改公式实现)。 h_step控制每层的高度,值越小生成的实体越平滑,但会增加渲染时间和内存占用,可按需调整。- 保留了原代码的
scale效果,通过current_scale实现随高度逐渐缩放的逻辑。
内容的提问来源于stack exchange,提问作者Dov
相关产品推荐
相关产品推荐

