You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:51:05