如何用Julia和Makie创建带轻微圆角的实心立方体?
解决Makie生成带圆角无孔洞立方体的问题
问题描述
使用Julia的Makie库生成的立方体带有孔洞,希望消除孔洞,生成接近真实立方体形状、仅保留轻微圆角和圆角边的效果。原代码尝试修改指数值、直接传入range给volume!均无效。
原代码问题分析
原代码中计算立方体的公式x.^2 + y.^2 + z.^2本质是球体的距离函数,用等值面提取时自然会出现中心孔洞。要生成圆角立方体,需要使用符合立方体形状的有符号距离场(SDF)公式。
修改后的代码
using Makie, GLMakie fig = Figure() range = LinRange(-1.2, 1.2, 120) # 扩大范围避免圆角被截断 # 圆角立方体的有符号距离场公式 rounded_cube = [ let # 基础立方体范围:|x|,|y|,|z| ≤ 1 d = max(abs(x)-1, abs(y)-1, abs(z)-1) # 圆角处理:r控制圆角半径,值越大圆角越明显 r = 0.15 max(d, 0) + min(max(d, 0), 0) - r + sqrt(max(d^2, r^2)) end for x = range, y = range, z = range ] ax = Axis3(fig[1,1], aspect = :data, azimuth = 1.17π, viewmode = :fit, title = "带圆角的立方体") volume!(rounded_cube, algorithm = :iso, isovalue = 0.0, isorange = 0.02) fig
代码说明
- 距离场公式:采用圆角立方体的标准SDF(有符号距离场),通过调整
r值可以控制圆角的大小,数值越大圆角越突出。 - 范围调整:将LinRange从
-1,1扩大到-1.2,1.2,避免圆角部分超出采样范围被截断。 - 等值面参数:将
isovalue设为0,因为SDF中0值对应物体表面,这样能准确提取出带圆角的立方体表面。
内容的提问来源于stack exchange,提问作者user3134725
相关产品推荐
相关产品推荐

