vue使用three.js,并加载obj模型mtl贴图

一,下载相关插件

npm install three --save 

npm install three-obj-mtl-loader 

npm install three-orbit-controls  

二,建立一个带有坐标系的三维空间

1.引入插件

import * as THREE from "three";  //引入three.js  

import { OBJLoader, MTLLoader } from "three-obj-mtl-loader";   //引入加载外部模型

const OrbitControls = require("three-orbit-controls")(THREE);  //引入控制器

2.定义一个带有id的div

   <template>

  <div id="container" ref="container"></div>

</template>

3.自定义变量

data() {

    return {

      scene: null, // 场景

      camera: null, // 相机

      renderer: null, // 渲染

      controls: null, // 控制器

    };

  },

4.方法事件

//初始化环境

    initScene() {

      this.scene = new THREE.Scene();

      var axesHelper = new THREE.AxesHelper(15); // 建立xyz坐标轴,红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.长度15

      this.scene.add(axesHelper);

      var AmbientLight = new THREE.AmbientLight(0xc0560c); // 环境光

      this.scene.add(AmbientLight);

      let DirectionalLight = new THREE.DirectionalLight(0xdfebff, 0.45); // 平行光

      this.scene.add(DirectionalLight);

    },    

// 初始化相机

    initCamera() {

      this.camera = new THREE.PerspectiveCamera(

        75,

        window.innerWidth / window.innerHeight,

        0.1,

        1000

      );

      this.camera.position.set(50, 50, 50); // 调整相机方位

      this.camera.lookAt(new THREE.Vector3(0, 0, 0)); // 让相机指向原点

    },

    // 初始化加载器

    initRenderer() {

      this.renderer = new THREE.WebGLRenderer();

      let container = document.getElementById("container");

      this.renderer.setSize(container.offsetWidth, container.offsetHeight);

      this.renderer.setClearColor(0xffd2ff, 1.0); // 背景光

      container.appendChild(this.renderer.domElement);

    },    

// 加载初始化

    init() {

      this.initScene();

      this.initCamera();

      this.initRenderer();

    },

    // 刷新动画

    animate() {  

    // requestAnimationFrame 应运而生,它采用的是系统时间间隔(约16.7ms),保持最佳绘制效果与效率,

      // 使各种网页动画有一个统一的刷新机制,从而节省系统资源,提高系统性能。

      requestAnimationFrame(this.animate);

      this.renderer.render(this.scene, this.camera);

    },

5.加载初始化方法以及刷新动画事件启动  

mounted() {

    this.init();

    this.animate();

  },

6.效果图

三,加载mtl贴图和obj模型,并加入控制

1,加载模型的文件存放位置,vue2是主目录下的static目录,vue3是主目录的public目录

    loadMTL() {

      let that = this;

      let mtlLoader = new MTLLoader();

      let objloader = new OBJLoader();

      mtlLoader.load(`/static/model/car/file.mtl`, function (materials) {

        materials.preload();

        objloader.load("/static/model/car/file.obj", function (obj) {

          obj.position.set(0, -20, 0); // 平移位置

          that.scene.add(obj);

        });

      });

    },

2.    初始化控制器

    initOrbitControls() {

      let controls = new OrbitControls(this.camera, this.renderer.domElement);

      controls.enableDamping = true; // 将其设置为true以启用阻尼(惯性),这将给控制器带来重量感。默认值为false。

      controls.enableZoom = true; // 启用或禁用摄像机的缩放。

      controls.autoRotate = false; // 将其设为true,以自动围绕目标旋转。

      controls.autoRotateSpeed = 3; // 当 .autoRotate : Boolean为true时,围绕目标旋转的速度将有多快,默认值为2.0,相当于在60fps时每旋转一次需要30秒。

      controls.enablePan = true; // 启用或禁用摄像机平移,默认为true。

      controls.enableKeys = true; // 启用或禁用键盘控制。

      controls.keyPanSpeed = 7; // 当使用键盘按键的时候,相机平移的速度有多快。默认值为每次按下按键时平移7像素。

      controls.keys = {

        // 这一对象包含了用于控制相机平移的按键代码的引用。默认值为4个箭头(方向)键。

        LEFT: 37,

        UP: 38,

        RIGHT: 39,

        BOTTOM: 40,

      };

3.在加入控制器后,动画刷新事件中加入一行代码

// 刷新动画

    animate() {

      requestAnimationFrame(this.animate);

      this.controls.update();

      this.renderer.render(this.scene, this.camera);

    },

4.效果图


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容