这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

本文说明

本文主要简单介绍了,在Vue3.x项目中如何简单的使用Three.js,导入PCD三维模型文件。

模型显示

项目实现

第一步

首先创建一个vue3.x,的项目,然后需要先有一个 .pcd三维模型文件,如果有的话,将三维点云文件放在如下图的文件夹里,如果没有的话,百度云盘(链接:pan.baidu.com/s/1TM2gKCep… )

第二步

在安装Three.js前,需要安装Babel,来编译ES6语法。

参考:

vue安装babel-polyfill插件,解决低版本浏览器不支持ES6新语法的问题

www.cnblogs.com/chenyingyin…

vuecli3 如何使用babel

www.csdn.net/tags/MtTaMg…

好像也可以在创建项目的时候,安装Babel

vue create vue3-test

第三步

需要在vue3.x项目中安装Three.js

npm install three@0.128.0

npm install three-orbit-controls

npm i --save three-css2drender

依次安装,也可以一起安装

npm install --save three@0.128.0 three-orbit-controls three-css2drender

第四步

在项目中使用,以下是整个完整代码

<template>

  <div style="height: 100%; width: 100%">

    <div id="three" style="height: 100%; width: 100%"></div>

  </div>

</template>

<script>

// 引入Three.js

import * as THREE from "three";

// 引入PCD加载器

import { PCDLoader } from "three/examples/jsm/loaders/PCDLoader.js"; // 注意是examples/jsm

// 引入模型控制器

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; // 放大缩小旋转等控制操作

// 创建一个时钟对象Clock

var clock = new THREE.Clock();

// 设置渲染频率为30FBS,也就是每秒调用渲染器render方法大约30次

var FPS = 30;

var renderT = 1 / FPS; //单位秒  间隔多长时间渲染渲染一次

// 声明一个变量表示render()函数被多次调用累积时间

// 如果执行一次renderer.render,timeS重新置0

var timeS = 0;

export default {

  components: {},

  data() {

    return {

      animationId: null,

      elem: null,

      scene: null,

      // mesh: null, //网格模型对象

      camera: null, //相机对象

      renderer: null, //渲染器对象

      loader: null,

      controls: null,

      publicPath: process.env.BASE_URL // public

    };

  },

  beforeDestroy() {

    this.destroyModel();

  },

  created() {},

  mounted() {

    // 初始化模型

    this.initModel(`${this.publicPath}static/models/pcd/Zaghetto.pcd`, "three")

  },
methods: { initModel(pcdPath, domName) { console.log("开始初始化模型文件"); this.elem = document.getElementById(domName); // 相机CanvasRenderer this.camera = new THREE.PerspectiveCamera( 30, // 视野 this.elem.clientWidth / this.elem.clientHeight, // 纵横比 0.1, // 近平面 1000 // 远平面 ); // 渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true }); this.renderer.setClearColor(new THREE.Color(0x303030)); // 背景色 this.renderer.setSize(this.elem.clientWidth, this.elem.clientHeight); this.elem.appendChild(this.renderer.domElement); this.scene = new THREE.Scene(); // 场景 this.loader = new PCDLoader(); //PCD加载器 const THIS = this; //第一层 捕捉报错 try { //加载PCD文件 THIS.loader.load( pcdPath, function(points) { // console.log(points); // 模型点位大小 // points.material.size = 0.02; points.material.color = new THREE.Color(0x00ffff); // 模型颜色 THIS.scene.add(points); // 构造盒子 var middle = new THREE.Vector3(); points.geometry.computeBoundingBox(); points.geometry.boundingBox.getCenter(middle); points.applyMatrix4( new THREE.Matrix4().makeTranslation( -middle.x, -middle.y, -middle.z ) ); // 比例 var largestDimension = Math.max( points.geometry.boundingBox.max.x, points.geometry.boundingBox.max.y, points.geometry.boundingBox.max.z ); THIS.camera.position.y = largestDimension * 1; THIS.animate(); THIS.controls = new OrbitControls( THIS.camera, THIS.renderer.domElement ); THIS.controls.addEventListener("change", THIS.animate); // 监听鼠标、键盘事件 放大缩小等 }, function(xhr) { // console.log((xhr.loaded / xhr.total) * 100 + "% loaded"); },
//第二层 捕捉报错
function(error) {
THIS.$Message.error("模型地址不对,请稍候再试!"); } ); } catch (error) {
THIS.$Message.error("模型地址不对,请稍候再试!"); } }, // 监听鼠标、键盘事件 放大缩小等 animate() {
this.animationId = requestAnimationFrame(this.animate); //.getDelta()方法获得两帧的时间间隔 var T = clock.getDelta(); timeS = timeS + T; // requestAnimationFrame默认调用render函数60次,通过时间判断,降低renderer.render执行频率 if (timeS > renderT) { // 控制台查看渲染器渲染方法的调用周期,也就是间隔时间是多少 // console.log(`调用.render时间间隔`, timeS * 1000 + "毫秒"); this.renderer.render(this.scene, this.camera); //执行渲染操作 //renderer.render每执行一次,timeS置0 timeS = 0; } }, // 销毁模型 destroyModel() { console.log("销毁模型"); clearTimeout(); try { this.scene.clear(); this.renderer.dispose(); this.renderer.forceContextLoss(); this.renderer.content = null; cancelAnimationFrame(this.animationId); // 去除animationFrame const gl = this.renderer.domElement.getContext("webgl"); gl && gl.getExtension("WEBGL_lose_context").loseContext(); console.log("销毁成功"); } catch (e) { console.log(e); console.log("销毁失败"); } } } }; </script>
<style scoped>
</style>

引用

Three.js中文网 www.webgl3d.cn/

GitHub上的Three.js github.com/mrdoob/thre…

3D模型文件下载,既有免费的也有收费的,加载较慢 free3d.com/

本文转载于:

https://juejin.cn/post/7126461520417914887

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

记录--Three.js的简单使用,Three.js在vue3.x中导入.pcd三维模型文件的更多相关文章

  1. 用node.js实现简单的web服务器

    node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node ...

  2. 原生js实现简单移动端轮播图

    最近项目不是很忙,自己就用原生js写了一个简单的移动端轮播图的小demo,可实现自动轮播和手势滑动轮播,然后就把它记录到个人博客里.还有很多不足的地方,希望多多指出,以便改进. 1.代码部分 分为四个 ...

  3. JS异常简单处理

    有时候JS某一处报错会导致整个页面JS的运行出问题,于是想的简单研究一下JS的错误处理机制.更详细的可以自己参考网站研究:   https://developer.mozilla.org/zh-CN/ ...

  4. Centos7 中 Node.js安装简单方法

    最近,我一直对学习Node.js比较感兴趣.下面是小编给大家带来的Centos7 中 Node.js安装简单方法,在此记录一下,方便自己也方便大家,一起看看吧! 安装node.js 登陆Centos ...

  5. 基于Babylon.js编写简单的骨骼动画生成器

    使用骨骼动画技术可以将网格的顶点分配给若干骨头,通过给骨头设定关键帧和父子关系,可以赋予网格高度动态并具有传递性的变形 效果.这里结合之前的相关研究在网页端使用JavaScript实现了一个简单的骨骼 ...

  6. 对js原型简单的理解和图解

    对js原型简单的理解和图解 最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下. 1.prototype prototype:是一个函数的 ...

  7. js实现简单的俄罗斯方块小游戏

    js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...

  8. 原生JS封装简单动画效果

    原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...

  9. HTML(.js) – 最简单的方式操作 DOM 的 JS 库

    HTML(.js) 是一个轻量的(压缩后~2kb) JavaScript 库,简化了与 DOM 交互的方法. 这个 JavaScript 库的方法可读性很好,并具有搜索和遍历 DOM 的方法.相比 j ...

  10. Sea.js提供简单、极致的模块化开发体验

    为什么使用 Sea.js ? Sea.js 追求简单.自然的代码书写和组织方式,具有以下核心特性: 简单友好的模块定义规范:Sea.js 遵循 CMD 规范,可以像 Node.js 一般书写模块代码. ...

随机推荐

  1. Git操作--Pycharm

    声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 一--在idea中配置git: 1. 更改git的安装路径:file-->settings,找到versio ...

  2. 【架构师视角系列】QConfig配置中心系列之架构设计(一)

    目录 声明 配置中心系列文章 一.架构 基础模型 架构图 架构分层 运行规则 模块划分 Admin模块 Client模块 Server模块 二.总结 三.最后 声明 原创文章,转载请标注.https: ...

  3. JS 一篇文章弄懂Object.defineProperty,现学现用,来试试相关笔试题吧

    壹 ❀ 引 早在大半年前,掘金某位用户分享的面试题整理中有一题,简述let与const区别,你能自己模拟实现它们吗?,题目意思大概如此,时间久远我也很难找到那篇文章,当时看到此题对于const实现我的 ...

  4. UVA11573 Ocean Currents

    题目链接 题目 见链接. 题解 知识点:BFS. 这道题显然用BFS,但发现洋流方向会破坏时间的有序性,但注意到洋流时间花费是 \(0\) ,因此只需要用双端队列即可,洋流方向扩展直接放队头,其他方向 ...

  5. Vdbench 使用说明

    一. vdbench简介 vdbench是一个 I/O 工作负载生成器,用于验证数据完整性和度量直接附加和网络连接的存储的性能.它是一个免费的工具,容易使用,而且常常用于测试和基准测试. 可以使用vd ...

  6. 面试官:谈一谈你对 redis 分布式锁的理解

    ​为什么需要分布式锁 在 jdk 中为我们提供了多种加锁的方式: (1)synchronized 关键字 (2)volatile + CAS 实现的乐观锁 (3)ReadWriteLock 读写锁 ( ...

  7. eslint+prettier 统一代码风格

    1.实现效果 Eslint校验代码语法,prettier统一格式化代码,按下保存自动修复eslint错误,自动格式化代码. 2.安装vscode插件 Vetur ESLint Prettier - C ...

  8. 3分钟总览微软TPL并行编程库

    有小伙伴问我每天忽悠的TPL是什么?☹️ 这次站位高一点,严肃讲一讲. 引言 俗话说,不想开飞机的程序员不是一名好爸爸:作为微软技术栈的老鸟,一直将代码整洁之道奉为经典, 优秀的程序员将优雅.高性能的 ...

  9. 项目实战:Qt+iMax6生命探测仪(探测障碍物、静止目标、动态目标、生命目标、探测半径、探测前方雷达显示、动态目标轨迹显示、探测热力图、探测过程存储与回放)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110994486长期持续带来更多项目与技术分享, ...

  10. 【Azure 环境】Azure 流分析服务(Steam Analytics) 报出 OutputDataConversionError 错误引起延迟及超时

    问题描述 Azure 流分析服务(Steam Analytics) 报出 OutputDataConversionError 错误引起延迟及超时. 查看详细错误: 问题解答 在错误消息中,有非常明确的 ...