vue+three.js导入obj模型不显示问题
前言:最近用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模型出不来可以看看:
- 是不是没有把模型放在静态目录下
- 是不是相机没有照到物体
- 是不是引用的路径有问题
- 场景和相机是否已经加载出来了
其实问题有很多,关键在于怎么去发现问题的所在,是在不行的话就多试试咯。加个控制器再加个坐标轴。
完整代码如下:
<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模型不显示问题相关推荐
- 【Three.js】解决使用Three.js导入obj模型不可见问题详细记录
问题描述: 近期在做三维重建项目,需要把最终生成的obj文件导入到web端浏览,这里使用的是three.js(另一个是babylon.js),但博主发现导入meshlab生成的obj时无法显示模型,但 ...
- zbrush导入obj模型不显示_ZBrush中如何导入和导出OBJ文件—ZBrush教程
原标题:ZBrush中如何导入和导出OBJ文件-ZBrush教程 ZBrush中如何导入和导出OBJ文件 ZBrush软件中对于文件的导出与储存格式是多样的.OBJ格式是如何导入和导出ZBrush的, ...
- 使用three.js导入OBJ模型,变更、修改成其他OBJ模型和模型不可见原因说明
最近的一个项目需要在HTML中对OBJ模型进行大量的变更,修改为其他模型.基于这个需求下,这里有一种解决方案. 另外在各大论坛上的相关博客基本都是那几种导入obj例子····并没有对后续操作进行说明. ...
- zbrush导入obj模型不显示_zbrush软件怎么导入obj格式文件?Zbrush2018教程在哪可以看?...
回答: 关于ZBrush的学习,我大致整理了一些经常会被问到的问题和我的见解,可以参考一下. Q1:次世代ZB到底难不难?因为技术要求的全面升级,次世代确实不简单,但是新手能不能学习次世代呢? A1: ...
- Java 3D导入obj模型后颜色显示 出错显示白色,或者笔记本电脑显示彩色,但是台式机仍为白色
Java 3D导入obj模型后颜色显示 出错显示白色,或者笔记本电脑显示彩色,但是台式机仍为白色 代码问题 首先,确保代码中编辑了给模型导入颜色 //function:读取.obj文件,并将其添加到S ...
- 解决在OpenGL中导入.obj模型所遇一些问题的方法
解决在OpenGL中导入.obj模型所遇一些问题的方法 相对路径格式 "/"与"\" 相对路径起始 导入模型的限制 最近在学习 LearnOpenGL CN,学 ...
- Adams导入SW模型不显示
Adams导入SW模型不显示 将模型在SOLIDWORKS中绘制完成后导入到Adams进行运动仿真,SW的模型在树中有显示,但是在界面上怎么都看不到,应该如何处理呢? 导入SW模型到Adams中,首先 ...
- 解决导入obj模型时出现模型镂空的问题
解决导入obj模型时出现模型镂空的问题 这实际上是因为导入的模型采用四边形而非三角形的面片,导致splish采样不全. 使用houdini的divide节点就能将任意面片转化为三角形面片.从而解决问题 ...
- 67 Three.js 导入OBJ格式的模型
简介 OBJ是一种简单的三维文件格式,由Wavefront Technologies创建.它是使用最广泛的三维文件格式,用来定义对象的几何体.MTL文件常同OBJ文件一起使用. Three.js还有一 ...
- linaCharts开发笔记:Three.js导入obj和使用中文
直接进入主题,首先是导入中文字体,Three.js自带只支持显示3D的英文,如果需要使用中文,需要自己导入. 一.选一个你喜欢的字体,也就是ttf文件,尽量选小一点的,不然转换成的js文件也会非常大. ...
最新文章
- 2021fall Broadway Tech校招
- Field Service Center Customization
- 需求分析中应该注意的问题
- C++虚析构和纯虚析构
- MFC 问题集(4)CListCtrl
- 根据extension field搜索product的技术实现
- 智能机器人及其应用ppt课件_一文了解!伺服系统机理及其在工业机器人等领域的应用...
- 用于检测敏感词的 PHP 扩展
- Java学习笔记2.1.3 Java基本语法 - Java关键字与标识符
- PowerDesigner--创建概念数据模型;并生成逻辑数据模型/物理数据模型/数据库SQL脚本
- linux vsftp 无法上传文件,解决vsftp 不能匿名上传文件的问题
- java中class文件反编译_java中的.class文件反编译
- linux未找到 ftp命令,Linux服务器ftp命令找不到
- Grafana 8重磅发布:统一警报、实时流、继续炫酷到底!
- mysql information_schema库结构
- 摩羯座 计算机专业,为什么说摩羯座是一个很“作”的星座?
- 光学变焦----景深=景深远界-景深近界
- Spring Security Oauth2 JWT----单点登录、注销、续签的问题
- 作为传送信息的公共通道 微型计算机的系统,微型计算机的系统总线是CPU与其他部件之间传送( )信息的公共通道...
- 数字体验词汇表:您需要了解的最重要术语