Fold:3D 折叠后的图纸
POST /fold 使用给定的值运行模板,并按照 ParametrIQ 3D 视图的方式、使用同一引擎将其折叠:切割线切出各个面板,压痕线(以及打孔线、半切线和 V 形切割)将它们折叠。纸板的厚度等于模板的 T 变量(材料的厚度,由材料集给出),如果没有该变量,则为半毫米。
结果以网格形式返回,可直接用 WebGL、three.js、游戏引擎或任何能绘制三角形的工具进行绘制,涵盖从平展(0)到折叠完成(1)的若干步骤。您可以自行在两个步骤之间插值以实现平滑动画:
Viewer 正是这样做的。请求正文为一个模板(作为 template 发送,或作为 source 从您的某个存储中读取)以及其带标签变量的 values,详见 API 页面;还可以选择提供 steps:要返回的折叠值数量,2 到 33(未给出时为 9),以及 appearance:外观,即
GET /appearances 中某个外观的 id("denim"、"corrugated-bc-kraft"、"stainless-brushed" …)。未给出时,使用与图纸材料(其 T 选项,"BC double wall (7 mm)")对应的外观,否则使用普通白色纸板。
返回内容
| 字段 | 说明 |
|---|---|
steps |
生成网格所用的折叠值,从 0 到 1。折叠较慢的设计(弯曲的压痕线在每一步都会使纸张弯曲)得到的步骤较少;最后一个始终为 1。 |
thickness |
纸板的厚度,采用图纸的单位。 |
target、cameraDistance |
观察的位置(设计的中心,x y z)以及观察距离。 |
floorZ |
地面的位置,恰好位于平展的展开料下方。Z 轴朝上。 |
sun |
太阳的位置(x、y、z)、其阴影贴图覆盖的半径,以及地面的宽度。 |
net |
平面展开图的最小 x、y、宽度和高度:各面的纹理坐标覆盖此范围。 |
look |
外观信息:外观的 id、name 以及选用它的 material;registers,即 3D 着色器的外观寄存器(每个四个浮点数,从寄存器 register 开始),与 Viewer 和 ParametrIQ 3D 视图的用法相同;seeThrough 以及此类材料投射的着色 shadow;以及它引用的 images。 |
creases |
每个步骤中,凹槽显示在内侧的压痕线:float32 数值 a.x、a.y、b.x、b.y 的 base64 编码,位于展开图中。 |
meshes |
每个网格:其 name、kind(Panel、Fillet 或 Flex)、是否为 doubleSided、其 shapes、其在每个步骤中的位置,以及其 parent:即它相对转动的网格(meshes 中的索引,无父网格时为 −1)。 |
warnings |
无法按图纸折叠的内容。 |
网格的每个 shapes 都是一个三角形列表(无索引):
positions:每个顶点的小端序 float32 x、y、z 的 base64 编码;normals:每个顶点的 int8 x、y、z 的 base64 编码,每个分量 ×127;uvs:每个顶点的 float32 u、v 的 base64 编码:面在net中的位置(0 到 1),边则为沿边的距离以及进入纸板的深度(除以两倍厚度);edge(仅限瓦楞纸板和蜂窝纸板):float32 的 base64 编码,每个顶点七个:着色器绘制切割边缘所需的楞型和蜂窝单元数据;groups:起始顶点、顶点数和材料组(0 为内侧,1 为外侧,2 为边缘),每三个一组。
其每个 steps(每个折叠值一个)给出该步骤中的 matrix(一个 4×4 矩阵,按行排列,作用于列向量)、所用的 shape(无则为 −1)以及是否 visible。在步骤之间不变的形状只发送一次。
要绘制位于步骤 a 与 b 之间的折叠值 f,请先放置父网格。对于带有 parent 的网格,取其在每个步骤中相对于父网格的矩阵(父网格矩阵的逆乘以其自身矩阵),以螺旋运动在这两者之间插值(将从一个到另一个的转动视为绕一条固定轴的转动加上沿该轴的滑动,按比例取其一部分),并将结果应用到父网格在 f 处的位置上。这样,面板会绕其铰链转动,并始终保持在其折叠线上。(如果单独混合每个世界矩阵,即位置按直线插值、旋转按
slerp 插值,面板在步骤之间会偏离其铰链:在纸盒上可达数十毫米。)没有父网格的网格同样以螺旋运动在其两个矩阵之间插值。如果其两个形状不同但顶点数相同,还需混合其位置。每条压痕线从平展到折叠完成只占其中一段,依次折叠,因此步骤越多,越能贴近折叠顺序。
如果图纸中没有可折叠的内容(没有切割线),则返回无内容(204)。
示例
POST /fold
X-API-KEY: your-api-key
Content-Type: application/json
{
"template": "…a carton's drawing text…",
"values": { "L": 120, "W": 60, "D": 180 },
"steps": 5
}
{
"steps": [0, 0.25, 0.5, 0.75, 1],
"thickness": 0.45,
"target": [100.8, 75.4, 31.2],
"cameraDistance": 420.5,
"floorZ": -0.425,
"sun": [281.1, -158.8, 772.4, 220.3, 1056.2],
"net": [-12, -98.5, 210.4, 330],
"look": { "id": "gc2-board", "name": "GC2 folding boxboard, white back", "material": "Folding boxboard 0.45 mm",
"register": 35, "registers": [0, -1, 0.45, 0, …], "seeThrough": false, "shadow": [0, 0, 0, 0, 0.003], "images": [] },
"creases": [ "AAAAAA…", … ],
"meshes": [
{
"name": "s0", "kind": "Panel", "doubleSided": false,
"shapes": [ { "positions": "AAAAAAAA…", "normals": "AAB/AAB/…", "uvs": "AAAAAA…", "groups": [0, 6, 0, 6, 6, 1, 12, 558, 2] } ],
"steps": [ { "matrix": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], "shape": 0, "visible": true }, … ],
"parent": -1
},
…
],
"warnings": []
}
一个典型纸盒在 9 个步骤下约为 1 MB 的 JSON,压缩后约为其十分之一:请请求压缩传输(Accept-Encoding: br, gzip)。
另请参阅:API、Appearances、Measure、Viewer。