javascript - Three.js - Uncaught ReferenceError: OBJLoader is not defined
问题描述
我正在关注有关 Three.js 的几个教程,但Uncaught ReferenceError: OBJLoader is not defined
在尝试实现我自己的 .obj 文件时一直出现错误。尝试了不同的方法,没有任何帮助。被这个问题困扰了好几天。
我正在使用 http-server 在 localhost 上运行。
奇怪的是,当我切换new OBJLoader();
到它时new THREE.ObjectLoader();
它似乎可以工作,因为它试图加载文件,尽管该文件不是 .json 文件,它是一个 .obj 所以它会引发错误。
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>three.js crash course</title>
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<script type="module" src="js/jQuery.js"></script>
<script type="module" src="js/three.min.js"></script>
<script type="module" src="js/OrbitControls.js"></script>
<script type="module" src="loaders/GLTFLoader.js"></script>
<script type="module" src="loaders/OBJLoader.js"></script>
<script type="module" src="js/index.js"></script>
</body>
</html>
JS
window.onload = function() {
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
$(window).resize(function(){
var width = window.innerWidth;
var height = window.innerHeight;
renderer.setSize(width, height);
camera.aspect = width/height;
camera.updateProjectionMatrix();
});
var controls = new THREE.OrbitControls(camera, renderer.domElement);
const loader = new OBJLoader();
loader.load (
// resource URL
'./models/boat_large.obj',
// called when resource is loaded
function ( object ) {
scene.add( object );
},
// called when loading is in progresses
function ( xhr ) {
console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
},
// called when loading has errors
function ( error ) {
console.log( 'An error happened' );
}
);
camera.position.z = 3;
var ambientLight = new THREE.AmbientLight(0xFFFFFF, 0.8);
// game logic
var update = () => {
};
// draw scene
var render = () => {
renderer.render(scene, camera);
};
// run game loop (update, render, repeat)
var GameLoop = () => {
requestAnimationFrame(GameLoop);
update();
render();
}
GameLoop();
}
解决方案
new THREE.OBJLoader()
当您引用这样的javascript文件时,您需要使用。
它在 ThreeJS 示例中起作用的原因是,因为它是通过
import { OBJLoader } from './jsm/loaders/OBJLoader.js';
.
或者,您可以像示例中所示那样包含文件 。在你的情况下,它显然是这样的
import { OBJLoader } from '../loaders/OBJLoader.js';
假设上面发布的 JS 来自index.js
.
推荐阅读
- javascript - Ionic 3,firebase 在相同键下的两个数据库中保存值
- java - 格式化函数内的日期
- c++ - CRTP 和模板模板参数限制
- java - Java:JVM内存消耗
- c - 为什么两个指针之间有 16 个字节的差异而不是 8 个字节?
- javascript - 强制浏览器在脚本标签中加载新文件的最佳方法是什么
- swift - Swift 4.2:以下声明是什么意思
- windows - 安装新版本 Slack 时出错:暂存用户 ID 和其他错误
- c++ - 如何使用 boost::wregex?
- node.js - Mobx-state-tree SSR 双初始化客户端和服务器