在 TS 中使用 Manifold 建模

一 Manifold 是什么

1.1 简介

Manifold 是一个几何处理库,专注于高效、可靠的布尔运算和几何操作。它主要用于3D建模和计算几何领域,提供了高性能的几何算法,适用于需要精确几何计算的应用场景。

1.2 主要特点

  1. 高效的布尔运算:Manifold 提供了高效的布尔运算功能,包括并集(Union)、交集(Intersection)和差集(Difference)。这些运算可以用于创建复杂的几何形状。
  2. 几何修复和优化:Manifold 可以修复和优化几何体,确保几何体的拓扑结构正确,并提高几何体的质量。
  3. 多种几何操作:Manifold 支持多种几何操作,如平滑、细分、简化等,可以用于修改和优化几何体。
  4. 高精度几何计算:Manifold 提供高精度的几何计算,适用于需要精确结果的应用,如3D打印、CAD设计等。

1.3 应用场景

  1. 3D建模和设计:用于创建和编辑三维模型。
  2. CAD/CAM(计算机辅助设计/制造):用于设计和制造复杂的机械零件和装配。
  3. 科学计算和仿真:用于模拟和分析复杂的几何形状。
  4. 游戏开发:用于生成和处理游戏中的三维场景和物体。
  5. 虚拟/增强现实(V/AR):用于创建虚拟和增强现实环境中的三维对象。

1.4 优势

  1. 高效性:Manifold提供了高效的几何算法,能够快速处理复杂的几何运算。
  2. 可靠性:Manifold专注于精确的几何计算,确保结果的准确性和可靠性。
  3. 易用性:Manifold提供了简洁的API,易于集成和使用。

二 在 TS 中引用

Manifold 是一个开源的C++项目,github地址:https://github.com/elalish/manifold 也编译发版了 JS 和 python 版本,在 TypeScript 项目中,可以通过 npm 安装,npm包地址:https://www.npmjs.com/package/manifold-3d

本文将详细介绍如何在 Visual Studio Code (VSCode) 中配置一个 TypeScript 项目,并使用 Manifold 几何库进行建模。

1. 安装 Node.js 和 npm

首先,确保你已经安装了 Node.js 和 npm(Node Package Manager)。你可以从 Node.js 官网 下载并安装最新版本。

2. 初始化 npm 项目

在你的项目目录中打开终端,然后运行以下命令来初始化一个新的 npm 项目:

bash 复制代码
npm init -y

这将创建一个 package.json 文件,其中包含项目的基本信息。

3. 安装 TypeScript 和 Manifold

接下来,安装 TypeScript 和 manifold-3d 包:

bash 复制代码
npm install typescript --save-dev
npm install manifold-3d

4. 创建 tsconfig.json 文件

在项目根目录下创建一个 tsconfig.json 文件,这是 TypeScript 的配置文件。你可以使用以下命令自动生成一个默认的 tsconfig.json 文件:

bash 复制代码
npx tsc --init

然后编辑 tsconfig.json 文件,确保配置如下:

json 复制代码
{
  "compilerOptions": {
    "target": "es6",                          // 指定 ECMAScript 目标版本
    "module": "NodeNext",                     // 指定模块系统
    "strict": true,                           // 启用所有严格类型检查选项
    "esModuleInterop": true,                  // 启用与 ES 模块的互操作性
    "skipLibCheck": true,                     // 跳过声明文件的类型检查
    "forceConsistentCasingInFileNames": true, // 强制文件名一致
    "outDir": "./dist",                       // 输出目录
    "rootDir": "./src",                       // 输入目录
    "moduleResolution": "NodeNext"            // 模块解析策略
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

5. 创建项目结构

在项目根目录下创建一个 src 文件夹,并在其中创建一个示例 TypeScript 文件,例如 index.ts

typescript 复制代码
// src/index.ts
import Module, { ManifoldToplevel } from 'manifold-3d';

async function init() {
    // 初始化 Manifold
    const model: ManifoldToplevel = await Module();

    // 调用 setup 函数进行初始化,配置 WASM 模块、设置默认参数或执行其他初始化任务
    model.setup();

    await getModel(model);
}
init().catch(console.error);

async function getModel(model: ManifoldToplevel) {

    const { CrossSection } = model;
    const { cube, sphere } = model.Manifold;

    // 创建一个边长为100的立方体,中心对齐
    const box = cube([100, 100, 100], true);
    // 创建一个半径为60的球体,细分级别为100
    const ball = sphere(60, 100);
    // 对立方体进行布尔减法运算,减去球体
    const result = box.subtract(ball);
    // 平移结果几何体
    const movedResult = result.translate([50, 0, 0]);
    // 旋转结果几何体
    const rotatedResult = result.rotate(Math.PI / 4, [0, 1, 0]);
    // 缩放结果几何体
    const scaledResult = result.scale([2, 2, 2]);

    // 获取几何体的网格
    const mesh = result.getMesh();

    // 获取几何体的属性
    let prop = result.getProperties();

    console.log('mesh:', mesh);
    console.log('Vertices:', mesh.vertProperties);
    console.log('Indices:', mesh.triVerts);
    console.log('Volume:', prop.volume);
    console.log('Surface Area:', prop.surfaceArea);
    console.log('genus:', result.genus());

    // 定义一个矩形截面
    const vertices = [
        [0, 0],
        [100, 0],
        [100, 50],
        [0, 50]
    ];
    const edges = [
        [0, 1],
        [1, 2],
        [2, 3],
        [3, 0]
    ];

    // 创建截面
    const crossSection = new CrossSection(vertices, edges);

    // 拉伸截面生成一个三维几何体
    const extrudedShape = crossSection.extrude(100);

    // 旋转截面生成一个三维几何体
    const revolvedShape = crossSection.revolve(Math.PI * 2, [0, 0, 1]);

    console.log('Extruded Shape:', extrudedShape);
    console.log('Revolved Shape:', revolvedShape);
}

6. 配置 VSCode

确保你已经安装了 VSCode 的 TypeScript 插件。通常,VSCode 自带 TypeScript 支持,但你可以安装额外的插件来增强体验,例如:

  • ESLint
  • Prettier - Code formatter

7. 添加构建脚本

package.json 文件中添加一个构建脚本,以便你可以轻松地编译 TypeScript 代码:

json 复制代码
{
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js"
  }
}

8. 编译和运行

在终端中运行以下命令来编译 TypeScript 代码:

bash 复制代码
npm run build

编译完成后,你可以运行以下命令来执行生成的 JavaScript 代码:

bash 复制代码
npm start

通过以上步骤,你应该能够在 TypeScript 项目中成功使用 Manifold 几何库进行建模。

9. 接口说明

Manifold 提供了一系列接口用于创建和操作几何体,以下是一些常见的建模接口和功能。

9.1 基本几何体创建

  • cube:创建一个立方体。
JavaScript 复制代码
const box = cube([width, height, depth], center);
  • width, height, depth:立方体的尺寸。

  • center:是否中心对齐(布尔值)。

  • sphere:创建一个球体。

JavaScript 复制代码
const ball = sphere(radius, segments);
  • radius:球体的半径。

  • segments:球体的细分级别。

  • cylinder:创建一个圆柱体。

JavaScript 复制代码
const cyl = cylinder(radius, height, segments, center);
  • radius:圆柱体的半径。

  • height:圆柱体的高度。

  • segments:圆柱体的细分级别。

  • center:是否中心对齐(布尔值)。

  • cone:创建一个圆锥体。

JavaScript 复制代码
const cone = cone(baseRadius, topRadius, height, segments, center);
  • baseRadius:底部半径。

  • topRadius:顶部半径。

  • height:圆锥体的高度。

  • segments:圆锥体的细分级别。

  • center:是否中心对齐(布尔值)。

  • CrossSection:创建一个截面对象。

JavaScript 复制代码
const crossSection = new CrossSection(vertices, edges);
  • vertices:二维坐标的数组,每个顶点由 [x, y] 坐标对表示。
  • edges:边是顶点索引的数组,每个边由两个顶点索引对表示。

9.2 布尔运算

  • subtract:布尔减法运算。
JavaScript 复制代码
const result = shape1.subtract(shape2);
  • shape1:被减的几何体。

  • shape2:减去的几何体。

  • union:布尔并集运算。

JavaScript 复制代码
const result = shape1.union(shape2);
  • shape1:第一个几何体。

  • shape2:第二个几何体。

  • intersect:布尔交集运算。

JavaScript 复制代码
const result = shape1.intersect(shape2);
  • shape1:第一个几何体。
  • shape2:第二个几何体。

9.3 变换操作

  • translate:平移几何体。
JavaScript 复制代码
const movedShape = shape.translate([dx, dy, dz]);
  • dx, dy, dz:平移的距离。

  • rotate:旋转几何体。

JavaScript 复制代码
const rotatedShape = shape.rotate(angle, [ax, ay, az]);
  • angle:旋转的角度(弧度)。

  • ax, ay, az:旋转轴。

  • scale:缩放几何体。

JavaScript 复制代码
const scaledShape = shape.scale([sx, sy, sz]);
  • sx, sy, sz:缩放比例。

9.4 建模操作

  • extrude:拉伸几何体。
JavaScript 复制代码
const extrudedShape = shape.extrude(height);
  • height:拉伸的高度。

  • revolve:旋转生成几何体。

JavaScript 复制代码
const revolvedShape = shape.revolve(angle, [ax, ay, az]);
  • angle:旋转的角度(弧度)。

  • ax, ay, az:旋转轴。

  • loft:放样生成几何体。

JavaScript 复制代码
const loftedShape = loft([shape1, shape2, ...]);
  • shape1, shape2, ...:用于放样的截面几何体。

9.5 几何属性查询

  • volume:计算几何体的体积。
JavaScript 复制代码
const vol = shape.getProperties().volume;
  • surfaceArea:计算几何体的表面积。
JavaScript 复制代码
const area = shape.getProperties().surfaceArea;
  • mesh:计算几何体的网格。
JavaScript 复制代码
const mesh = shape.getMesh();

在线测试网站 manifoldcad:https://manifoldcad.org/

相关推荐
慧都科技3D1 天前
3D开发工具HOOPS助力3D制造业仿真应用实现工厂环境规划和模拟!
3d·3d web轻量化·3d建模·3d模型轻量化·三维模型格式转换·3d模型格式转换·cad数据格式转换
慧都科技3D10 天前
从移动、桌面端到AR/VR:HOOPS Visualize如何实现卓越的3D模型可视化?
3d·3d建模·vr·三维模型格式转换·3d模型格式转换·cad数据格式转换·3d模型可视化
慧都科技3D22 天前
3个真实案例!带你了解3D模型格式转换工具在3D打印软件中的强势应用!
3d·3d web轻量化·hoops·3d建模·三维模型格式转换·3d模型格式转换·cad数据格式转换
mirrornan1 个月前
51建模网3D编辑器:一键为3D模型设置特殊材质
3d·编辑器·3d建模·材质·51建模网·模型材质
远洋之帆1 个月前
MotionEditor_ 通过内容感知扩散编辑视频运动
人工智能·深度学习·aigc·音视频·计算几何
慧都科技3D1 个月前
3D开发工具HOOPS在BIM系统中的应用
3d·hoops·3d建模·3d模型轻量化·三维模型格式转换·3d模型格式转换·bim开发
慧都科技3D2 个月前
3D Web轻量化引擎HOOPS Communicator如何处理DWG文件中的图纸?
3d web轻量化·hoops·3d建模·3d模型轻量化·三维模型格式转换·3d模型格式转换·3d模型可视化
慧都科技3D2 个月前
HOOPS Exchange导入数据时如何使用CATIA缓存选项?
3d·3d web轻量化·hoops·3d建模·三维模型格式转换·3d模型格式转换·3d数据发布
eggcode2 个月前
【NetTopologySuite类库】计算三点所在平面的法向量
平面·c#·计算几何