在vue组件中导入和使用three.js库

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (180)

有人可以解释一下我如何在vue组件中正确导入和使用three.js库吗?

经过多次搜索后我很清楚,大多数人使用以下行在vue组件中导入three.js,但我认为它已经过时了(usef用于旧的three.js文档用于较旧的vue版本)。

import * as THREE from './js/three.js';

不幸的是,这对我来说似乎没有用,因为我在之后编译我的vue项目时收到以下警告。(注意,项目实际上没有正确编译,当我浏览它时我得到一个空文件)。

我尝试了许多其他常用的方法来导入那些无效的three.js!

我根本不是Vue专家,但是three.js包含以下带导出的代码块,我认为这可能会影响我导入此库所需的方式以避免编译警告。

exports.WebGLRenderTargetCube = WebGLRenderTargetCube;
exports.WebGLRenderTarget = WebGLRenderTarget;
exports.WebGLRenderer = WebGLRenderer;
exports.ShaderLib = ShaderLib;
exports.UniformsLib = UniformsLib;
exports.UniformsUtils = UniformsUtils;
exports.ShaderChunk = ShaderChunk;
exports.FogExp2 = FogExp2;
exports.Fog = Fog;
exports.Scene = Scene;
(and so one...)

我正在为我的项目使用的完整Vue组件文件

提问于
用户回答回答于

您可以使用如下所示的require语句:

const THREE = require('THREE')

但是有些插件假设THREE在窗口上可用,所以你可能想要这样做window.THREE = require('THREE')

我对import语句没有多少经验,但上面应该有用。

用户回答回答于

对于只想尝试基本设置的人。这是vue组件“ThreeTest”中的three.js示例。项目设置使用vue-cli'vue init webpack ProjectName','cd ProjectName','npm install three --save'并用以下内容替换'HelloWorld'组件:

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

<script>
import * as Three from 'three'

export default {
  name: 'ThreeTest',
  data() {
    return {
      camera: null,
      scene: null,
      renderer: null,
      mesh: null
    }
  },
  methods: {
    init: function() {
        let container = document.getElementById('container');

        this.camera = new Three.PerspectiveCamera(70, container.clientWidth/container.clientHeight, 0.01, 10);
        this.camera.position.z = 1;

        this.scene = new Three.Scene();

        let geometry = new Three.BoxGeometry(0.2, 0.2, 0.2);
        let material = new Three.MeshNormalMaterial();

        this.mesh = new Three.Mesh(geometry, material);
        this.scene.add(this.mesh);

        this.renderer = new Three.WebGLRenderer({antialias: true});
        this.renderer.setSize(container.clientWidth, container.clientHeight);
        container.appendChild(this.renderer.domElement);

    },
    animate: function() {
        requestAnimationFrame(this.animate);
        this.mesh.rotation.x += 0.01;
        this.mesh.rotation.y += 0.02;
        this.renderer.render(this.scene, this.camera);
    }
  },
  mounted() {
      this.init();
      this.animate();
  }
}
</script>

<style scoped>
    //TODO give your container a size.
</style>

扫码关注云+社区

领取腾讯云代金券