前言:最近用vue+threre.js实现3d页面的时候,发现导入obj模型时模型在页面中显示不出来的问题。也纠结了好几天,换了好几种方式去试,到底是模型有问题还是代码有问题?真是个令人头痛的问题啊!

一、关于obj模型存放的目录

  • 这里我用的vue是4.x版本的。
  • 在vue中存放obj模型必须要放在静态资源(static)文件下,否则会出错。
  • 由于4.x版本的vue没有static这个文件夹,但是他的静态资源文件夹是叫public,这样我在public下面创建一个文件夹叫static,再在static文件夹下存放的我的obj模型文件以及mtl文件。
  • 文件目录如下:

二、关于obj模型的导入

直接上代码吧:

<template><div id="academy"></div>
</template><script>
import * as THREE from "three";
import {OBJLoader,MTLLoader} from "three-obj-mtl-loader";
const OrbitControls = require('three-orbit-controls')(THREE);
export default {name:'academy',data(){return{}},methods: {/**加载模型 */loadPlant() {let that = this;let objLoader = new OBJLoader();let mtlLoader = new MTLLoader();mtlLoader.load("/static/academic/bluegrayhome.mtl", function(materials) {// materials.preload();objLoader.setMaterials(materials);objLoader.load("/static/academic/bluegrayhome.obj",function(obj) {obj.position.set(0, 0,0);obj.scale.set(0.01, 0.01, 0.01);that.scene.add(obj);},//   called while loading is progressingfunction(xhr) {console.log((xhr.loaded / xhr.total) * 100 + "% loaded");},//   called when loading has errorsfunction(error) {console.log("An error happened");});});},},mounted() {this.loadPlant();}
}
</script>

这里关于相机,场景等初始化的内容没有放上去。

在导入obj之前还要 npm install three-obj-mtl-loader,并在组件中引入。

三、关于obj模型显示不出来的问题

敲黑板,这个问题真的是!!!!!一言难尽!!!

在我的这里obj模型已经是加载出来了,但就是在页面中显示不出来,也就是我看不到它!!!!

那这是为什么呢?为什么显示不出来呢?于是我又发现控制台中报了warnings,起初我以为是这个warning的问题,可后来经过多种方法的调试发现并不是这个问题。

于是乎我又开始崩溃了,怎么就是看不到呢?后来我又以为是模型太大的问题,但其实并不是。一次偶然我向页面中添加了轨道控制器,使场景可以旋转起来,然后我就发现!!!!!原来我的模型一直都在,只是它在我看不到的地方!!也就是我的相机根本照不到我的物体,所以我什么也看不到。(不要问我为什么起初没考虑这个问题,其实我也考虑过是不是相机位置的问题,我还进行了调试,但还是没用,直到我添加了控制器,一转才发现问题的所在)。

控制器的代码如下:

// 初始化控制器initOrbitControls(){let controls = new OrbitControls(this.camera,this.renderer.domElement);controls.enableDamping = true;controls.enableZoom = true;controls.autoRotate = false;controls.autoRotateSpeed = 3;controls.enablePan = true;controls.enableKeys = true;controls.keyPanSpeed = 7;controls.keys = {LEFT:37,UP:38,RIGHT:39,BOTTOM:40}this.controls =controls;},

只需要把这个函数写在methods方法里就可以了,然后再去调用它。

只要一转就可以看到模型了。


四、总结

如果obj模型出不来可以看看:

  1. 是不是没有把模型放在静态目录下
  2. 是不是相机没有照到物体
  3. 是不是引用的路径有问题
  4. 场景和相机是否已经加载出来了

其实问题有很多,关键在于怎么去发现问题的所在,是在不行的话就多试试咯。加个控制器再加个坐标轴。

完整代码如下:

<template><div id="academy"></div>
</template><script>
import * as THREE from "three";
import {OBJLoader,MTLLoader} from "three-obj-mtl-loader";
const OrbitControls = require('three-orbit-controls')(THREE);
export default {name:'academy',data(){return{scene:'',light:'',camera:'',renderer:'',}},methods: {/**初始化 */initScene() {this.scene = new THREE.Scene();const ambientLight = new THREE.AmbientLight(0xcccccc, 0.4);this.scene.add(ambientLight);var axesHelper = new THREE.AxesHelper(15);this.scene.add(axesHelper);},initCamera() {const aspect = window.innerWidth / innerHeight; //宽高可根据实际项目要求更改 如果是窗口高度改为innerHeightthis.camera = new THREE.PerspectiveCamera(45, aspect, 1, 1000);this.camera.position.set(15, 25, 20);this.camera.lookAt(new THREE.Vector3(0, 0, 0)); // 让相机指向原点const pointLight = new THREE.PointLight(0xffffff,1,100);pointLight.position.set(0,0,20100);this.scene.add(pointLight);this.scene.add(this.camera);},initRenderer() {this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });this.renderer.setPixelRatio(window.devicePixelRatio);this.renderer.setSize(window.innerWidth, innerHeight);this.container = document.getElementById("academy");this.container.appendChild(this.renderer.domElement);},// 初始化控制器initOrbitControls(){let controls = new OrbitControls(this.camera,this.renderer.domElement);controls.enableDamping = true;controls.enableZoom = true;controls.autoRotate = false;controls.autoRotateSpeed = 3;controls.enablePan = true;controls.enableKeys = true;controls.keyPanSpeed = 7;controls.keys = {LEFT:37,UP:38,RIGHT:39,BOTTOM:40}this.controls =controls;},animate() {this.renderer.render(this.scene, this.camera);this.requestId = requestAnimationFrame(this.animate);},init() {this.group = new THREE.Group();this.initScene();this.initCamera();this.initRenderer();this.initOrbitControls();},/**加载模型 */loadPlant() {let that = this;let objLoader = new OBJLoader();let mtlLoader = new MTLLoader();mtlLoader.load("/static/academic/bluegrayhome.mtl", function(materials) {// materials.preload();objLoader.setMaterials(materials);objLoader.load("/static/academic/bluegrayhome.obj",function(obj) {obj.position.set(0, 0,0);obj.scale.set(0.01, 0.01, 0.01);that.scene.add(obj);},//   called while loading is progressingfunction(xhr) {console.log((xhr.loaded / xhr.total) * 100 + "% loaded");},//   called when loading has errorsfunction(error) {console.log("An error happened");});});},loadPlant2() {let that = this;let objLoader = new OBJLoader();let mtlLoader = new MTLLoader();mtlLoader.load("/static/academic/绿树2.mtl", function(materials) {// materials.preload();objLoader.setMaterials(materials);objLoader.load("/static/academic/绿树2.obj",function(obj) {obj.position.set(0, 0,0);obj.scale.set(0.01, 0.01, 0.01);that.scene.add(obj);},//   called while loading is progressingfunction(xhr) {console.log((xhr.loaded / xhr.total) * 100 + "% loaded");},//   called when loading has errorsfunction(error) {console.log("An error happened");});});},loadPlant3() {let that = this;let objLoader = new OBJLoader();let mtlLoader = new MTLLoader();mtlLoader.load("/static/academic/绿树1.mtl", function(materials) {// materials.preload();objLoader.setMaterials(materials);objLoader.load("/static/academic/绿树1.obj",function(obj) {obj.position.set(10, 10,0);obj.scale.set(0.01, 0.01, 0.01);that.scene.add(obj);},//   called while loading is progressingfunction(xhr) {console.log((xhr.loaded / xhr.total) * 100 + "% loaded");},//   called when loading has errorsfunction(error) {console.log("An error happened");});});},},mounted() {this.init();this.loadPlant();this.loadPlant2();this.loadPlant3();this.animate();document.getElementsByTagName("canvas")[0].style.verticalAlign = "bottom"; //解决canvas底部留白问题// window.addEventListener("click", this.clickModel, false);// window.addEventListener("resize", this.onResize, false);},
}
</script><style scoped>
#academy{height: 600px;
}
</style>

vue+three.js导入obj模型不显示问题相关推荐

  1. 【Three.js】解决使用Three.js导入obj模型不可见问题详细记录

    问题描述: 近期在做三维重建项目,需要把最终生成的obj文件导入到web端浏览,这里使用的是three.js(另一个是babylon.js),但博主发现导入meshlab生成的obj时无法显示模型,但 ...

  2. zbrush导入obj模型不显示_ZBrush中如何导入和导出OBJ文件—ZBrush教程

    原标题:ZBrush中如何导入和导出OBJ文件-ZBrush教程 ZBrush中如何导入和导出OBJ文件 ZBrush软件中对于文件的导出与储存格式是多样的.OBJ格式是如何导入和导出ZBrush的, ...

  3. 使用three.js导入OBJ模型,变更、修改成其他OBJ模型和模型不可见原因说明

    最近的一个项目需要在HTML中对OBJ模型进行大量的变更,修改为其他模型.基于这个需求下,这里有一种解决方案. 另外在各大论坛上的相关博客基本都是那几种导入obj例子····并没有对后续操作进行说明. ...

  4. zbrush导入obj模型不显示_zbrush软件怎么导入obj格式文件?Zbrush2018教程在哪可以看?...

    回答: 关于ZBrush的学习,我大致整理了一些经常会被问到的问题和我的见解,可以参考一下. Q1:次世代ZB到底难不难?因为技术要求的全面升级,次世代确实不简单,但是新手能不能学习次世代呢? A1: ...

  5. Java 3D导入obj模型后颜色显示 出错显示白色,或者笔记本电脑显示彩色,但是台式机仍为白色

    Java 3D导入obj模型后颜色显示 出错显示白色,或者笔记本电脑显示彩色,但是台式机仍为白色 代码问题 首先,确保代码中编辑了给模型导入颜色 //function:读取.obj文件,并将其添加到S ...

  6. 解决在OpenGL中导入.obj模型所遇一些问题的方法

    解决在OpenGL中导入.obj模型所遇一些问题的方法 相对路径格式 "/"与"\" 相对路径起始 导入模型的限制 最近在学习 LearnOpenGL CN,学 ...

  7. Adams导入SW模型不显示

    Adams导入SW模型不显示 将模型在SOLIDWORKS中绘制完成后导入到Adams进行运动仿真,SW的模型在树中有显示,但是在界面上怎么都看不到,应该如何处理呢? 导入SW模型到Adams中,首先 ...

  8. 解决导入obj模型时出现模型镂空的问题

    解决导入obj模型时出现模型镂空的问题 这实际上是因为导入的模型采用四边形而非三角形的面片,导致splish采样不全. 使用houdini的divide节点就能将任意面片转化为三角形面片.从而解决问题 ...

  9. 67 Three.js 导入OBJ格式的模型

    简介 OBJ是一种简单的三维文件格式,由Wavefront Technologies创建.它是使用最广泛的三维文件格式,用来定义对象的几何体.MTL文件常同OBJ文件一起使用. Three.js还有一 ...

  10. linaCharts开发笔记:Three.js导入obj和使用中文

    直接进入主题,首先是导入中文字体,Three.js自带只支持显示3D的英文,如果需要使用中文,需要自己导入. 一.选一个你喜欢的字体,也就是ttf文件,尽量选小一点的,不然转换成的js文件也会非常大. ...

最新文章

  1. 2021fall Broadway Tech校招
  2. Field Service Center Customization
  3. 需求分析中应该注意的问题
  4. C++虚析构和纯虚析构
  5. MFC 问题集(4)CListCtrl
  6. 根据extension field搜索product的技术实现
  7. 智能机器人及其应用ppt课件_一文了解!伺服系统机理及其在工业机器人等领域的应用...
  8. 用于检测敏感词的 PHP 扩展
  9. Java学习笔记2.1.3 Java基本语法 - Java关键字与标识符
  10. PowerDesigner--创建概念数据模型;并生成逻辑数据模型/物理数据模型/数据库SQL脚本
  11. linux vsftp 无法上传文件,解决vsftp 不能匿名上传文件的问题
  12. java中class文件反编译_java中的.class文件反编译
  13. linux未找到 ftp命令,Linux服务器ftp命令找不到
  14. Grafana 8重磅发布:统一警报、实时流、继续炫酷到底!
  15. mysql information_schema库结构
  16. 摩羯座 计算机专业,为什么说摩羯座是一个很“作”的星座?
  17. 光学变焦----景深=景深远界-景深近界
  18. Spring Security Oauth2 JWT----单点登录、注销、续签的问题
  19. 作为传送信息的公共通道 微型计算机的系统,微型计算机的系统总线是CPU与其他部件之间传送( )信息的公共通道...
  20. 数字体验词汇表:您需要了解的最重要术语

热门文章

  1. 大学四年,我是怎么靠做外包私活赚了10w+,实现经济独立
  2. python界面设计实例qt_Python GUI教程(六):使用Qt设计师进行窗口布局
  3. php根据经纬度获取地理位置
  4. 百度地图生成器添加标注后图标不显示的解决方法
  5. iphone手机投屏到电脑 苹果手机不知道的功能
  6. 机器学习与深度学习入门篇
  7. 线性链表的建立与插入-----数据结构与算法笔记
  8. 直线检测-Radon变换、Hough变换
  9. 泛型编程基础知识详解
  10. 算法入门 13.并查集