使用three.js 简单加载STL格式3D模型

上述是简单版本

 一、使用three.js中的STLLoader加载模块

引入three.js 引入STLLoader加载模块。

// 引入three.js
import * as THREE from 'three';
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader';

 const containers = ref(null);
 let scene, camera, renderer, controls, raycaster, mouse, size, distance, boundingBox, mesh, initialCameraPosition, initialCameraTarget, modelCenter, labelRenderer;

初始化场景,相机,渲染函数,鼠标控制等全局变量。

 在初始化方法中,将灯光,环境光,渲染容器,相机,鼠标控制等进行初始化帮绑定。

const initScene = () => {
            scene = new THREE.Scene();
            const bgColor = new THREE.Color("#e7e9e9");
            scene.background = bgColor;

            const ambient = new THREE.AmbientLight(0xffffff, 1);
            scene.add(ambient);

            const spotLight = new THREE.SpotLight(0xffffff, 1.0);
            spotLight.intensity = 2.0;
            spotLight.angle = Math.PI / 2;
            spotLight.position.set(0, 0, -200);
            scene.add(spotLight);

            const pointLight = new THREE.PointLight(0xffffff, 10);
            pointLight.position.set(400, 0, 0);
            scene.add(pointLight);

            const pointLightHelper = new THREE.PointLightHelper(pointLight, 10);
            scene.add(pointLightHelper);

            const directionalLight = new THREE.DirectionalLight(0xffffff, 2);
            directionalLight.position.set(200, 200, 200);
            scene.add(directionalLight);

            camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);

            renderer = new THREE.WebGLRenderer();
            renderer.antialias = true
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.setPixelRatio(window.devicePixelRatio)
            containers.value.appendChild(renderer.domElement);

            labelRenderer = new CSS2DRenderer();
            labelRenderer.setSize(containers.value.offsetWidth, containers.value.offsetHeight);
            labelRenderer.domElement.style.position = 'absolute';
            // 相对标签原位置位置偏移大小
            labelRenderer.domElement.style.top = '0px';
            labelRenderer.domElement.style.left = '0px';
            // //设置.pointerEvents=none,以免模型标签HTML元素遮挡鼠标选择场景模型
            labelRenderer.domElement.style.pointerEvents = 'none';
            containers.value.appendChild(labelRenderer.domElement);


            controls = new OrbitControls(camera, renderer.domElement);
            controls.enableZoom = false;
            controls.enableRotate = true;
            raycaster = new THREE.Raycaster();
            mouse = new THREE.Vector2();
        };

然后就是渲染加载stl模块及加载模型。'/modle/1.stl' 这里既可以是静态文件还可以是文件地址。

这一块主要是对加载模型材质的选择,并对加载的模型进行了描边,需要注意的是模型的缩放因子也需要在描边上添加,以及后面模型测量尺寸的展示都要除以这个缩放因子才是实际的尺寸。

这里还涉及到一个相机的初始位置的设置,模型初始化加载后,是呈现一个倾斜角度展示的,而不是看到的正面。并且拿全局变量进行了记录。在后面交互功能,相当于重置模型位置时要是用。

const loadModel = () => {
            const loader = new STLLoader();
            loader.load('/modle/1.stl', (geometry) => {
                const material = new THREE.MeshPhongMaterial({
                    color: '#918b84',
                    side: THREE.DoubleSide,
                    specular: '#918b84',
                    shininess: 12
                });
                mesh = new THREE.Mesh(geometry, material);
                // var surfaceArea = computeSurfaceArea(geometry);
                // var volume = computeModelVolume(geometry);
                // console.log('表面积:', surfaceArea, "体积", volume.toFixed(3));

                // 缩放模型尺寸
                const scale = 0.4; // 缩放因子

                const edges = new THREE.EdgesGeometry(geometry); // 根据模型几何体生成边缘几何体
                const edgeMaterial = new THREE.MeshPhysicalMaterial({ color: 0x000000, linewidth: 2 });

                const edgeMesh = new THREE.LineSegments(edges, edgeMaterial); // 创建线条对象
                edgeMesh.scale.set(scale, scale, scale);
                scene.add(edgeMesh);
                mesh.scale.set(scale, scale, scale);
                // 计算模型边界
                boundingBox = new THREE.Box3().setFromObject(mesh);
                // 计算模型尺寸
                size = new THREE.Vector3();
                boundingBox.getSize(size);

                // 计算与边界框最远点的距离
                distance = size.length() * 2;
                // 计算辅助坐标轴中心位置
                modelCenter = new THREE.Vector3();
                boundingBox.getCenter(modelCenter);
                //设置旋转中心是模型的中心
                controls.target.copy(modelCenter);

                // 设置相机位置和目标点
                const cameraPosition = modelCenter.clone().add(new THREE.Vector3(1, 1, 1).normalize().multiplyScalar(distance));
                camera.position.copy(cameraPosition);
                camera.lookAt(modelCenter);
                initialCameraPosition = cameraPosition
                initialCameraTarget = modelCenter
                scene.add(mesh)
            });
        };

 const handleResize = () => {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize(window.innerWidth, window.innerHeight);
            labelRenderer.setSize(window.innerWidth, window.innerHeight);

        };

        const animate = () => {
            requestAnimationFrame(animate);
            controls.update();
            TWEEN.update();
            renderer.render(scene, camera);
            labelRenderer.render(scene, camera);
        };

最后一个是根据浏览器窗口重新设置尺寸,一个是调用渲染函数进行渲染,到此一个STL模型就加载出来了

 Originmaterial = new THREE.MeshPhysicalMaterial({
          side: THREE.DoubleSide,
          // map: texture,
          roughness: 1, //表面粗糙度
          clearcoat: 1.0,
          clearcoatRoughness: 0.1,
          polygonOffset: true,
          polygonOffsetFactor: 1, // 调整描边模型的深度
          polygonOffsetUnits: 1
   });

 针对描边和模型重合被吃掉问题修改模型材质使得描边正常展示

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Vue中加载3D模型需要使用Three.js库。首先,需要在Vue项目中安装Three.js库。然后,可以使用Three.js提供的Loader加载3D模型文件,例如OBJ、FBX、GLTF等格式加载完成后,可以将模型添加到场景中进行渲染。具体的实现可以参考Three.js的官方文档和示例代码。 ### 回答2: 使用vue实现three.js3D模型加载需要以下步骤: 1. 安装three.js库 在vue项目中使用three.js需要先安装three.js库。可以通过npm安装: ```npm install three --save``` 安装后,可以通过需要使用three.js的组件中引入库: ```import * as THREE from 'three'``` 2. 创建场景、相机、渲染器 在vue组件内部需要先创建基本的场景、相机和渲染器组件: ```javascript mounted() { //创建场景 this.scene = new THREE.Scene(); //创建相机 this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000); //创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor('#F5F5F5', 1.0); //将渲染器添加到页面中 this.$refs.box.appendChild(this.renderer.domElement); } ``` 其中,mounted()生命周期函数是在vue组件加载完毕后需要去执行的函数。 3. 加载模型 加载模型需要借助于GLTFLoader库,可以通过npm安装依赖: ```npm install three-gltf-loader --save``` 加载gltf格式模型需要加载器: ```javascript import { GLTFLoader } from 'three-gltf-loader'; mounted() { //创建GLTFloader对象 this.loader = new GLTFLoader(); //加载模型 this.loader.load(url, object => { this.scene.add(object.scene); this.animate(); }); } ``` 其中,url是需要加载模型地址,object是加载完成后的对象。 4. 更新场景 ```javascript methods: { animate() { this.renderer.render(this.scene, this.camera); //转动,可以忽略 window.requestAnimationFrame(this.animate); this.scene.rotation.y += 0.01; } } ``` 其中,animate()方法是更新场景的方法。在该方法中需要更新场景的内容,并进行渲染。 5. 完整代码展示 ```javascript <template> <div ref="box"></div> </template> <script> import * as THREE from 'three'; import { GLTFLoader } from 'three-gltf-loader'; export default { data() { return { scene: null, camera: null, renderer: null, loader: null } }, mounted() { //创建场景 this.scene = new THREE.Scene(); //创建相机 this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000); //创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor('#F5F5F5', 1.0); //将渲染器添加到页面中 this.$refs.box.appendChild(this.renderer.domElement); //创建GLTFloader对象 this.loader = new GLTFLoader(); //加载模型 this.loader.load(url, object => { this.scene.add(object.scene); this.animate(); }); }, methods: { animate() { this.renderer.render(this.scene, this.camera); //转动,可以忽略 window.requestAnimationFrame(this.animate); this.scene.rotation.y += 0.01; } } } </script> ``` 这就是vue中three.js加载3D模型的完整教程,希望对你有所帮助。 ### 回答3: Vue是一种流行的JavaScript框架,而three.js是一个强大的WebGL库,用于创建和呈现3D图形。将Vue与three.js结合使用,可以在Vue应用程序中轻松加载和处理3D模型。 要在Vue中加载3D模型,首先需要安装three.js库。可以使用npm或yarn等包管理工具安装它。然后在Vue应用程序中导入该库并创建一个Scene对象。场景是three.js中用于呈现所有3D对象的容器。 然后需要定义一个渲染器,将场景渲染到屏幕上。在Vue中,可以在组件的mounted钩子函数中定义渲染器。需要将渲染器的DOM元素设置为Vue组件的$el属性。 现在就可以加载3D模型了。可以使用three.js中的Loader方法加载3D模型文件。three.js支持多种3D模型格式,如OBJ、STL和GLTF。加载完成后,将3D对象添加到场景中即可。 由于Vue具有响应式数据绑定的特性,可以在Vue组件中轻松地控制3D模型的属性,比如位置、旋转和缩放。只需在Vue组件中定义数据模型,并在模板中使用数据绑定即可。 在Vue中使用three.js创建3D场景需要一些基本的知识,但很容易上手。可以使用Vue和three.js创建漂亮的3D场景和模型,从而增强Vue应用程序的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值