小白教程
所有教程
关于
Search
172.71.254.57
172.71.254.57
参数设置
贡献
退出
操作
编辑
移动
保护
信息
历史
删除
查看“OpenSCAD 使用数学公式和基本几何创建模型”的源代码
本页内容
上一节:
OpenSCAD_将2D形状挤压成3D对象
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
== 在 OpenSCAD 中进行数学计算 == 到目前为止,您已经了解到 OpenSCAD 变量在整个脚本执行过程中只能保存一个值,即分配给它们的最后一个值。您还了解到 OpenSCAD 变量的常见用途是提供模型的参数化。在这种情况下,每个参数化模型都会有一些自变量,您可以更改其值以调整该模型。这些变量通常直接赋值,如下例所示。 <sample title="" desc=""> … wheel_diameter = 12; … body_length = 70; … wheelbase = 40; … // etc. … </sample> 您已经看过几次但没有明确提及的另一件事是使用脚本中的变量和硬编码值执行数学运算的能力。这方面的一个例子是实现汽车的轴距。回想一下,汽车的车轴和车轮沿 X 轴平移并远离原点轴距值的一半。由于在这种情况下,轴距是一个已经在脚本中定义的变量,您可以通过将轴距变量除以 2 来计算单位数量。对轨道变量进行了类似的操作,以放置汽车的左右轮。回想一下,左轮和右轮沿 Y 轴平移并远离原点,距离轨道值的一半。 <sample title="axle_with_wheelset.scad " desc=""> use <vehicle_parts.scad> $fa = 1; $fs = 0.4; wheelbase = 40; track = 35; translate([-wheelbase/2, track/2]) simple_wheel(); translate([-wheelbase/2, -track/2]) simple_wheel(); translate([-wheelbase/2, 0, 0]) axle(track=track); </sample> [[文件:Axle with wheelset.jpg]] 加法、减法、乘法和除法在 OpenSCAD 中用符号 +、-、* 和 / 表示。除了这些基本运算之外,还有一些额外的数学运算在构建更复杂的模型时很有用。这方面的两个示例是用于定义汽车圆形图案的余弦和正弦函数。具体来说,您使用 cosine 和 sine 函数将每辆车的极坐标转换为笛卡尔坐标,以便将其平移到适当的位置。cheatsheet里面找到其他函数<ref>https://openscad.org/cheatsheet/index.html</ref>。 <sample title="circular_pattern_of_cars.scad " desc=""> … r = 140; // pattern radius n = 12; // number of cars step = 360/n; for (i=[0:step:359]) { angle = i; dx = r*cos(angle); dy = r*sin(angle); translate([dx,dy,0]) rotate([0,0,angle]) car(); } … </sample> [[文件:Circular pattern of cars.jpg]] 在上述情况下,您不仅在脚本中使用了可用的数学运算,而且还定义了两个附加变量 dx 和 dy 来存储计算结果,以提高脚本的可读性。这也可以在您的汽车模型中完成。以以下车型为例。 <sample title="car.scad " desc=""> use <vehicle_parts.scad> $fa = 1; $fs = 0.4; wheelbase = 40; track = 35; // Body body(); // Front left wheel translate([-wheelbase/2,-track/2,0]) simple_wheel(); // Front right wheel translate([-wheelbase/2,track/2,0]) simple_wheel(); // Rear left wheel translate([wheelbase/2,-track/2,0]) simple_wheel(); // Rear right wheel translate([wheelbase/2,track/2,0]) simple_wheel(); // Front axle translate([-wheelbase/2,0,0]) axle(track=track); // Rear axle translate([wheelbase/2,0,0]) axle(track=track); </sample> 在上述模型中,数学运算用于计算每个车轮和车轴沿 X 和 Y 轴所需的平移量。 [[文件:Car model.jpg]] == 使用多边形图元创建任何 2D 对象 == 除了圆形和方形 2D 基元之外,还有另一个基元可以让您设计几乎任何 2D 对象。这是多边形图元,它允许您通过提供包含其点坐标的列表来定义 2D 对象。假设您要设计以下 2D 零件。 [[文件:Profile 1 drawing.jpg]] 在不使用多边形图元的情况下设计该零件的一种方法是从与该零件的外部尺寸相对应的正方形开始,然后从其右上角减去正确旋转和平移的正方形。计算适当的旋转角度和平移量将是一项耗时的任务。此外,不可能对更复杂的对象遵循这种策略。相反,您可以通过以下方式使用多边形图元创建此对象。 <sample title="profile_1_polygon.scad " desc=""> p0 = [0, 0]; p1 = [0, 30]; p2 = [15, 30]; p3 = [35, 20]; p4 = [35, 0]; points = [p0, p1, p2, p3, p4]; polygon(points); </sample> [[文件:Profile 1 polygon.jpg]] 关于polygon的使用,您应该注意一些事项。polygon使用点列表作为输入。点或顶点使用 X 和 Y 坐标对表示,并按顺序提供。定义列表时,您可以从您喜欢的任何顶点开始,您可以按顺时针或逆时针顺序遍历它们。在上面的示例中,第一个顶点位于原点 (0,0),而其余顶点按顺时针方向列出。所有顶点(X 和 Y 坐标对)p0、p1、...、p4 都放置在名为 points 的列表中。然后将此列表传递给多边形命令以创建相应的对象。 无论变量只有一个值还是值列表,您都可以使用 echo 命令在控制台上打印其内容。 控制台中的输出为:[[0, 0], [0, 30], [15, 30], [35, 20], [35, 0]] 不需要单独命名每个点(p0、p1、...),但建议更好地跟踪您的设计。您也可以直接定义要传递给多边形命令的点列表。 <sample title="" desc=""> … points = [[0, 0], [0, 30], [15, 30], [35, 20], [35, 0]]; … </sample> 您还可以根据给定的尺寸参数化点坐标的定义,这将使您能够快速修改对象的尺寸。这可以通过为每个给定维度引入一个变量并使用适当的数学表达式定义点的坐标来实现。 <sample title="profile_1_polygon_parametric.scad " desc=""> // Given dimensions d1 = 15; d2 = 20; h1 = 20; h2 = 10; // Points p0 = [0, 0]; p1 = [0, h1 + h2]; p2 = [d1, h1 + h2]; p3 = [d1 + d2, h1]; p4 = [d1 + d2, 0]; points = [p0, p1, p2, p3, p4]; // Polygon polygon(points); </sample> == 新的小车 == 是时候使用你的新技能来创造赛车的车身了! [[文件:Racing car.jpg]] 使用多边形命令创建上述车身。为此,您必须定义设计的每个点,将它们全部添加到列表中并将此列表传递给多边形命令。每个点的坐标的定义应该是相对于给定尺寸的参数化。请记住,为了做到这一点,您必须为每个给定尺寸定义一个变量,并使用适当的数学表达式从这些变量中计算每个点的坐标。您应该将创建的 2D 轮廓拉伸到 14 个单位的高度。 [[文件:1360px-Racing car body drawing.jpg]] <sample title="racing_car_body.scad " desc=""> // model parameters d1=30; d2=20; d3=20; d4=10; d5=20; w1=15; w2=45; w3=25; h=14; // right side points p0 = [0, w1/2]; p1 = [d1, w1/2]; p2 = [d1 + d2, w2/2]; p3 = [d1 + d2 + d3, w2/2]; p4 = [d1 + d2 + d3 + d4, w3/2]; p5 = [d1 + d2 + d3 + d4 + d5, w3/2]; // left side points p6 = [d1 + d2 + d3 + d4 + d5, -w3/2]; p7 = [d1 + d2 + d3 + d4, -w3/2]; p8 = [d1 + d2 + d3, -w2/2]; p9 = [d1 + d2, -w2/2]; p10 = [d1, -w1/2]; p11 = [0, -w1/2]; // all points points = [p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11]; // extruded body profile linear_extrude(height=h) polygon(points); </sample> <sample title="" desc="尝试通过将剩余的对象添加到上述车身来完成赛车设计。 "> use <vehicle_parts.scad> $fa = 1; $fs = 0.4; // model parameters d1=30; d2=20; d3=20; d4=10; d5=20; w1=15; w2=45; w3=25; h=14; track=40; // distances to lengths l1 = d1; l2 = d1 + d2; l3 = d1 + d2 + d3; l4 = d1 + d2 + d3 + d4; l5 = d1 + d2 + d3 + d4 + d5; // right side points p0 = [0, w1/2]; p1 = [l1, w1/2]; p2 = [l2, w2/2]; p3 = [l3, w2/2]; p4 = [l4, w3/2]; p5 = [l5, w3/2]; // left side points p6 = [l5, -w3/2]; p7 = [l4, -w3/2]; p8 = [l3, -w2/2]; p9 = [l2, -w2/2]; p10 = [l1, -w1/2]; p11 = [0, -w1/2]; // all points points = [p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11]; // extruded body profile linear_extrude(height=h) polygon(points); // canopy translate([d1+d2+d3/2,0,h]) resize([d2+d3+d4,w2/2,w2/2]) sphere(d=w2/2); // axles l_front_axle = d1/2; l_rear_axle = d1 + d2 + d3 + d4 + d5/2; half_track = track/2; translate([l_front_axle,0,h/2]) axle(track=track); translate([l_rear_axle,0,h/2]) axle(track=track); // wheels translate([l_front_axle,half_track,h/2]) simple_wheel(wheel_width=10); translate([l_front_axle,-half_track,h/2]) simple_wheel(wheel_width=10); translate([l_rear_axle,half_track,h/2]) simple_wheel(wheel_width=10); translate([l_rear_axle,-half_track,h/2]) simple_wheel(wheel_width=10); </sample>
返回至“
OpenSCAD 使用数学公式和基本几何创建模型
”。
上一节:
OpenSCAD_将2D形状挤压成3D对象