如何使用react从three.js模块导入TrackballControls?

Pra*_*vas 3 import three.js ecmascript-6 reactjs

我正在使用 react js 样板(create-react-app)并导入了three.js。我正在尝试将 TrackballControls 用于特定项目,但它不起作用。它会引发类似“尝试导入错误:'TrackballControls' 未从 'three' 导出(导入为 'THREE')”之类的错误。现在我知道它在示例文件夹中,如果我从论坛中正确理解,它不是官方导出。有人请帮我解决这个问题,如何在反应组件中导入 TrackballControls?帮助将不胜感激!

import React, { useState, useEffect } from 'react'
import * as THREE from 'three'
const OrbitControls = require('three-orbit-controls')(THREE)



import "../src/assets/sass/home.scss"



const X = () => {

const [y, setY] = useState(0)
const [ masses, setMasses ] = useState([])

let parent, renderer, scene, camera, controls



useEffect(() => {

    // renderer
    renderer = new THREE.WebGLRenderer()
    renderer.setSize( window.innerWidth, window.innerHeight )
    document.body.appendChild( renderer.domElement )

    // scene
    scene = new THREE.Scene()

    // camera
    camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 100 )
    camera.position.set( 20, 20, 20 )

    // controls
    controls = new THREE.TrackballControls( camera, sphere )
    controls.minDistance = 5
    controls.maxDistance = 250
    controls.enableDamping = true; // an animation loop is required when either damping or auto-rotation are enabled
    controls.dampingFactor = 0.05;

    // axes
    // scene.add(new THREE.AxisHelper( 20 ))

    // geometry
    let geometry = new THREE.SphereGeometry( 2, 8, 6, 0, 6.3, 0, 3.1)

    // material
    let material = new THREE.MeshBasicMaterial({
        wireframe: true,
        wireframeLinewidth: 1
    })

    let sphere = new THREE.Mesh( geometry, material )

    // parent
    parent = new THREE.Object3D()
    scene.add( parent )
    scene.add( sphere )

    function animate() {
        requestAnimationFrame( animate )
        parent.rotation.z += 0.01
        controls.update()
        renderer.render( scene, camera )
    }

    animate()


}

,[])




return <div></div>
}

export default X
Run Code Online (Sandbox Code Playgroud)

Mug*_*n87 5

示例目录中的所有 JavaScript 文件现在都可以作为threenpm 包中的 ES6 模块使用。实际上有一个指南解释了如何在应用程序中导入它们:

https://threejs.org/docs/index.html#manual/en/introduction/Import-via-modules

对于您的特定情况,它看起来像这样:

import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js';
Run Code Online (Sandbox Code Playgroud)

请注意,three-orbit-controls不再需要诸如此类的第三方软件包。使用three包中的模块时,可以保证您使用最新(和受支持)的版本。

three.js R109

  • 我的错,我忘了提及,我正在使用带有自定义 Express 服务器的 next.js 框架(服务器端反应)。我猜想将文件加载为 js 或其他东西时会出现问题。我自己也不了解 webpack。我想我必须学习它并希望我能解决这个问题。:( (2认同)