【问题标题】:can't import obj loader in three.js无法在 three.js 中导入 obj loader
【发布时间】:2020-11-29 02:18:42
【问题描述】:

我想将一个 3d 对象加载到 three.js,所以由于我对此很陌生,所以我从文档中的 first basic example 开始,对我来说一切似乎都很好。但是当简单地添加导入行时,following the documentation 我再也看不到场景了,我从控制台收到了这个错误:

(index):1 Uncaught TypeError: Failed to resolve module specifier "three/examples/jsm/loaders/GLTFLoader.js". Relative references must start with either "/", "./", or "../"

我刚刚从 three.js 文档中复制了这一行,所以我不确定在引用加载程序时出了什么问题。

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';

您能帮我理解问题所在吗?我正在使用 atom 实时服务器进行 macOS 上的预览 谢谢!

【问题讨论】:

标签: javascript three.js 3d


【解决方案1】:

我不知道您的项目是如何组织的,因此您必须将 {path} 甚至文件名替换为文件的实际静态路径。

<script type="module">
 import * as THREE from '{path}/three.module.js'
 import { GLTFLoader } from '{path}/GLTFLoader.js'
</script>

如果您不托管 threejs 文件,请使用 CDN

import { GLTFLoader } from 'https://cdn.jsdelivr.net/npm/three/examples/jsm/loaders/GLTFLoader.js'

编辑

NPM 和使用任何类型的服务器扩展提供文件是您需要清楚地理解的东西,而不是开箱即用的东西。我建议您创建一个 index.html 文件并直接在浏览器上运行。

作为示例,我已将每个文件访问都替换为 CDN 链接。 模型在缓存中之后,第一次运行很慢。

    <!DOCTYPE html>
<html lang="en">
    <head>
        <title>three.js webgl - glTF loader</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
        <link type="text/css" rel="stylesheet" href="https://ghcdn.rawgit.org/mrdoob/three.js/dev/examples/main.css">
    </head>

    <body>
        <div id="info">
            <a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - GLTFLoader<br />
            Battle Damaged Sci-fi Helmet by
            <a href="https://sketchfab.com/theblueturtle_" target="_blank" rel="noopener">theblueturtle_</a><br />
            <a href="https://hdrihaven.com/hdri/?h=royal_esplanade" target="_blank" rel="noopener">Royal Esplanade</a> by <a href="https://hdrihaven.com/" target="_blank" rel="noopener">HDRI Haven</a>
        </div>

        <script type="module">

            import * as THREE from 'https://cdn.jsdelivr.net/npm/three@0.123.0/build/three.module.js';

            import { OrbitControls } from 'https://cdn.jsdelivr.net/npm/three/examples/jsm/controls/OrbitControls.js';
            import { GLTFLoader } from 'https://cdn.jsdelivr.net/npm/three/examples/jsm/loaders/GLTFLoader.js';
            import { RGBELoader } from 'https://cdn.jsdelivr.net/npm/three/examples/jsm/loaders/RGBELoader.js';
            import { RoughnessMipmapper } from 'https://cdn.jsdelivr.net/npm/three/examples/jsm/utils/RoughnessMipmapper.js';

            let camera, scene, renderer;

            init();
            render();

            function init() {

                const container = document.createElement( 'div' );
                document.body.appendChild( container );

                camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.25, 20 );
                camera.position.set( - 1.8, 0.6, 2.7 );

                scene = new THREE.Scene();

                new RGBELoader()
                    .setDataType( THREE.UnsignedByteType )
                    .setPath( 'https://ghcdn.rawgit.org/mrdoob/three.js/dev/examples/textures/equirectangular/' )
                    .load( 'royal_esplanade_1k.hdr', function ( texture ) {

                        const envMap = pmremGenerator.fromEquirectangular( texture ).texture;

                        scene.background = envMap;
                        scene.environment = envMap;

                        texture.dispose();
                        pmremGenerator.dispose();

                        render();

                        // model

                        // use of RoughnessMipmapper is optional
                        const roughnessMipmapper = new RoughnessMipmapper( renderer );

                        const loader = new GLTFLoader().setPath( 'https://ghcdn.rawgit.org/mrdoob/three.js/dev/examples/models/gltf/DamagedHelmet/glTF/' );
                        loader.load( 'DamagedHelmet.gltf', function ( gltf ) {

                            gltf.scene.traverse( function ( child ) {

                                if ( child.isMesh ) {

                                    // TOFIX RoughnessMipmapper seems to be broken with WebGL 2.0
                                    // roughnessMipmapper.generateMipmaps( child.material );

                                }

                            } );

                            scene.add( gltf.scene );

                            roughnessMipmapper.dispose();

                            render();

                        } );

                    } );

                renderer = new THREE.WebGLRenderer( { antialias: true } );
                renderer.setPixelRatio( window.devicePixelRatio );
                renderer.setSize( window.innerWidth, window.innerHeight );
                renderer.toneMapping = THREE.ACESFilmicToneMapping;
                renderer.toneMappingExposure = 1;
                renderer.outputEncoding = THREE.sRGBEncoding;
                container.appendChild( renderer.domElement );

                const pmremGenerator = new THREE.PMREMGenerator( renderer );
                pmremGenerator.compileEquirectangularShader();

                const controls = new OrbitControls( camera, renderer.domElement );
                controls.addEventListener( 'change', render ); // use if there is no animation loop
                controls.minDistance = 2;
                controls.maxDistance = 10;
                controls.target.set( 0, 0, - 0.2 );
                controls.update();

                window.addEventListener( 'resize', onWindowResize, false );

            }

            function onWindowResize() {

                camera.aspect = window.innerWidth / window.innerHeight;
                camera.updateProjectionMatrix();

                renderer.setSize( window.innerWidth, window.innerHeight );

                render();

            }

            //

            function render() {

                renderer.render( scene, camera );

            }

        </script>

    </body>
</html>

【讨论】:

  • 谢谢你的回答,对于three.js文件,我直接放在我的文件夹中,在文件夹项目中使用npm安装了three.js。我不知道这样做是否正确,但老实说,我一直很难弄清楚如何在 three.js 中导入/引用东西,而不是了解它的实际工作原理
猜你喜欢
  • 2018-01-23
  • 2018-02-17
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
相关资源
最近更新 更多