Пример three.js glTF загрузчик не рендерит 3D модель - PullRequest
0 голосов
/ 25 мая 2019

Когда я загружаю папку three.js-master в threejs.org и открываю пример загрузчика glTF (имя файла webgl_loader_gltf.html), мой браузер не отображает3D модель.

На нем должен отображаться 3D-шлем, как в веб-версии , но все, что я вижу, это черный экран.Я подозреваю, что настоящая модель есть, но освещение или сетка настроены неправильно?

Что я вижу:

enter image description here

Что я должен видеть:

enter image description here

Я проверил окно консоли в Safari Developer Mode и обнаружил эти две ошибки, которые могут быть причиной.Наиболее заметным является cannot load due to access control checks:

enter image description here

Я пробовал использовать Google Chrome, но та же проблема.Я убедился, что фактическая 3D-модель находится в папке (three.js-master> examples> models> gltf> DamagedHelmet).

Вот код:

<!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">
        <style>
            body {
                font-family: Monospace;
                background-color: #000;
                color: #fff;
                margin: 0px;
                overflow: hidden;
            }
            #info {
                color: #fff;
                position: absolute;
                top: 10px;
                width: 100%;
                text-align: center;
                z-index: 100;
                display:block;
            }
            #info a {
                color: #75ddc1;
                font-weight: bold;
            }
        </style>
    </head>

<body>
    <div id="info">
        <a href="http://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=pedestrian_overpass" target="_blank" rel="noopener">Pedestrian Overpass</a> by <a href="https://hdrihaven.com/" target="_blank" rel="noopener">HDRI Haven</a>
    </div>

    <script src="../build/three.js"></script>

    <script src="js/controls/OrbitControls.js"></script>
    <script src="js/loaders/GLTFLoader.js"></script>

    <script src="js/loaders/EquirectangularToCubeGenerator.js"></script>
    <script src="js/loaders/RGBELoader.js"></script>

    <script src="js/pmrem/PMREMGenerator.js"></script>
    <script src="js/pmrem/PMREMCubeUVPacker.js"></script>

    <script src="js/WebGL.js"></script>
    <script src="js/libs/stats.min.js"></script>

    <script>
        if ( WEBGL.isWebGLAvailable() === false ) {
            document.body.appendChild( WEBGL.getWebGLErrorMessage() );
        }
        var container, stats, controls;
        var camera, scene, renderer;
        init();
        animate();
        function init() {
            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.9, 2.7 );
            controls = new THREE.OrbitControls( camera );
            controls.target.set( 0, - 0.2, - 0.2 );
            controls.update();
            scene = new THREE.Scene();
            var loader = new THREE.RGBELoader().setPath( 'textures/equirectangular/' );
            loader.load( 'pedestrian_overpass_2k.hdr', function ( texture ) {
                texture.encoding = THREE.RGBEEncoding;
                texture.minFilter = THREE.NearestFilter;
                texture.magFilter = THREE.NearestFilter;
                texture.flipY = true;
                var cubeGenerator = new THREE.EquirectangularToCubeGenerator( texture, { resolution: 1024 } );
                cubeGenerator.update( renderer );
                var pmremGenerator = new THREE.PMREMGenerator( cubeGenerator.renderTarget.texture );
                pmremGenerator.update( renderer );
                var pmremCubeUVPacker = new THREE.PMREMCubeUVPacker( pmremGenerator.cubeLods );
                pmremCubeUVPacker.update( renderer );
                var envMap = pmremCubeUVPacker.CubeUVRenderTarget.texture;
                // model
                var loader = new THREE.GLTFLoader().setPath( 'models/gltf/DamagedHelmet/glTF/' );
                loader.load( 'DamagedHelmet.gltf', function ( gltf ) {
                    gltf.scene.traverse( function ( child ) {
                        if ( child.isMesh ) {
                            child.material.envMap = envMap;
                        }
                    } );
                    scene.add( gltf.scene );
                } );
                pmremGenerator.dispose();
                pmremCubeUVPacker.dispose();
                scene.background = cubeGenerator.renderTarget;
            } );
            renderer = new THREE.WebGLRenderer( { antialias: true } );
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize( window.innerWidth, window.innerHeight );
            renderer.gammaOutput = true;
            container.appendChild( renderer.domElement );
            window.addEventListener( 'resize', onWindowResize, false );
            // stats
            stats = new Stats();
            container.appendChild( stats.dom );
        }
        function onWindowResize() {
            camera.aspect = window.innerWidth / window.innerHeight;
            camera.updateProjectionMatrix();
            renderer.setSize( window.innerWidth, window.innerHeight );
        }
        //
        function animate() {
            requestAnimationFrame( animate );
            renderer.render( scene, camera );
            stats.update();
        }
    </script>

</body>

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Это потому, что вы просто открываете файл, а не обслуживаете его через локальный сервер.
Он описан на странице документации three.js под названием Как запустить все локально .

Содержимое, загружаемое из внешних файлов
Если вы загружаете модели или текстуры из внешних файлов, из-за ограничений безопасности исходной политики браузера, загрузка из файловой системы завершится неудачей с исключением безопасности.

Существует два способа решения этой проблемы:

Изменить защиту локальных файлов в браузере.
Это позволяет вам получить доступ к вашей странице как:
file: /// yourFile.html

Запуск файлов с локального веб-сервера.
Это позволяет получить доступ к вашей странице как:
http://localhost/yourFile.html

0 голосов
/ 25 мая 2019

Для решения @ 2pha я открыл терминал на Mac и ввел следующее:

sudo npm install http-server -g

Если вы не введете sudo, оно может не работать из-за административных привилегий. После его запуска я ввел:

http-server . -p 8000

Вы должны увидеть такой вывод:

Starting up http-server, serving ./
Available on:
  http://192.168.0.5:8000
  http://127.0.0.1:8000
Hit CTRL-C to stop the server

Далее откройте браузер и введите этот адрес: http://localhost:8000. Перейдите к файлу .html (в моем случае webgl_loader_gltf.html) и откройте его. Это должно работать!

...