(VUE实现Web3D)网页三维CAD中绘制窗户模型

2024年11月04日09:40:22 财经 7356

前言

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

(VUE实现Web3D)网页三维CAD中绘制窗户模型 - 天天要闻

环境搭建和入门

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

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

编写创建窗户模型的代码

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

(VUE实现Web3D)网页三维CAD中绘制窗户模型 - 天天要闻

2. 编写绘制窗户模型的代码

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 > <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`命令来运行项目,效果如下图:

(VUE实现Web3D)网页三维CAD中绘制窗户模型 - 天天要闻

财经分类资讯推荐

特朗普关税大棒之下,转口贸易有用吗? - 天天要闻

特朗普关税大棒之下,转口贸易有用吗?

刘远举:特朗普的极限施压,从他的社交媒体到各国现实,隔着无数出于利益的阻碍。想把这些产业链从中国带到美国,短期内是不可能的。 文 | FT中文网专栏作家刘远举特朗普宣布“对等关税”仅13小时后,他又在其社交媒体平台上突然宣布,对超过75个国家实施为期90天的关税暂缓措施,同时将中国商品的关税税率从104%提升至125...
缅甸洋葱出口价如何? - 天天要闻

缅甸洋葱出口价如何?

根据四月第三周的出口市场报价,缅甸出口的洋葱按规格不同,FOB(离岸价)定为每吨240至370美元。 缅甸洋葱、大蒜及厨房作物种植生产出口商协会每周都会发布出口洋葱、大蒜、酸角、姜黄、长辣....
订单多了!一季度医药研发外包上市公司业绩超预期 - 天天要闻

订单多了!一季度医药研发外包上市公司业绩超预期

(人民日报健康客户端记者 陈琳辉 )据人民日报健康客户端记者不完全统计,国内11家CXO(医药研发外包服务)上市公司已发布2025年一季度最新财报,其中药明康德、凯莱英、康龙化成和博腾股份新签或者在手的订单超预期,公司业绩有所改善。据药明康德公布的2025年一季度财报显示,截至2025年3月末,药明康德持续经营业务在手...
三个“爆品”,藏着中国外贸秘籍 - 天天要闻

三个“爆品”,藏着中国外贸秘籍

来自世界各地的外商云集,我国制造业的产品琳琅满目,最近,和各大景区一样火热的,还有广交会现场。4月15日至5月5日,第137届中国进出口商品交易会(广交会)在广州分三期举办。截至4月27日,也就是第二期落幕时,已有来自全球219个国家和地区
直击奥马哈中国投资人峰会|感受巴菲特的重要观点,判断投资的可为机会 - 天天要闻

直击奥马哈中国投资人峰会|感受巴菲特的重要观点,判断投资的可为机会

财联社5月4日讯(记者 闫军)又是一年巴菲特时刻,当巴菲特在股东大会上宣布计划今年年底退休时,不仅震惊在场股东,也让今年的伯克希尔·哈撒韦股东大会弥足珍贵。陪伴了国内投资者15年中国投资人峰会在5月4日如约而至,由兴证全球基金、财联社、腾讯新闻共同主办的“投资·可为|2025年度中国投资人峰会”在奥马哈场进行。...
宁泉资产李源海:关心AI进展,重视估值和现金流 - 天天要闻

宁泉资产李源海:关心AI进展,重视估值和现金流

财联社5月4日讯(记者 周晓雅)由兴证全球基金、财联社、腾讯新闻共同主办的“投资·可为|2025年度中国投资人峰会”奥马哈场正在进行中。宁泉资产研究总监兼投资经理李源海就投资与社会公益之间的良性循环注入新思考。宁泉资产研究总监兼投资经理 李源海财联社记者梳理主要观点,以供读者参考。李源海强调,投资不应止步于...
2025年的投资机遇有哪些?宁泉资产李源海、睿郡资产薛大威,兴证全球基金童兰在奥马哈亮观点 - 天天要闻

2025年的投资机遇有哪些?宁泉资产李源海、睿郡资产薛大威,兴证全球基金童兰在奥马哈亮观点

财联社5月4日讯(记者 周晓雅)在当前科技浪潮席卷下,如何看待新旧动能转换中的投资机遇?投资与财富观、社会价值之间又有怎样的关系?2025年5月4日,兴证全球基金、财联社、腾讯新闻共同主办的“投资·可为|2025年度中国投资人峰会”在奥马哈进行。宁泉资产研究总监兼投资经理李源海,睿郡资产合伙人、副总经理薛大威,兴...
每分钟超1000万元! - 天天要闻

每分钟超1000万元!

每分钟超1000万元!中欧贸易持续向好今年是中国和欧盟建交50周年,从建交初期的24亿美元到现在的7800亿美元,中欧双边贸易持续向好发展。据海关统计,今年一季度,我国对欧盟进出口1.3万亿元,同比增长1.4%,相当于每分钟都有超过1000