(H5-Web3D-ThreeJS)在网页三维CAD中绘制窗户模型

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 本文介绍了如何使用mxcad3d在网页中创建一个简单的三维窗户模型。通过官方教程搭建环境,编写绘制窗户模型的代码,并在点击按钮后展示模型效果。最终模型包括窗框和玻璃部分,具备丰富的三维建模功能和便捷的API支持。

前言

本文使用mxcad3d在网页中创建一个简单的三维窗户模型,mxcad3d提供了丰富的三维建模功能和便捷的API,使得创建各种三维模型变得简单方便,最终效果如下图:
1728875232217.jpg

环境搭建和入门

首先学习mxcad的基本使用方法,可通过官方的入门教程来搭建一个最基本的项目模板,依次查看教程:
安装Node.js以及VS Code开发工具创建mxcad开发项目API文档接口使用说明

压缩包下载解压后需要在项目目录下打开cmd命令行,然后在命令行中执行npm install来安装依赖,然后再按照本教程中的方式来运行项目查看效果。

编写创建窗户模型的代码

1.根据官方快速入门教程来创建一个名为Test3dWindow的项目,如下图:
1728873070449.jpg

2.编写绘制窗户模型的代码
在index.html中插入一个按钮"绘制窗户模型", index.html的完整代码如下:

   <!DOCTYPE html>
   <html lang="en">
   <head>
       <meta charset="UTF-8">
       <meta http-equiv="X-UA-Compatible" content="IE=edge">
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <title>vite use mxcad</title>
   </head>
   <body>
       <div style="height: 800px; overflow: hidden;"> <canvas id="myCanvas"></canvas></div>
       <button>绘制窗户模型</button>
       <script type="module" src="./src/index.ts"></script>
   </body>
   </html>

在src/index.ts中编写绘制窗户模型的函数,src/index.ts的完整代码如下:

   import {
    MdGe, Mx3dGeAxis, Mx3dGeColor, Mx3dGeDir, Mx3dGeMaterial, Mx3dGeomPlane, Mx3dGePoint, Mx3dGeVec, Mx3dMkBox, Mx3dMkFace, Mx3dMkPolygon, Mx3dMkPrism, MxCAD3DObject } from "mxcad"
   // 创建mxcad3d对象
   const mxcad3d = new MxCAD3DObject()
   // 初始化mxcad3d对象
   mxcad3d.create({
   
       // canvas元素的css选择器字符串(示例中是id选择器),或canvas元素对象
       canvas: "#myCanvas",
       // 获取加载wasm相关文件(wasm/js/worker.js)路径位置
       locateFile: (fileName)=> new URL(`/node_modules/mxcad/dist/wasm/3d/${
     fileName}`, import.meta.url).href,
   })
   // 初始化完成
   mxcad3d.on("init", ()=>{
   
       console.log("初始化完成");
       // 修改背景颜色
       const color1 = new Mx3dGeColor(61/255, 139/255, 221/255, MdGe.MxTypeOfColor.Color_TOC_sRGB);
       const color2 = new Mx3dGeColor(203/255, 223/255, 247/255, MdGe.MxTypeOfColor.Color_TOC_sRGB);
       mxcad3d.setGradientBgColor(color1, color2, MdGe.MxGradientFillMethod.GFM_VER);
       // 设置透视投影
       mxcad3d.setProjectionType(MdGe.MxCameraProjection.CProjection_Perspective);
       // 打开光照阴影
       mxcad3d.enableDirLightSrc(true);
   });
   function drawWindow(){
   
     // 窗户边框横截面轮廓点
     const pts: Mx3dGePoint[] = [];
     pts.push(new Mx3dGePoint(0, 0, 0));
     pts.push(new Mx3dGePoint(1, 0, 0));
     pts.push(new Mx3dGePoint(1, 0, 2));
     pts.push(new Mx3dGePoint(4, 0, 2));
     pts.push(new Mx3dGePoint(4, 0, 0));
     pts.push(new Mx3dGePoint(5, 0, 0));
     pts.push(new Mx3dGePoint(5, 0, 10));
     pts.push(new Mx3dGePoint(3, 0, 10));
     pts.push(new Mx3dGePoint(3, 0, 8));
     pts.push(new Mx3dGePoint(2, 0, 8));
     pts.push(new Mx3dGePoint(2, 0, 10));
     pts.push(new Mx3dGePoint(0, 0, 10));
     // 窗户边框横截面轮廓多段线
     const polygon = new Mx3dMkPolygon();
     pts.forEach((pt) => polygon.Add(pt));
     polygon.Close();
     // 窗户边框横截面轮廓线
     const wire = polygon.Wire();
     // 窗户边框横截面轮廓线生成窗框横截面
     const makeface = new Mx3dMkFace(wire);
     const face = makeface.Face();
     const vec = new Mx3dGeVec(0, 100, 0);
     // 横截面拉伸出窗框体形状
     const frame = new Mx3dMkPrism(face, vec);
     let frameShape = frame.Shape();
     // 构造两个平面用于分割窗户边框(边框两端的斜45度角)
     const pt = new Mx3dGePoint(0, 0, 0);
     const dir = new Mx3dGeDir(0, -1, 1);
     const plane = new Mx3dGeomPlane(pt, dir);
     // 平面1
     const planeFace = plane.Face(1e-5);
     pt.setXYZ(0, 50, 0);
     dir.SetXYZ(0, 0, 1);
     const axis = new Mx3dGeAxis(pt, dir);;
     // 平面2
     const planeFace2 = planeFace.MirroredByAxis(axis);
     // 分割窗户边框(分割成了两个斜45度的小三角形部分和中间的一个梯形部分)
     const parts = frameShape.spliter([planeFace, planeFace2]);
     // 筛选出中间那个梯形的部分(这里是通过质心的位置来判断的)
     parts.forEach((shape)=>{
   
       // 这里Centroid的参数添填的MdGe.MxQuantAspect.Quant_Volume这个枚举,是因为shape是实体,它的质心是体质心,所以这里填MdGe.MxQuantAspect.Quant_Volume
       // 如果shape是面,它的质心是面质心,所以要填MdGe.MxQuantAspect.Quant_Area
       // 如果shape是线,它的质心是线质心,所以要填MdGe.MxQuantAspect.Quant_Length
       const centroid = shape.Centroid(MdGe.MxQuantAspect.Quant_Volume);
       if (centroid.Y() > 45 && centroid.Y() < 55) {
   
         frameShape = shape;
       }
     });
     // 通过旋转得到另外三个边的边框
     const frameShape2 = frameShape.Rotated(new Mx3dGeAxis([0, 50, 50], [1, 0, 0]), Math.PI / 2);
     const frameShape3 = frameShape.Rotated(new Mx3dGeAxis([0, 50, 50], [1, 0, 0]), Math.PI);
     const frameShape4 = frameShape2.Rotated(new Mx3dGeAxis([0, 50, 50], [1, 0, 0]), Math.PI);
     // 合并四个边框,获得边框整体形状
     frameShape = frameShape.fuse(frameShape2).fuse(frameShape3).fuse(frameShape4);

     // 窗框颜色
     const frameColor = new Mx3dGeColor(0.5, 0.5, 0.5, MdGe.MxTypeOfColor.Color_TOC_RGB);
     // 窗框材质
     const frameMaterial = new Mx3dGeMaterial(MdGe.MxNameOfMaterial.Material_NOM_ShinyPlastified);
     // 玻璃
     const glass = new Mx3dMkBox([2, 8, 8], [3, 92, 92]);
     // 玻璃形状
     const glassShape = glass.Shape();
     // 玻璃颜色
     const glassColor = new Mx3dGeColor(0, 0.9, 0.549, MdGe.MxTypeOfColor.Color_TOC_RGB);
     // 玻璃材质,看起来是透明的
     const glassMaterial = new Mx3dGeMaterial(MdGe.MxNameOfMaterial.Material_NOM_Glass);
     // 获取模型文档
     const doc = mxcad3d.getDocument();
     // 新增一个形状标签用于保存边框形状
     const frameLabel = doc.addShapeLabel();
     frameLabel.setShape(frameShape);
     frameLabel.setColor(frameColor)
     frameLabel.setMaterial(frameMaterial);
     // 新增一个形状标签用于保存玻璃形状
     const glassLabel = doc.addShapeLabel();
     glassLabel.setShape(glassShape);
     glassLabel.setColor(glassColor)
     glassLabel.setMaterial(glassMaterial);
     // 更新视图显示
     mxcad3d.update();
   }
   // 给button添加点击事件,点击后调用drawWindow函数,进行窗户模型的绘制
   // 立即执行函数
   (function addEventToButton(){
   
     const btn = document.querySelector("button");
     if (btn) {
   
       btn.addEventListener("click", () => {
   
         drawWindow();
       });
     }
   })()

3.新建终端,运行npx vite命令来运行项目,效果如下图:
1728875910573.jpg

相关文章
|
4月前
|
前端开发 JavaScript 开发者
探索Web设计新纪元:CSS3的革新特性如何重塑我们的网页视觉体验?
【8月更文挑战第26天】随着Web技术的发展,CSS3为前端开发带来了众多激动人心的新特性,极大提升了网页设计的视觉效果与创意空间。本文通过对比CSS3与CSS2,详细介绍了CSS3在选择器增强、圆角阴影处理、渐变背景应用、转换动画实现、文字效果优化、媒体查询支持及多列布局方面的显著改进,展示了CSS3如何助力开发者打造更具吸引力和互动性的网页体验。
58 1
WEB端在线CAD中实现测量圆、测量面积的方法
实现在线CAD中测量圆和测量面积的功能开发,用户点击目标圆对象将自动标记出这个圆的半径、面积值和周长值,同时可以自定义选择标注文字的位置,测量圆功能能够快速掌握目标圆对象的数据信息,方便统计工程量。
WEB端在线CAD中实现测量圆、测量面积的方法
|
3月前
|
小程序 前端开发 中间件
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
本文介绍了如何在ThinkPHP框架中配置跨域请求,使用了TP内置的跨域类`\think\middleware\AllowCrossDomain::class`。文章还讨论了小程序和web网页在跨域请求格式上的区别,并提供了解决方案,包括修改跨域中间件源码以支持`Origin`和`token`。此外,还介绍了微信小程序跨域请求的示例和web网页前端发送Axios跨域请求的请求拦截器配置。
ThinkPHP 配置跨域请求,使用TP的内置跨域类配置,小程序和web网页跨域请求的区别及格式说明
|
2月前
|
Web App开发 前端开发 网络性能优化
Web网页端IM产品RainbowChat-Web的v7.2版已发布
RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIMSDK (Github地址) 的产品级移动端IM系统)。
41 1
|
2月前
|
机器学习/深度学习 监控 数据挖掘
基于Django和百度飞桨模型的情感识别Web系统
基于Django和百度飞桨模型的情感识别Web系统
45 5
|
3月前
|
前端开发 API
(WEB前端编辑DWG)在线CAD如何实现图形识别功能
mxcad 提供的图形识别功能可帮助用户快速识别和提取 CAD 图纸中的各种图形,如直线、多段线、弧线、圆及图块,显著提升设计效率。此功能不仅适用于图形分类,还能进行数量统计和快速定位,减少手动操作。用户可通过 API 进行二次开发,自定义识别逻辑。具体步骤包括打开在线示例、选择识别功能、设置识别参数并开始识别。更多开发文档请关注公众号:梦想云图网页 CAD。
|
3月前
|
SQL 安全 搜索推荐
Web安全-伪静态网页
Web安全-伪静态网页
41 3
|
3月前
|
存储 API Go
使用动态模型创建web应用
【9月更文挑战第5天】动态模型描述系统中对象间的交互和状态变化,重点关注事件驱动的行为。时序图清晰展示了请求处理流程,状态图则描绘了系统状态的转换过程。
63 9
|
4月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
62 1
|
4月前
|
XML JavaScript 前端开发
哇塞!Web 前端惊现 DOM 元素神操作,一场惊心动魄的网页变革,你准备好了吗?
【8月更文挑战第23天】在Web前端开发中,熟练操作DOM元素至关重要。DOM作为一种编程接口,将HTML/XML文档表示为节点树,便于使用JavaScript访问及修改文档内容与结构。
61 0