Bitbybit Docs
    Preparing search index...

    Class ManifoldOperations

    布尔运算之外更改 Manifold 实体的方法:用凸包包裹它们,通过切片和投影得到横截面,细化和平滑其网格,简化它们,组合和分解它们,以及将法线和曲率计算到顶点属性通道中。属性通道是存储在网格上的每个顶点一个数值,例如法线的三个通道。每个方法都返回新实体。

    Index

    Constructors

    adjustments

    • 根据网格为每个顶点计算法线,并将其存储在从 normalIdx 开始的三个属性通道中。

      minSharpAngle(以度为单位)更锐利的边在两侧保留各自的法线并保持锐利;为 0 时每个三角形保留自己的法线。由多个三角形组成的平面保持平坦。

      Parameters

      Returns Promise<ManifoldPointer>

      存储了法线的实体

      const withNormals = await bitbybit.manifold.manifold.operations.calculateNormals({ manifold: shape, normalIdx: 0, minSharpAngle: 60 });
      
    • 计算曲面在每个顶点处的弯曲强度并存储在属性通道中:高斯曲率存于 gaussianIdx,平均曲率存于 meanIdx

      曲率是弯曲半径的倒数,曲面凸处为正,凹处为负;小于 0 的索引跳过该通道。

      Parameters

      Returns Promise<ManifoldPointer>

      存储了曲率的实体

      const withCurvature = await bitbybit.manifold.manifold.operations.calculateCurvature({ manifold: shape, gaussianIdx: 0, meanIdx: 1 });
      
    • 向平滑过的实体添加三角形,直到其网格的每个点都位于距光滑曲面 tolerance 以内,因此弯曲剧烈的区域比平坦区域获得更多三角形。

      只有用 smoothOutsmoothByNormals 平滑过的实体会改变;其他任何实体以副本返回。

      Parameters

      Returns Promise<ManifoldPointer>

      细化后的实体

      const finer = await bitbybit.manifold.manifold.operations.refineToTolerance({ manifold: smoothed, tolerance: 0.01 });
      
    • 通过将每条边分割成大致给定长度的段来向实体添加三角形,并添加内部顶点以保持三角形均匀。

      在用 smoothOutsmoothByNormals 平滑过的实体上,新顶点移到光滑曲面上;否则曲面保持原样。

      Parameters

      Returns Promise<ManifoldPointer>

      细化后的实体

      const finer = await bitbybit.manifold.manifold.operations.refineToLength({ manifold: smoothed, length: 0.5 });
      
    • 通过将每条边分成 number 段来向实体添加三角形;为 2 时每个三角形变成四个。

      在用 smoothOutsmoothByNormals 平滑过的实体上,新顶点移到光滑曲面上;否则新三角形保持平坦。

      Parameters

      Returns Promise<ManifoldPointer>

      细化后的实体

      const finer = await bitbybit.manifold.manifold.operations.refine({ manifold: smoothed, number: 2 });
      
    • 通过从其三角形计算切线将实体标记为平滑,使后续的 refinerefineToLength 将新三角形弯成光滑曲面。

      minSharpAngle(以度为单位)更锐利的边保持锐利;minSmoothness 大于 0 时将这些边稍微倒圆,为 1 时平滑一切。几何本身在细化之前不会改变。

      Parameters

      Returns Promise<ManifoldPointer>

      带有平滑切线的实体

      const smoothed = await bitbybit.manifold.manifold.operations.smoothOut({ manifold: cube, minSharpAngle: 60, minSmoothness: 0 });
      const rounded = await bitbybit.manifold.manifold.operations.refineToLength({ manifold: smoothed, length: 0.5 });
    • 使用存储在其顶点属性中的法线将实体标记为平滑,使后续的 refinerefineToLength 将新三角形弯成光滑曲面。

      normalIdx 是三个法线通道中的第一个,与 calculateNormals 存储的一致;顶点上的法线不一致处,边保持锐利。

      Parameters

      Returns Promise<ManifoldPointer>

      带有平滑切线的实体

      const smoothed = await bitbybit.manifold.manifold.operations.smoothByNormals({ manifold: withNormals, normalIdx: 0 });
      
    • 从实体的网格中移除顶点,同时使每个曲面保持在距原位 tolerance 以内,以减少三角形数量。

      结果保留原始顶点的子集;实体自身的容差值保持不变。

      Parameters

      Returns Promise<ManifoldPointer>

      简化后的实体

      const lighter = await bitbybit.manifold.manifold.operations.simplify({ manifold: shape, tolerance: 0.05 });
      
    • 用一个函数重写实体的顶点属性,该函数接收每个顶点的位置和旧属性并填入新属性。

      numProp 设置之后每个顶点有多少个属性,因此可以添加或删除通道;读取超过旧数量或写入超过新数量的行为是未定义的。

      Parameters

      Returns Promise<ManifoldPointer>

      带有新属性的实体

      const colored = await bitbybit.manifold.manifold.operations.setProperties({
      manifold: shape,
      numProp: 3,
      propFunc: (newProp, position) => { newProp[0] = position[0]; newProp[1] = position[1]; newProp[2] = position[2]; },
      });

    basic

    • 为实体赋予新的容差,即它允许携带的舍入误差,并在容差增大时简化其网格。

      比容差更薄的三角形被视为退化并移除。

      Parameters

      Returns Promise<ManifoldPointer>

      带有新容差的实体

      const coarser = await bitbybit.manifold.manifold.operations.setTolerance({ manifold: shape, tolerance: 0.01 });
      
    • 预留连续 count 个唯一网格 id 并返回第一个,用于标记在后续操作之后仍能再次找到的三角形集合。

      在由网格构建实体之前将它们赋给网格的 runOriginalID,例如用于区分多种材质。

      Parameters

      Returns Promise<number>

      保留 id 中的第一个;其余依次递增

      const firstId = await bitbybit.manifold.manifold.operations.reserveIds({ count: 2 });
      
    • 创建实体的一个算作新原始体的副本,使该副本可以携带自己的顶点属性(例如不同的 UV 映射),并与其构建来源区分开。

      过程中共面的面被合并,它们之间的边被折叠;当这些边必须保留时,请改用网格途径。

      Parameters

      Returns Promise<ManifoldPointer>

      标记为原始的副本

      const original = await bitbybit.manifold.manifold.operations.asOriginal({ manifold: shape });
      

    composition

    • 将多个实体打包成一个,是 decompose 的逆操作。

      重叠的实体会像布尔并集那样被融合;保持分离的实体则作为同一结果的独立部分保留。

      Parameters

      Returns Promise<ManifoldPointer>

      容纳所有实体的一个实体

      const packed = await bitbybit.manifold.manifold.operations.compose({ manifolds: [cube, sphere] });
      
    • 将实体拆分为其分离的、不相连的各块,是 compose 的逆操作。

      完整一块的实体以只含一个副本的列表返回。

      Parameters

      Returns Promise<ManifoldPointer[]>

      分离出的各个部分

      const pieces = await bitbybit.manifold.manifold.operations.decompose({ manifold: packed });
      

    cross sections

    • 用与 XY 平面平行、位于给定 Z 高度的平面切割实体,并以横截面返回平面截面。

      位于实体包围盒底部的高度给出其底面;位于顶部的高度给出空横截面。

      Parameters

      Returns Promise<CrossSectionPointer>

      以横截面表示的截面

      const section = await bitbybit.manifold.manifold.operations.slice({ manifold: sphere, height: 2 });
      

    hulls

    • 将实体包裹在其凸包中,即包含它、没有凹陷的最小形状,就像紧紧包在它上面的收缩膜。

      Parameters

      Returns Promise<ManifoldPointer>

      凸包

      const wrapped = await bitbybit.manifold.manifold.operations.hull({ manifold: shape });
      
    • 将点、实体或两者的混合包裹在一个凸包中,即包含它们全部、没有凹陷的最小形状。

      Parameters

      Returns Promise<ManifoldPointer>

      凸包

      const wrapped = await bitbybit.manifold.manifold.operations.hullPoints({ points: [[0, 0, 0], [10, 0, 0], [0, 10, 0], [0, 0, 10]] });