@

vue2.x引入threejs

npm安装

npm install three

使用指定版本:

npm install three@<版本号>

其他插件

因为本次开发需要引入3D模型,所以需要使用 MTLLoader, OBJLoader两种加载器,因为开发需求和

版本问题, 最新版本自带的加载器不能实现需求,所以需要额外引入three-obj-mtl-loader插件,并且threejs版本需要退到122版本;

npm安装three-obj-mtl-loader

npm install three-obj-mtl-loader --save

实例

  1. //-- html部分 -- 开始 --
  2. <div class="three_box" id="container">
  3. </div>
  4. //-- html部分 -- 结束 --
  5. import * as THREE from 'three';
  6. import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 控制器-控制相机运行轨道
  7. import { MTLLoader, OBJLoader } from 'three-obj-mtl-loader' //项目中使用到.obj文件和.mtl文件,故引入
  8. mounted() {
  9. let width = 1053 // dom宽度
  10. let height = 473 // dom高度
  11. this.scene = new THREE.Scene()// 运行创建场景函数
  12. let mtlLoader = new MTLLoader() //创建MTLLoader实例
  13. let objLoader = new OBJLoader() //创建OBJLoader实例
  14. let k = width / height // 宽高比
  15. let camera = new THREE.PerspectiveCamera( 60, k, 1, 2000) //创建相机,这个相机模拟人眼所看到的景象,近大远小没参数分别为:
  16. //fov — 摄像机视锥体垂直视野角度
  17. //aspect — 摄像机视锥体长宽比
  18. //near — 摄像机视锥体近端面
  19. //far — 摄像机视锥体远端面
  20. camera.position.set( -500, 300, 300 )//设置相机位置
  21. this.initDoor()//调用引入3D模型方法
  22. this.initcao() //调用几何图形方法
  23. //点光源
  24. let point = new THREE.PointLight(0xffffff)
  25. point.position.set(800, 800, 2000); //光源位置
  26. this.scene.add(point); //光源添加进场景
  27. //环境光
  28. let ambient = new THREE.AmbientLight(0xffffff); //设置环境光
  29. this.scene.add(ambient) //讲环境光加入场景
  30. this.renderer = new THREE.WebGL1Renderer(); // 实例渲染器
  31. this.renderer.setSize( width, height) //渲染器宽高
  32. this.renderer.setClearColor(new THREE.Color('#07224e'), 1) //设置背景颜色
  33. setTimeout(() => {
  34. document.getElementById('container').appendChild(this.renderer.domElement)//将渲染器添加进dom
  35. }, 500)
  36. this.animate()//调用动画效果
  37. this.controls = new OrbitControls(this.camera, this.renderer.domElement) //添加相机和渲染器到控制器,实现滑动
  38. },
  39. methods: {
  40. initcao() {
  41. let geometry = new THREE.BoxGeometry(3200, 1600, 8); //矩形平面
  42. let material = new THREE.MeshLambertMaterial({ // 配置样式,包括颜色 透明度等
  43. color: new THREE.Color('#bcbfc6'),
  44. transparent: true,
  45. opacity: 0.3,
  46. side: THREE.DoubleSide
  47. });
  48. let mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
  49. mesh.rotateX(-Math.PI / 2);
  50. this.scene.add(mesh); //网格模型添加到场景中
  51. },
  52. initDoor() {
  53. let that = this //后面回调会影响this指向
  54. let mtlLoader = new MTLLoader()
  55. let objLoader = new OBJLoader();
  56. mtlLoader.load('static/door.mtl', function( material) { //引入模型.mtl文件,是3D模型的贴图,如果不需要贴图可以不使用,模型会只有一个框架
  57. material.preload();
  58. objLoader.setMaterials(material)
  59. objLoader.load('static/door.obj', //引入模型.obj文件
  60. function( obj) {
  61. obj.position.z = -188 //调整模型位置
  62. obj.position.x = -265 //调整模型位置
  63. obj.position.y = 10 //调整模型位置
  64. obj.rotateY(Math.PI / 2) //调整模型角度
  65. obj.scale.set( 20, 20, 20 ) //调整模型放大缩小倍数
  66. that.scene.add(obj) //模型添加进场景
  67. },
  68. )
  69. })
  70. },
  71. animate() {
  72. //这里自己写点要对模型进行的操作
  73. this.renderer.render(this.scene, this.camera);
  74. requestAnimationFrame(this.animate) //这里按帧更新画面,大概一秒60次左右
  75. },
  76. }

强调

如果在开发中需要引入3D模型,模型文件应放在与src文件同级的static下,引入方式应该是 'static/door.mtl'

如果在开发过程中出现threejs生成的canvas出现外边框,只需要用css样式修改,代码如下:

  1. .three_box {
  2. width: 1053px;
  3. height: 473px;
  4. >>> canvas:focus-visible {
  5. outline: 0px
  6. }
  7. }

threejs官方文档

vue2.x引入threejs的更多相关文章

  1. vue学习笔记(三)- vue2.x引入Element-ui

    webpack+vue2.x+element-ui 作者:狐狸家的鱼 本文链接:vue2.x引入Element-ui GitHub:sueRimn 1.新建项目 vue init webpack vu ...

  2. vue2.0引入腾讯地图

    百度很多东西,然后我没找到腾讯地图在VUE2.0里面的引用.于是根据找的其他地图引用资料进行尝试.步骤如下. 首先在src里面建立了TMap.js的文件,内容如下: export function T ...

  3. VUE2 项目 引入 leaflet.draw全过程

    leaflet.draw的参考文档:http://leaflet.github.io/Leaflet.draw/docs/leaflet-draw-latest.html   这个网址不稳定,多刷新几 ...

  4. vue2.0 引入font-awesome

    网上的大部分教程复杂而且难看懂,其实两步就能搞定. 先cnpm install font-awesome --save引入依赖 然后在main.js引入 font-awesome/css/font-a ...

  5. vue2.0引入现有css文件

    1.在vue文件中的<style>内填写需要引用的文件 如: @import "./css/indexTest.css";

  6. Vue2源码分析-逻辑梳理

    很久之前就看完vue1,但是太懒就一直没写博客,这次打算抽下懒筋先把自己看过了记录下来,否则等全部看完,估计又没下文了 看源码总需要抱着一个目的,否则就很难坚持下去,我并没做过vue的项目,我几乎很少 ...

  7. vue2使用高德地图vue-amap定位以及AMapUI标注

    前言 最近在vue里使用了高德地图vue-amap以及AMapUI,我在这里就说下如何在vue2里引入vue-amap和AmapUI以及使用定位 (在这里默认你已经安装了vue-cli) 安装 npm ...

  8. ThreeJS geometry的顶点世界坐标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. threeJS创建mesh,创建平面,设置mesh的平移,旋转、缩放、自传、透明度、拉伸

    这个小案例是当初我在学习的时候,小的一个小案例,代码还需要进一步优化:还请谅解~~:主要用到了threeJS创建mesh,创建平面,设置mesh的平移,旋转.缩放.自传.透明度.拉伸等这些小功能: 采 ...

随机推荐

  1. day10 Map_查找与遍历

    Map 查找表 Map体现的结构是一个多行两列的表格,其中左列称为key,右列称为value. Map总是成对保存数据,并且总是根据key获取对应的value.因此我们可以将查询的条件作为key查询对 ...

  2. 《Python编程:从入门到实践》第十八章笔记:Django最基本用法笔记

    最近在看Python编程:从入门到实践,这是这本书"项目3 Web应用程序"第18章的笔记.记录了django最基本的一些日常用法,以便自己查阅. 可能是我的这本书版本比较老,书上 ...

  3. 乘风破浪,遇见未来新能源汽车(Electric Vehicle)之特斯拉提车必须知道的十个流程

    订车 线下门店或者官网可以咨询和下单,一般来说,订金就是1000,还算可以接受. 订单账号 特斯拉账号是以邮箱为区分的,而不是手机号,我们下单的时候需要提供一个邮箱用来注册特斯拉账号. 注意了,敲黑板 ...

  4. 别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅!

    大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源 ...

  5. Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...

  6. web前端要学些什么,学习思路

    有没有Web前端大神给个意见 我已学了 html  css JS 马上要学Vue或React不知道那个好 需不需要先了解一下jQuery 还需要学些什么

  7. Java学习--基础

    java学习 基础 Java三大版本 javase 标准版 占领桌面端(基础) javame 移动版 嵌入式开发.占领手机端 javaee 企业版 占领服务器端 Java的特性和优势 跨平台.可移植性 ...

  8. django中的forms组件

    form介绍 用户需要向后端提交一些数据时,我们常常把这些数据放在一个form表单里,采用form标签,里面包含一些input等标签把用户的数据提交给后端. 在给后端提交数据的时候,我们常常也需要对于 ...

  9. jQuery 判断父节点下是否有子节点

    查找父节点下是否有子节点有两个情况:(1)查找的是父元素的所有后代节点:(2)仅查找父元素的第一代子节点. <div id="app"> <div> < ...

  10. jQuery 选择器选中某节点,在后续的链式操作函数内使用 $(this) 的结果是 Window 对象,而非该节点对象

    <ul class="tree-ocx"> <li class="tree-ocx-li" data-displayed="fals ...