最近公司有一个需要用到3D模型的项目,所以就学习了一下,在这里小小的记录一下

下载依赖

npm i three -D
npm i three-obj-mtl-loader -D
npm i three-orbit-controls

导入依赖

import * as THREE from “three”;
import { OBJLoader, MTLLoader } from “three-obj-mtl-loader”;
import { GLTFLoader } from “three/examples/jsm/loaders/GLTFLoader”;
import {DDSLoader} from “three/examples/jsm/loaders/DDSLoader”;
import { CSS2DRenderer, CSS2DObject } from “three-css2drender”;
import { AmbientLight, LightShadow } from “three”;
const OrbitControls = require(“three-orbit-controls”)(THREE);

项目结构

依赖的版本

案例代码

这个地方有一个需要注意的位置就是在加载模型的时候的依赖 three-obj-mtl-loader 有所更新需要在node_modules文件夹下找到这个依赖修改index.js文件 修改为这样

还有一个点需要注意,就是材质包的导入路径问题

还有一个就是模型需要放到项目的根目录下和public下

<template><div id="container"></div>
</template>
<script>
import * as THREE from "three";
import { OBJLoader, MTLLoader } from "three-obj-mtl-loader";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import {DDSLoader} from "three/examples/jsm/loaders/DDSLoader";
import { CSS2DRenderer, CSS2DObject } from "three-css2drender";
import { AmbientLight, LightShadow } from "three";
const OrbitControls = require("three-orbit-controls")(THREE);
export default {name: "vue-three",data() {return {scene: null,camera: null,renderer: null,};},methods: {// 初始化场景init() {let container = document.getElementById("container");/* 场景*/this.scene = new THREE.Scene();/* 相机*/this.camera = new THREE.PerspectiveCamera(30,container.clientWidth / container.clientHeight,1,1000);this.camera.position.z = 50;/* 渲染器*/this.renderer = new THREE.WebGLRenderer({ antialias: true });this.renderer.setSize(container.clientWidth, container.clientHeight);this.renderer.setClearColor(0xb9d3ff, 1);container.appendChild(this.renderer.domElement);new OrbitControls(this.camera, this.renderer.domElement);},// 加载模型loadObj() {let manager = new THREE.LoadingManager();manager.addHandler( /\.dds$/i, new DDSLoader());new MTLLoader(manager).setPath("/model/male02/").load("male02.mtl", (materials) => {console.log(manager);materials.preload();new OBJLoader(manager).setMaterials(materials).load("/model/male02/male02.obj", (obj) => {console.log(obj.children[0].material);obj.scale.set(0.09, 0.09, 0.09);obj.position.set(0, -7, 0);this.scene.add(obj);});});// new GLTFLoader().load("/model/Duck/Duck.gltf", (obj) => {//   console.log(obj);//   this.scene.add(obj.scene);//   obj.scene.scale.set(5, 5, 5);// });},// 灯光效果light() {//添加聚光灯光源/*       let light = new THREE.SpotLight(0xffffff);light.position.set(-40, 60, -10);light.castShadow = true;light.shadow.mapSize.width = 2048;light.shadow.mapSize.height = 2048; */let light = new THREE.DirectionalLight(0xdfebff, 0.45); //从正上方(不是位置)照射过来的平行光,0.45的强度light.position.set(50, 200, 100);light.position.multiplyScalar(0.3);this.scene.add(light);//添加环境光let ambientLight = new THREE.AmbientLight("#ffffff");this.scene.add(ambientLight);},// 动画效果animate() {requestAnimationFrame(this.animate);this.renderer.render(this.scene, this.camera);},},mounted() {this.init();this.loadObj();this.light();this.animate();},
};
</script><style scoped>
#container {width: 800px;margin: 0 auto;height: 500px;overflow: hidden;
}
</style>

可能出现的问题

1、模型是加载出来是黑色的
问题可能是没有加光源,可以尝试加一下环境光
2、材质包加载不出来
检测一下文件的路径,可以F12一下看看材质包有没有加载出来,文件的加载路径是不是写错了加载出来的话是这个效果

3、如果没有报错的话,材质包也加载出来了可以试试调整模型的大小和位置


还有一种比较简单的是使用vue-3d-model这个我下一篇文章会说,但是有一个缺点就是有比较严重的阴影问题

three的效果

vue-3d-model的效果

我自己写的Demo的地址可以自己下下来看看借鉴一下使用的是vue3.0

项目地址

vue中使用three.js导入外部3D模型相关推荐

  1. 【uni-app】只支持在微信小程序运行的 导入外部3d模型

    1.解决问题 uniapp 导入3d模型,在微信小程序端运行.只支持在微信小程序端使用,若要支持 h5 和 APP端,可以查看这篇,点击这里 只导入了3d模型,未设置让模型动. 2.导入模型格式 gl ...

  2. uniapp vue3中引入外部3D模型(适配App)

    uniapp vue3中引入外部3D模型(适配App) 主要方式是通过renderjs来实现的, 因为使用threejs的话需要获取页面上的dom节点, 然后需要把threejs创建出来的canvan ...

  3. Vue 中引用第三方js总结

    vue中引用第三方js总结 By:授客 QQ:1033553122 实践环境 win10 Vue 2.9.6 本文以引用jsmind为例,讲解怎么在vue中引用第三方js类库 基础示例 1.把下载好的 ...

  4. vue中config/index.js:配置的详细理解

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) 1 2 3 4 5 6 7 8 9 10 11 12 ...

  5. 如何在 Vue 中使用 Chart.js - 手把手教你搭可视化数据图表

    本文首发:<如何在 Vue 中使用 Chart.js - 手把手教你搭可视化数据图表> 使用 Chart.js 在 Vue 搭建的后台管理工具里添加炫酷的图表,是所有数据展示类后台必备的功 ...

  6. 在vue中使用three.js

    vue中使用three.js vue 安装: npm install --save three 在要使用的页面中引入three.js import * as Three from 'three' 参考 ...

  7. vue js 定义对象_JS标准内置对象Proxy及Vue中的proxy.js文件

    昔登铜井望法华,葱茏螺黛浮蒹葭.今登法华望铜井,湖水迷茫烟色瞑.-- <登法华寺山顶> Proxy是什么 Proxy是JS标准内置对象中的一个对象.用于创建一个对象的代理.从而实现对对象操 ...

  8. vue中解决three.js出现内存泄漏丢失上下文问题

    vue中解决three.js出现内存泄漏丢失上下文问题 参考文章: (1)vue中解决three.js出现内存泄漏丢失上下文问题 (2)https://www.cnblogs.com/lichuank ...

  9. vue中使用raphael.js实现地图绘制

    一.效果图 二.在vue中引入raphael.js npm i raphael -S 三.封装一个名为StreetMap的组件,代码如下 1 <template> 2 <div> ...

最新文章

  1. 微软亚研院提出用于语义分割的结构化知识蒸馏 | CVPR 2019
  2. 什么?分布式事务现在不是都在用么?你还不会?
  3. Redis server went away的解决方案
  4. JavaScript引用方法说明
  5. Netty 在 Dubbo 中是如何应用的?
  6. mysql服务器性能剖析,高性能MySQL–服务器性能剖析
  7. python socket编程详细介绍
  8. JVM上的下一个Java——Scala
  9. 报错java.lang.NoClassDefFoundError: ognl/DefaultMemberAccess
  10. 有哪些越早知道越好的人生经验?
  11. LINUX 文件夹打包
  12. 注册测绘师复习方法,注册测绘师考试心得
  13. 欢迎使用CSDN-markdown编辑器231
  14. Java小程序之你画我猜
  15. 电脑如何录制在线课程?-QVE屏幕录制
  16. 盖茨开始闭关修炼 冥思微软之大未来
  17. android 寺库trytry_人民日报中秋福利 寺库trytry红包刷爆朋友圈背后的秘密
  18. 《穷查理宝典》精度步骤
  19. 为什么要做用户行为分析,怎么做好用户行为分析?
  20. 基于K-means算法的客户分群知识

热门文章

  1. mysql 毫秒转换为天时分秒
  2. 几种经典非线性滤波算法简单概括(EKF,UKF,CKF,PF)
  3. 【操作系统】30天自制操作系统--(27)文件操作
  4. 30天自制操作系统_序
  5. urdf、xacro、sdf三种文件的转换
  6. 触摸屏“G+G、G+P、G+F”是什么意思?
  7. 鱼c论坛 python课后题pdf_全套55讲 鱼c论坛小甲鱼python课后题.pdf
  8. 系统架构设计笔记(103)—— 标准化知识
  9. 如何利用在vue中echart 生成全国、省、市地图
  10. EAV/ESS 8.x 自定义服务器正确方法+更新服务器列表