【Three.js】vue2导入pcd文件 PCDLoader

这篇具有很好参考价值的文章主要介绍了【Three.js】vue2导入pcd文件 PCDLoader。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、最终效果图

【Three.js】vue2导入pcd文件 PCDLoader

二、遇到的问题解决办法

1.资源加载不出

a.TypeError: Cannot read properties of null (reading '1')
    at parseHeader (PCDLoader.js?edd4:119:1)
    at PCDLoader.parse (PCDLoader.js?edd4:226:1)
    at Object.eval [as onLoad] (PCDLoader.js?edd4:34:1)
    at XMLHttpRequest.eval (three.module.js?5a89:34770:1)

【Three.js】vue2导入pcd文件 PCDLoader

b.GET http://localhost:8080/public/Zaghetto 404 (Not Found)【Three.js】vue2导入pcd文件 PCDLoader

两者本质同个问题,都是没有获取到pcd文件资源,第一个由于设置了vue-router,使他没有获取到后返回来index.html (官方文档https://router.vuejs.org/zh/guide/essentials/history-mode.html#html5-%E6%A8%A1%E5%BC%8F)

【Three.js】vue2导入pcd文件 PCDLoader
文件位置

404,我先检查了路径名称发现没拼写错误,后来尝试 public下其他常见类型文件可以,只有这个pcd文件不行,然后我就看了他们的请求网站,发现pcd文件的请求网址多了个‘/public',导致请求路径错误。

【Three.js】vue2导入pcd文件 PCDLoader

【Three.js】vue2导入pcd文件 PCDLoader

解决办法:

url直接不写public/直接从第二级开始写

【Three.js】vue2导入pcd文件 PCDLoader

2.bufferGeometry报错

three.module.js?5a89:10091 THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values. 

字面意思是 'radius'和'position'现在值为非数字

从threejs源码中找到 computeBoundingSphere(),通过断点,可以看出是由于这个maxRadiusSq值为NaN,然后这个值又是由于center.distanceToSquared(_vector$8)为NaN, 导致Math.max为NaN。这个值是由于 _vector$8.fromBufferAttribute(position, i)为NaN,顺藤摸瓜发现最终是因为position里有的值为NaN,position从哪里来?是导入的pcd文件。

【Three.js】vue2导入pcd文件 PCDLoader

【Three.js】vue2导入pcd文件 PCDLoader

解决办法:

a. Math.max(a,b)a,b中有一个NaN就返回NaN,所以可以将threejs源码中Math.max()替换成其它比大小方法

//maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(_vector$8));
//替换成
maxRadiusSq = center.distanceToSquared(_vector$8) > maxRadiusSq ? center.distanceToSquared(_vector$8) : maxRadiusSq

 b.pcd文件不要含NaN文章来源地址https://www.toymoban.com/news/detail-479758.html

三、最终代码

<template>
  <div
    v-loading="loading"
    element-loading-background="rgba(0, 0, 0, 0.8)"
    id="pcdcontainer"
    ref="pcdcontainer"
  ></div>
<!-- v-loding 是element Ui的 -->
</template>

<script>
import * as THREE from "three";
import { PCDLoader } from "three/examples/jsm/loaders/PCDLoader.js";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js"; 
export default {
  created () {
  },
  data () {
    return {
      elem: null,
      scene: null,
      camera: null, 
      renderer: null, 
      loader: null,
      controls: null,
      clock: new THREE.Clock(),
      loading: true,
      pointcloud: null,
    }
  },
  beforeMount () {

  },
  mounted () {
    this.init()
  },
  methods: {
    init () {
      this.elem = document.getElementById('pcdContainer');//获取要渲染的Dom
      // 相机
      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
        //加载PCD文件
        THIS.loader.load(
         'Zaghetto.pcd',
          function (points) {
            points.geometry.rotateX(0.5 * Math.PI);//旋转模型,可调
            points.material.color = new THREE.Color(0x00ffff); // 模型颜色
            THIS.scene.add(points);
            var middle = new THREE.Vector3();
            console.log(points.geometry);
            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 * 3;//相机位置,可调
            THIS.animate();
            //轨道控制器 旋转、平移、缩放
            THIS.controls = new OrbitControls(
              THIS.camera,
              THIS.renderer.domElement
            );
            THIS.controls.enableDamping = true;//旋转、平移开启阻尼
            THIS.controls.addEventListener("change", THIS.render); // 监听鼠标、键盘事件  
             放大缩小等

          },
            function (xhr) {
            let load = xhr.loaded / xhr.total
            if (load == 1) {
              THIS.loading = false
            }
          },
          function (error) {
            console.log(error);
          }
        );
    },
    render () {
      this.renderer.render(this.scene, this.camera);
    },
    animate () {
      let delta = this.clock.getDelta();
      if (this.controls) {
        this.controls.update(delta);
      }
      requestAnimationFrame(this.animate)
      this.render();
    },
  },
  computed: {},
  watch: {},
  filters: {},
  components: {}
}
</script>
<style scoped lang='scss'>
#pcdcontainer {
  width: 1920px;
  height: 1080px;
}
</style>

到了这里,关于【Three.js】vue2导入pcd文件 PCDLoader的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Vue2】引入本地原生JS文件

    日常开发的时候,第一个想法肯定是找现有的插件进行开发,在项目中npm install xxx 插件即可。但是也有无法使用的插件的情况,就需要我们引用我们本地的原生js。 自己写的文件或者别人的插件都可以通过下面的方式修改成vue能够识别的js。 字符操作文件 utils/str.js  在函数

    2024年02月16日
    浏览(33)
  • Blender Three.js 智慧3D机房开发 模型创建与导入中的常见问题与解决方案

    目录 机房效果展示 可能出现的问题及解决方法 Three. js服务器运行环境搭建及文件配置 使用Node.js搭建本地服务器 文件配置  Blender材质处理 Blender导出GLTF模型出现材质丢失 Three.js玻璃材质制作  Blender导出glTF格式模型 Three. js模型显示场景的设置 总结   机房正面图: 机房背面

    2024年02月05日
    浏览(43)
  • three.js实现点击事件(vue)

    1.加载模型(通过点击模型触发事件) 2.通过射线获取到事件源 (new THREE.Raycaster()和new THREE.Vector2()) 3.通过点击到该模型使用名字匹配 clickedObject.name==“xx” addEventListener监听事件触发 创建 Raycaster和Vector2 计算鼠标或触摸点的位置 (这里的event是通过事件监听获取) 更新射线

    2024年02月16日
    浏览(35)
  • 【案例】3D地球(vue+three.js)

    需要下载插件 有人找不到合适的地球平面图的话,可直接地球平面图

    2024年02月06日
    浏览(29)
  • vue2.x + element-ui提示:找不到node_modules/async-validator/es/index.js文件

    no such file or directory, open ‘xx/node_modules/async-validator/es/index.js’ 我按照提示确实没有在node_modules找到async-validator文件夹,本来是手动npm install了这个文件,但是发现找不到es文件夹了,所以就干脆又运行了一遍安装element-ui包的命令将这个漏掉的包补上了。

    2024年02月02日
    浏览(46)
  • Vue+Three.js建造3D小房子

    前言 一、Three.js简介 二、开发步骤 1.安装Three.js 2.创建容器 3.创建模型 总结 3D模型给人一种更真实的感受,带来极致的视觉体验。本文介绍Vue结合Three.js开发3D小房子,接触过OpenGL的小伙伴看起来会更轻松一点。 Three.js,一个WebGL引擎,基于JavaScript,可直接运行GPU驱动游戏与

    2024年02月07日
    浏览(29)
  • 【vue2.x】新手如何快速用vue导入GLTFLoader模型

    Three.js支持包括 .obj、.gltf等类型的模型结构。glTF(GL传输格式)是Khronos的一个开放项目,它为3D资产提供了一种通用的、可扩展的格式,这种格式既高效又与现代web技术高度互操作。 在需要使用3D模型的页面导入包: 在Vue中导入glTF模型需要使用 Three.js 中的 GLTFLoader: 在Vue中

    2024年02月07日
    浏览(34)
  • vue3项目中使用three.js

    在vue3项目中,通过three.js使用了一段短小但完整的代码实现了实际的三维效果图。 Three.js是一个轻量级,跨平台的Javascript库,可以在浏览器上结合HTML5的canvas,SVG或者WebGL,创建和展示3D模型和动画。 Three.js允许我们在不依赖任何浏览器插件的情况下,创建一个GPU加速的3D动画场

    2024年01月23日
    浏览(39)
  • three.js实现vr全景图(vue)

    方法: 可以利用Threejs中的立方体或者球体实现全景图功能,把立方体或球体当成天空盒子,将无缝衔接的图片贴上,看起来就像在一个场景中,相机一般放置在中央。 three.js中文网 1、立方体实现 立方体6个面要贴上6个方向的图片,这6个图片如下所示: 实现代码如下: 图片

    2024年02月12日
    浏览(31)
  • vue2.6及以下版本导入 TDesign UI组件库

    TDesign 官方文档:https://tdesign.tencent.com/vue/components/button 我们先打开一个普通的vue项目 然后 如果你是 vue 2.6 或者 低于 2.6 在终端执行 如果你是 2.7 或者更高 执行 这里 我们 以 2.6为例 因为大部分人 用vue2 都是选择 2.6 先引入一下依赖 然后 我们打开程序入口文件main.js 在里面加上

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包