vue3项目中使用three.js
前言
在vue3项目中,通过three.js使用了一段短小但完整的代码实现了实际的三维效果图。
一、three.js是什么?
Three.js是一个轻量级,跨平台的Javascript库,可以在浏览器上结合HTML5的canvas,SVG或者WebGL,创建和展示3D模型和动画。
Three.js允许我们在不依赖任何浏览器插件的情况下,创建一个GPU加速的3D动画场景。
二、vue3中下载与安装three.js
1.利用npm安装three.js:
npminstall three
2.npm安装轨道控件插件:
npminstall three-orbit-controls
3.安装加载.obj和.mtl文件的插件:
npm i --save three-obj-mtl-loader
4.安装渲染器插件:
npm i --save three-css2drender
安装好后在需要调用的vue文件中引用:
import * as Three from 'three'
三、操作步骤
场景——相机——渲染器是在Three.js中必不可少的三要素,只有以上三者结合才能渲染出可见的内容。
1.创建场景
//创建一个三维场景const scene =newTHREE.Scene();
2.创建物体
const geometry =newTHREE.BoxGeometry(100,100,100);//长宽高都是100的立方体// const geometry = new THREE.SphereGeometry(60,40,40);//半径是60的圆//widthSegments, heightSegments:水平方向和垂直方向上分段数。widthSegments最小值为3,默认值为8。heightSegments最小值为2,默认值为6。//创建材质(外观)const material =newTHREE.MeshLambertMaterial({// color: 0x0000ff,//设置材质颜色(蓝色)color:0x00ff00,//(绿色)transparent:true,//开启透明度opacity:0.5//设置透明度});//创建一个网格模型对象const mesh =newTHREE.Mesh(geometry, material);//网络模型对象Mesh//把网格模型添加到三维场景
scene.add(mesh);//网络模型添加到场景中
3.添加光源
//添加光源 //会照亮场景里的全部物体(氛围灯),前提是物体是可以接受灯光的,这种灯是无方向的,即不会有阴影。const ambient =newTHREE.AmbientLight(0xffffff,0.4);const light =newTHREE.PointLight(0xffffff,1);//点光源,color:灯光颜色,intensity:光照强度
4.添加相机
//创建一个透视相机,窗口宽度,窗口高度const width = window.innerWidth, height = window.innerHeight;const camera =newTHREE.PerspectiveCamera(45, width/height,1,1000);//设置相机位置
camera.position.set(300,300,300);//设置相机方向
camera.lookAt(0,0,0);
5.开始渲染
//创建一个WebGL渲染器const renderer =newTHREE.WebGLRenderer()
renderer.setSize(width,height)//设置渲染区尺寸
renderer.render(scene,camera)//执行渲染操作、指定场景、相机作为参数
四、myThree.vue源代码
说了这么多,现奉上myThree.vue源代码:
<template><div id="my-three"></div></template>
<script lang='ts' setup>import*asTHREEfrom'three'import{ OrbitControls }from'three/examples/jsm/controls/OrbitControls'import{ onMounted }from'vue'//创建一个三维场景const scene =newTHREE.Scene();//创建一个物体(形状)const geometry =newTHREE.BoxGeometry(100,100,100);//长宽高都是100的立方体// const geometry = new THREE.SphereGeometry(60,40,40);//半径是60的圆//widthSegments, heightSegments:水平方向和垂直方向上分段数。widthSegments最小值为3,默认值为8。heightSegments最小值为2,默认值为6。//创建材质(外观)const material =newTHREE.MeshLambertMaterial({// color: 0x0000ff,//设置材质颜色(蓝色)color:0x00ff00,//(绿色)transparent:true,//开启透明度opacity:0.5//设置透明度});//创建一个网格模型对象const mesh =newTHREE.Mesh(geometry, material);//网络模型对象Mesh//把网格模型添加到三维场景
scene.add(mesh);//网络模型添加到场景中// 添加多个模型(添加圆形)// const geometry2 = new THREE.SphereGeometry(60, 40, 40);// const material2 = new THREE.MeshLambertMaterial({// color: 0xffff00// });// const mesh2 = new THREE.Mesh(geometry2, material2); //网格模型对象Mesh// // mesh3.translateX(120); //球体网格模型沿Y轴正方向平移120// mesh2.position.set(120,0,0);//设置mesh3模型对象的xyz坐标为120,0,0// scene.add(mesh2);//添加光源 //会照亮场景里的全部物体(氛围灯),前提是物体是可以接受灯光的,这种灯是无方向的,即不会有阴影。const ambient =newTHREE.AmbientLight(0xffffff,0.4);const light =newTHREE.PointLight(0xffffff,1);//点光源,color:灯光颜色,intensity:光照强度
scene.add(ambient);
light.position.set(200,300,400);
scene.add(light);//创建一个透视相机,窗口宽度,窗口高度const width = window.innerWidth, height = window.innerHeight;const camera =newTHREE.PerspectiveCamera(45, width/height,1,1000);//设置相机位置
camera.position.set(300,300,300);//设置相机方向
camera.lookAt(0,0,0);//创建辅助坐标轴const axesHelper =newTHREE.AxesHelper(200);//参数200标示坐标系大小,可以根据场景大小去设置
scene.add(axesHelper);//创建一个WebGL渲染器const renderer =newTHREE.WebGLRenderer()
renderer.setSize(width,height)//设置渲染区尺寸
renderer.render(scene,camera)//执行渲染操作、指定场景、相机作为参数const controls =newOrbitControls(camera, renderer.domElement)//创建控件对象
controls.addEventListener('change',()=>{
renderer.render(scene, camera)//监听鼠标,键盘事件})onMounted(()=>{
document.getElementById('my-three')?.appendChild(renderer.domElement)})</script>
<style lang='scss'>
body{margin:0;padding:0;}</style>
五、效果图
1.单个模型
2.多个模型
总结
在vue3项目中,通过three.js实现了实际的三维效果demo,未来会继续深入研究,总之3D渲染图形是一个很好玩的东西,欢迎大家一起交流。
版权归原作者 犬莱八荒 所有, 如有侵权,请联系我们删除。