You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入OrbitControls时出现TypeError,该如何解决?

导入Three.js的OrbitControls时出现错误

我在尝试导入OrbitControls时遇到了错误,错误提示为模块导入失败,无法找到对应的OrbitControls资源。

以下是我的代码:

JS代码(task9.js)

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({color: 0x00ff00});
const cube = new THREE.Mesh(geometry, material);
const controls = new OrbitControls(camera, renderer.domElement);

renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

scene.add(cube);

camera.position.set(0, 20, 100);
camera.position.z = 5;

renderer.render(scene, camera);

controls.update();

function animate(){
    requestAnimationFrame(animate);

    controls.update();

    renderer.render(scene, camera);
}

HTML代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Document</title>
        <style>
            body { margin: 0; }
        </style>
    </head>
    <body>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js" ></script>
        <script type="module" src="task9.js"></script>
    </body>
</html>

我已经尝试过以下两种导入方式,但问题依然存在:

  • import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
  • import { OrbitControls } from 'https://unpkg.com/three@0.128.0/examples/jsm/controls/OrbitControls.js';

解决方案

你的问题核心是混合使用了全局引入的Three.js和模块导入的OrbitControls,导致模块无法正确识别全局THREE对象,同时路径与版本不匹配。

方法1:统一使用模块导入(推荐)

修改HTML,移除全局引入的three.min.js,改用模块导入核心库:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Document</title>
        <style>
            body { margin: 0; }
        </style>
    </head>
    <body>
        <script type="module" src="task9.js"></script>
    </body>
</html>

修改task9.js的导入语句,确保路径与r128版本匹配:

// 导入Three.js核心模块
import * as THREE from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.module.js';
// 导入对应版本的OrbitControls
import { OrbitControls } from 'https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three/examples/jsm/controls/OrbitControls.js';

// 后续代码保持不变
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
// ...

方法2:使用全局引入的OrbitControls

若要继续使用全局引入方式,需添加对应版本的OrbitControls全局脚本:

<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
    <!-- 引入同版本的OrbitControls全局脚本 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three/examples/js/controls/OrbitControls.js"></script>
    <script src="task9.js"></script>
</body>

同时删除task9.js中的import语句,直接使用全局的OrbitControls:

// 移除import语句
const scene = new THREE.Scene();
// ...
const controls = new THREE.OrbitControls(camera, renderer.domElement);
// ...

内容的提问来源于stack exchange,提问作者Taric_112

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:35:13