在 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 项目:

npm init -y

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

3. 安装 TypeScript 和 Manifold

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

npm install typescript --save-dev
npm install manifold-3d

4. 创建 tsconfig.json 文件

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

npx tsc --init

然后编辑 tsconfig.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

// src/index.ts
import Module, { ManifoldToplevel } from 'manifold-3d';async function init() {// 初始化 Manifoldconst 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的球体,细分级别为100const 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 代码:

{"scripts": {"build": "tsc","start": "node dist/index.js"}
}

8. 编译和运行

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

npm run build

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

npm start

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

9. 接口说明

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

2.1 基本几何体创建

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

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

  • sphere:创建一个球体。

const ball = sphere(radius, segments);
  • radius:球体的半径。

  • segments:球体的细分级别。

  • cylinder:创建一个圆柱体。

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

  • height:圆柱体的高度。

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

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

  • cone:创建一个圆锥体。

const cone = cone(baseRadius, topRadius, height, segments, center);
  • baseRadius:底部半径。

  • topRadius:顶部半径。

  • height:圆锥体的高度。

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

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

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

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

2.2 布尔运算

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

  • shape2:减去的几何体。

  • union:布尔并集运算。

const result = shape1.union(shape2);
  • shape1:第一个几何体。

  • shape2:第二个几何体。

  • intersect:布尔交集运算。

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

2.3 变换操作

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

  • rotate:旋转几何体。

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

  • ax, ay, az:旋转轴。

  • scale:缩放几何体。

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

2.4 建模操作

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

  • revolve:旋转生成几何体。

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

  • ax, ay, az:旋转轴。

  • loft:放样生成几何体。

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

2.5 几何属性查询

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/36290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lombok的hashCode方法

Lombok对于重写hashCode的算法真的是很经典,但是目前而言有一个令人难以注意到的细节。在继承关系中,父类的hashCode针对父类的所有属性进行运算,而子类的hashCode却只是针对子类才有的属性进行运算,立此贴提醒自己。 目前重写ha…

png格式快速压缩该怎么做?在电脑压缩png图片的方法

png格式的图片如何快速压缩变小呢?现在网络的不断发展,图片是日常用来分享展示内容的一种常用手段,其中使用最多的一种图片格式就是png,png格式具有无损压缩支持透明底的特性,在很多的场景下都会使用。 现在图片的清晰…

本周AI动态:生成型AI的命运掌握在法院手中

本周AI领域发生了音乐公司指控两家开发AI歌曲生成器的初创公司Udio和Suno侵犯版权的事件。 美国音乐唱片行业协会(RIAA)周一宣布,由索尼音乐娱乐公司、环球音乐集团、华纳唱片公司等发起的诉讼已经提起。诉讼声称,Udio和Suno在未…

乒乓征途:开球网 跨越积分鸿沟的热爱与挑战

乒乓征途:跨越积分鸿沟的热爱与挑战 在乒乓球这项集速度、技巧与策略于一体的运动中,我以一名业余爱好者的身份,勇敢地踏上了开球网这一竞技的广阔舞台。这里,积分不仅是衡量实力的标尺,更是通往更高层次比赛的通行证…

贷款承诺状态映射参数表,用于加工的提示信息

在设计贷款承诺状态映射参数表时,目的是将贷款的不同状态映射为相应的提示信息,以便于系统能够自动生成和发送通知给相关的借款人或银行员工。以下是一个简化的参数表示例,用于指导贷款状态的加工和提示信息生成: | 状态代码 |…

Arduino - 线性执行器(支撑或滑杆)

Arduino - 线性执行器(支撑或滑杆) Arduino - 执行器 In this tutorial, we are going to learn: 在本教程中,我们将学习: How linear actuator works 线性执行器的工作原理How to make linear actuator extend or retract. 如何使线性执行器伸展或缩…

speakTTS文字转语音播放功能

场景: speak-tts 文字转换语音的使用播放、暂停、恢复 安装 npm install speak-tts 引入 import Speech from ‘speak-tts’ 需求: 1.多条播报内容需要一条一条的播报 一进入页面就开始播报(数组的形式 后台返回) 2.暂停之后 在点…

Java AWT基础—创建一个简单的应用程序

目录 背景: 代码展示: 代码详解: AWT和Swing的区别: 总结: 背景: 在Java中,AWT(Abstract Windows Toolkit)是最早的图形月用户界面(GUI1)工具包,虽然随着Swing的出现,AWT的使用有所减少,但了解AWT基…

百元蓝牙耳机哪款性价比高?盘点性价比高的百元蓝牙耳机品牌

在如今快节奏的生活中,蓝牙耳机已经成为人们日常生活中不可或缺的配件。然而,市面上百元左右性价比高的蓝牙耳机琳琅满目,消费者往往难以选择到一款质量好、耐用的产品。我们希望可以为广大消费者提供一些参考和建议,接下来&#…

基于51单片机电子称—串口显示

基于51单片机电子称设计 (仿真+程序) 功能介绍 具体功能: 1.矩阵键盘组成按键,输入价格结算、打印; 2.用滑动变阻器和ADC0832模拟称重; 3.LCD1602可以显示重量、单价和总价; 4.…

spring03-aop

spring aop: 只能增强方法,,spring aop 底层是动态代理,,,动态代理的本质是生成一个子类,,重写这个方法,进行增强,,所以final修饰的类和方法,&…

0121__线程 thread_once

线程 thread_once_thraed once-CSDN博客

QCOM 平台增加分区流程 及 注意事项

本文以qcom msm8909 为例增加carrier分区,留文以备后忘: 1、修改分区表partition.xml diff --git a/non_hlos/common/config/emmc/partition.xml b/non_hlos/common/config/emmc/partition.xml index 74ca036..11f38bc 100755 --- a/non_hlos/common/con…

家用洗地机十大品牌什么牌子好用?2024十大爆款洗地机分享

在快节奏的生活中,清洁家居成为了一项繁琐却必不可少的任务。而洗地机的出现,无疑给忙碌的都市人带来了福音。选择一款优质的洗地机可以大大提升我们清洁的效率,改善我们的生活品质。那么,哪家洗地机清洁力最强,更适合…

ONLYOFFICE 桌面编辑器 8.1 版发布:全面提升文档处理效率的新体验

文章目录 什么是ONLYOFFICE ?ONLYOFFICE 桌面编辑器 8.1 发布:新功能和改进功能强大的 PDF 编辑器幻灯片版式功能从右至左语言支持多媒体功能增强无缝切换工作模式其他改进和优化总结 什么是ONLYOFFICE ? https://www.onlyoffice.com/zh/off…

JavaScript的学习之图片的切换

目录 一、寻找素材 二、编写简单的静态html页面 代码示例 效果展示 三、JS功能的实现 JS代码 完整代码 效果展示 一、寻找素材 随便去网上找几张图片素材 二、编写简单的静态html页面 代码示例 <!doctype html> <html><head><meta charset"…

svn明明都在环境变量中添加了,但还是无法在cmd中生效

svn明明都在环境变量中添加了&#xff0c;但还是无法在cmd中生效 cmd显示原因问题解决 cmd显示 svn不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件 原因 安装svn一直点下一步下一步…&#xff0c;没有勾选command line client。 问题解决 1.按下winx&…

Linux CMakeLists编写之静态库

目录 1 概述2 文件命名3 实例4 代码分析 1 概述 编译工具有很多(make/cmake/BJam)。cmake是跨平台&#xff0c;使用cmake编译需要编写CMakeLists.txt。本文编写CMakeLists.txt来生成C静态库。 2 文件命名 文件命名为CMakeLists.txt,是一个文本文件,可以使用任何编辑器编辑。 …

如何加密电脑文件?电脑重要文件怎么加密?

在电脑中&#xff0c;我们会存储很多重要文件&#xff0c;包括个人隐私视频、照片&#xff0c;企业机密数据&#xff0c;工作数据等。为了避免重要文件泄露&#xff0c;我们需要加密保护电脑文件。下面我们就来了解一下电脑文件怎么加密&#xff1f; 超级加密3000 当需要加密电…

[其他]MBTI各个字母分表代表什么

一、什么是MBTI&#xff1f; MBTI&#xff08;Myers-Briggs Type Indicator&#xff09;&#xff0c;一种迫选型、自我报告式的性格评估测试&#xff0c;用以衡量和描述人们在获取信息、作出决策、对待生活等方面的心理活动规律和性格类型。 二、MBTI各字母含义 MBTI倾向显示…