Здравствуйте, я пытаюсь реализовать средство просмотра 3D-моделей, используя 3. Js, однако у меня проблема со временем загрузки, и я не знаю, в чем проблема.
В качестве примера Я пытаюсь загрузить эту модель сюда (ссылка для скачивания): https://opensplit.com/gltf/assets/PromoModel.glb
Вы можете протестировать это в этой gltf Viewer здесь, например: https://gltf-viewer.donmccurdy.com/
Он обычно появляется через несколько секунд.
Однако вы можете видеть, как смехотворно долго это занимает на моем веб-сайте: https://opensplit.com/ Та же модель занимает сейчас больше двух минут на загрузку .. это не может быть правильным, почему это так медленно?
Вот мой код:
<canvas id="canvas"></canvas>
<br>
<div style="margin:15px; margin-bottom:0px;">
<progress id="load_lowPoly" value="0" max="100"></progress>
<div id="lowPoly_progress">Loading Raw Model</div>
</div>
<div id="progressElement" style="background: green; width:0%;"></div>
<div id="previewquali" style="margin:15px; margin-top:0px;">
Material Quality: loading..
</div>
<script src="../gltf/libraries/three.js"></script>
<script src="../gltf/libraries/OrbitControls.js"></script>
<script src="../gltf/libraries/GLTFLoader.js"></script>
<script src="../gltf/libraries/RGBELoader.js"></script>
<script src="../gltf/libraries/DRACOLoader.js"></script>
<script src="../gltf/libraries/EquirectangularToCubeGenerator.js"></script>
<script src="../gltf/libraries/PMREMGenerator.js"></script>
<script src="../gltf/libraries/PMREMCubeUVPacker.js"></script>
<script>
window.addEventListener( "resize", this.onWindowResize, false );
var manager = new THREE.LoadingManager();
var loader = new THREE.TextureLoader()
var windowHeight = 800;
var camera = new THREE.PerspectiveCamera( 47, (window.innerWidth/window.innerHeight) / windowHeight, 0.01, 100000 );
var renderer = new THREE.WebGLRenderer( { canvas: document.getElementById( "canvas" ), antialias: true, alpha: true } );
var controls = new THREE.OrbitControls( camera, renderer.domElement );
var scene = new THREE.Scene();
var loadAsset = true;
var percentComplete;
var gltfSource;
var envMap;
var mesh;
onWindowResize();
init();
animate();
function onWindowResize() {
camera.aspect = (window.innerWidth/1.15) / windowHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth/1.15, windowHeight );
}
function init() {
camera.position.z = 0;
camera.position.y = 0;
camera.position.x = 2000.00;
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth/1.15, windowHeight );
renderer.physicallyCorrectLights = true;
renderer.gammaOutput = true;
renderer.gammaFactor = 2.8;
renderer.setClearColor( 0xf2f2f2, 1 );
updateWindow();
createCubeMap( "../gltf/hdri/machine_shop_02_1k.hdr", 1024 );
loadDraco6141012( "../gltf/assets/PromoModel.glb" );
}
function animate() {
requestAnimationFrame( animate );
controls.update();
renderer.render( scene, camera );
};
function createCubeMap( src, res ) {
new THREE.RGBELoader().setDataType( THREE.UnsignedByteType ).load( src, function ( texture ) {
var cubeGenerator = new THREE.EquirectangularToCubeGenerator( texture, { resolution: res } );
var pmremGenerator = new THREE.PMREMGenerator( cubeGenerator.renderTarget.texture );
var pmremCubeUVPacker = new THREE.PMREMCubeUVPacker( pmremGenerator.cubeLods );
envMap = pmremCubeUVPacker.CubeUVRenderTarget.texture;
cubeGenerator.update( renderer );
pmremGenerator.update( renderer );
pmremCubeUVPacker.update( renderer );
pmremGenerator.dispose();
pmremCubeUVPacker.dispose();
} );
}
function loadDraco6141012( src ) {
var loader = new THREE.GLTFLoader();
loader.setDRACOLoader( new THREE.DRACOLoader() );
loader.load( src, function( gltf ) {
gltf.scene.traverse( function ( child ) {
if ( child.isMesh ) {
child.material.envMap = envMap;
child.material.envMapIntensity = 0.8;
mesh = child;
}
} );
scene.add( gltf.scene );
}, function ( xhr ) {
if ( xhr.lengthComputable ) {
percentComplete = xhr.loaded / xhr.total * 100;
console.log( "Loading Model - " + Math.round(percentComplete, 2) + "%" );
document.getElementById("lowPoly_progress").innerHTML = "Loading Raw Model " + Math.round(percentComplete, 2) + "%";
document.getElementById("load_lowPoly").value = percentComplete;
}
} );
}
function updateWindow() {
onWindowResize();
}
</script>
Я думал, что это самый простой способ сделать это . Но, как вы сами видите на моем веб-сайте, загрузка занимает целую вечность. Как я могу исправить эту проблему?