尝试加载 .glb 的 3dmodel

Trying to load a 3dmodel that is a .glb

提问人:Mora 提问时间:11/15/2023 最后编辑:JustinasMora 更新时间:11/15/2023 访问量:27

问:

控制台中的错误: 未捕获的 TypeError:无法解析模块说明符“three”。相对引用必须以“/”、“./”或“.”开头。/".

我正在尝试加载一个 3d 模型,这是我的 index.html 和 3dmodel.js ,我做错了什么吗?我还尝试使用来自互联网的依赖项(而不是在本地下载它们)。我通过Visual Studio Code在本地主机上使用它,使用名为Live Server的扩展

索引.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Lifeboat</title>
  <link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="styles.css">
  <link rel="icon" type="image/png" href="logo_nasa.ico">
</head>
<body>

  <header>
    <div class="header-content">
      <img src="logo_nasa.png" alt="Logo" id="logo">
      <nav>
        <ul>
          <li><a href="about.html">About</a></li>
          <li><a href="virtual-library.html">Virtual Library</a></li>
        </ul>
      </nav>
    </div>
  </header>

  <div class="main-title">
    <h2 id="text">LIFEBOAT</h2>
    <p>Welcome to our space exploration project.</p>
    <div class="mouse"></div>
  </div>

    <!-- Container for the 3D model -->
  <div id="model-container"></div>


  <div class="content">
    <!-- Add your longer content here -->
  </div>
  
  <script src="/js/matrix_text.js"></script>
  <script type="module" src="3dmodel.js"></script>
</body>
</html>

3dmodel.js

import * as THREE from './js/three.module.js';
import { GLTFLoader } from './js/GLTFLoader.js';
import { DRACOLoader } from './js/DRACOLoader.js';

let scene, camera, renderer, model;

init();
animate();

function init() {
    // Creating the scene
    scene = new THREE.Scene();

    // Setting up the camera
    camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    camera.position.set(0, 0, 5);

    // Setting up the renderer
    renderer = new THREE.WebGLRenderer({ antialias: true });
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.getElementById('model-container').appendChild(renderer.domElement);

    // Adding lighting
    const light = new THREE.HemisphereLight(0xffffff, 0x444444);
    light.position.set(1, 1, 1);
    scene.add(light);

    // Adding the Draco loader
    const dracoLoader = new DRACOLoader();
    dracoLoader.setDecoderPath('./js/'); // Adjust path as necessary

    // Adding the GLTF loader
    const loader = new GLTFLoader();
    loader.setDRACOLoader(dracoLoader);

    // Loading the GLB model
    loader.load('spaceship.glb', function (gltf) {
        model = gltf.scene;
        scene.add(model);
    }, undefined, function (error) {
        console.error(error);
    });

    // Handle window resize
    window.addEventListener('resize', onWindowResize, false);
}

function animate() {
    requestAnimationFrame(animate);

    // Optional: Rotate the model
    if (model) {
        model.rotation.y += 0.005;
    }

    renderer.render(scene, camera);
}

function onWindowResize() {
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
}

在主标题下加载 spaceship.glb

JavaScript HTML 三.js

评论


答:

0赞 Mohammed Alkebsi 11/15/2023 #1

确保您的文件位于 .js 文件旁边,而不是 HTML 旁边。如果它们都在同一个目录中,那么只需将其放在它们旁边即可。spaceship.glb

然后,尝试更改此行...

//...
loader.load('spaceship.glb', function (gltf) { 
//...

到这条线...

//...
loader.load('./spaceship.glb', (gltf) => {
//...

我在这里所做的是,我在源链接的开头添加了一个。此外,我已将功能减速更改为使用箭头功能。我不知道为什么,但是一旦使用三个.js项目,我就遇到过很多旧时尚关键字的问题。./function

如果没有任何效果,请尝试添加常规模型,而不是使用 Draco 压缩。您可以免费在线找到很多。

如果没有任何效果,您最好检查下面的链接,并尝试更详细地解释正在发生的事情。尝试将项目上传到 GitHub 并共享存储库 URL。我们都是来帮忙的!

https://en.threejs-university.com/2021/08/04/loading-a-3d-glb-gltf-with-three-js-gltfloader/ https://discoverthreejs.com/book/first-steps/load-models/