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


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

    本文说明

    本文主要简单介绍了,在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

    1. npm install three@0.128.0
    2. npm install three-orbit-controls
    3. npm i --save three-css2drender

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

    npm install --save three@0.128.0 three-orbit-controls three-css2drender
    
    第四步

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

    1. <template>
    2. <div style="height: 100%; width: 100%">
    3. <div id="three" style="height: 100%; width: 100%"></div>
    4. </div>
    5. </template>
    6. <script>
    7. // 引入Three.js
    8. import * as THREE from "three";
    9. // 引入PCD加载器
    10. import { PCDLoader } from "three/examples/jsm/loaders/PCDLoader.js"; // 注意是examples/jsm
    11. // 引入模型控制器
    12. import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; // 放大缩小旋转等控制操作
    13. // 创建一个时钟对象Clock
    14. var clock = new THREE.Clock();
    15. // 设置渲染频率为30FBS,也就是每秒调用渲染器render方法大约30
    16. var FPS = 30;
    17. var renderT = 1 / FPS; //单位秒 间隔多长时间渲染渲染一次
    18. // 声明一个变量表示render()函数被多次调用累积时间
    19. // 如果执行一次renderer.render,timeS重新置0
    20. var timeS = 0;
    21. export default {
    22. components: {},
    23. data() {
    24. return {
    25. animationId: null,
    26. elem: null,
    27. scene: null,
    28. // mesh: null, //网格模型对象
    29. camera: null, //相机对象
    30. renderer: null, //渲染器对象
    31. loader: null,
    32. controls: null,
    33. publicPath: process.env.BASE_URL // public
    34. };
    35. },
    36. beforeDestroy() {
    37. this.destroyModel();
    38. },
    39. created() {},
    40. mounted() {
    41. // 初始化模型
    42. this.initModel(`${this.publicPath}static/models/pcd/Zaghetto.pcd`, "three")
    43. },
    44. methods: {
    45. initModel(pcdPath, domName) {
    46. console.log("开始初始化模型文件");
    47. this.elem = document.getElementById(domName);
    48. // 相机CanvasRenderer
    49. this.camera = new THREE.PerspectiveCamera(
    50. 30, // 视野
    51. this.elem.clientWidth / this.elem.clientHeight, // 纵横比
    52. 0.1, // 近平面
    53. 1000 // 远平面
    54. );
    55. // 渲染器
    56. this.renderer = new THREE.WebGLRenderer({
    57. antialias: true,
    58. alpha: true
    59. });
    60. this.renderer.setClearColor(new THREE.Color(0x303030)); // 背景色
    61. this.renderer.setSize(this.elem.clientWidth, this.elem.clientHeight);
    62. this.elem.appendChild(this.renderer.domElement);
    63. this.scene = new THREE.Scene(); // 场景
    64. this.loader = new PCDLoader(); //PCD加载器
    65. const THIS = this;
    66. //第一层 捕捉报错
    67. try {
    68. //加载PCD文件
    69. THIS.loader.load(
    70. pcdPath,
    71. function(points) {
    72. // console.log(points);
    73. // 模型点位大小
    74. // points.material.size = 0.02;
    75. points.material.color = new THREE.Color(0x00ffff); // 模型颜色
    76. THIS.scene.add(points);
    77. // 构造盒子
    78. var middle = new THREE.Vector3();
    79. points.geometry.computeBoundingBox();
    80. points.geometry.boundingBox.getCenter(middle);
    81. points.applyMatrix4(
    82. new THREE.Matrix4().makeTranslation(
    83. -middle.x,
    84. -middle.y,
    85. -middle.z
    86. )
    87. );
    88. // 比例
    89. var largestDimension = Math.max(
    90. points.geometry.boundingBox.max.x,
    91. points.geometry.boundingBox.max.y,
    92. points.geometry.boundingBox.max.z
    93. );
    94. THIS.camera.position.y = largestDimension * 1;
    95. THIS.animate();
    96. THIS.controls = new OrbitControls(
    97. THIS.camera,
    98. THIS.renderer.domElement
    99. );
    100. THIS.controls.addEventListener("change", THIS.animate); // 监听鼠标、键盘事件 放大缩小等
    101. },
    102. function(xhr) {
    103. // console.log((xhr.loaded / xhr.total) * 100 + "% loaded");
    104. },
    105. //第二层 捕捉报错
    106. function(error) {
    107. THIS.$Message.error("模型地址不对,请稍候再试!");
    108. }
    109. );
    110. } catch (error) {
    111. THIS.$Message.error("模型地址不对,请稍候再试!");
    112. }
    113. },
    114. // 监听鼠标、键盘事件 放大缩小等
    115. animate() {
    116. this.animationId = requestAnimationFrame(this.animate);
    117. //.getDelta()方法获得两帧的时间间隔
    118. var T = clock.getDelta();
    119. timeS = timeS + T;
    120. // requestAnimationFrame默认调用render函数60次,通过时间判断,降低renderer.render执行频率
    121. if (timeS > renderT) {
    122. // 控制台查看渲染器渲染方法的调用周期,也就是间隔时间是多少
    123. // console.log(`调用.render时间间隔`, timeS * 1000 + "毫秒");
    124. this.renderer.render(this.scene, this.camera); //执行渲染操作
    125. //renderer.render每执行一次,timeS0
    126. timeS = 0;
    127. }
    128. },
    129. // 销毁模型
    130. destroyModel() {
    131. console.log("销毁模型");
    132. clearTimeout();
    133. try {
    134. this.scene.clear();
    135. this.renderer.dispose();
    136. this.renderer.forceContextLoss();
    137. this.renderer.content = null;
    138. cancelAnimationFrame(this.animationId); // 去除animationFrame
    139. const gl = this.renderer.domElement.getContext("webgl");
    140. gl && gl.getExtension("WEBGL_lose_context").loseContext();
    141. console.log("销毁成功");
    142. } catch (e) {
    143. console.log(e);
    144. console.log("销毁失败");
    145. }
    146. }
    147. }
    148. };
    149. </script>
    150. <style scoped>
    151. </style>

    引用

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

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

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

    本文转载于:

    https://juejin.cn/post/7126461520417914887

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

     

  • 相关阅读:
    磨金石教育摄影技能干货分享|那些酷炫的照片是怎么拍出来的?
    基于症状自评量表SCL90的人才测评之心理素质测验
    大漠插件的使用过程(一、插件的注册)
    消息队列 RabbitMQ入门:Linux(Docker)中安装和卸载RabbitMQ服务
    使用Docker+PHP搭建苹果Maccms的影视站详细教程
    JS - 防抖与节流
    #gStore-weekly | SPARQL 执行过程中高级查询函数的求值(下)
    php ci 框架准备工作
    Docker 之 基础篇(安装、卸载、阿里云镜像加速、常用命令、发布、应用安装)
    Java (day 3)方法、数组、面向对象和异常
  • 原文地址:https://blog.csdn.net/qq_40716795/article/details/126550497