(Three.js) Сцена не выводит модель

Имеется сцена, в которую я попытался загрузить 3Д модель, но её не видно. Не понимаю, что ещё можно предпринять.

Код:

<canvas id="canv"></canvas>

<script>
    const gltfLoader = new THREE.GLTFLoader()

    let canvas = document.getElementById('canv')

    canvas.width = window.innerWidth
    canvas.height = window.innerHeight

    const renderer = new THREE.WebGLRenderer({
        canvas: canvas,
        antialias: true
    })
    renderer.shadowMap.enabled = true
    renderer.setClearColor(0xffffff)

    let scene = new THREE.Scene()
    let camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 5000)
    camera.position.z = 20

    let light = new THREE.SpotLight()
    light.position.set(200, 0, 0)
    light.castShadow = true
    scene.add(light)

    loader = new THREE.GLTFLoader();
    loader.load('public/3d/scene.gltf', function(gltf){
        obj = gltf
        obj.scene.scale.set(1.3, 1.3, 1.3)
        scene.add(obj.scene)
    })

    const rendering = () => {
        renderer.render(scene, camera)
        requestAnimationFrame(rendering)
        camera.lookAt(scene.position)
    }
    rendering()
</script>

Я подключил к сайту файлы ниже:

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r126/three.min.js" integrity="sha512-n8IpKWzDnBOcBhRlHirMZOUvEq2bLRMuJGjuVqbzUJwtTsgwOgK5aS0c1JA647XWYfqvXve8k3PtZdzpipFjgg==" crossorigin="anonymous"></script>
<script src="https://unpkg.com/[email protected]/examples/js/loaders/GLTFLoader.js"></script>

Как мне заставить сцену отобразить модель вместо чёрного экрана?

введите сюда описание изображения

(Сверху ещё есть canvas слой с эффектом зернистости, но этот слой визуально ничего не перекрывает и всё прекрасно видно)


Ответы (2 шт):

Автор решения: icekson

Ошибка валится при вызове rendering() потому что вы устанавливаете obj = null и сразу вызываете rendering(). Это происходит еще до того как модель загружается введите сюда описание изображения

→ Ссылка
Автор решения: prisoner849

Сама модель очень смещена вверх. Поэтому ее не видно со статичной камерой - только когда подключил OrbitControls удалось заметить :) Притянул модель к центру сцены. Но если начнете вращать ее программно - готовьтесь к неожиданным результатам.

const gltfLoader = new THREE.GLTFLoader()

let canvas = document.getElementById('canv')

canvas.width = window.innerWidth
canvas.height = window.innerHeight

let scene = new THREE.Scene()
let camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 5000)
camera.position.z = 100

const renderer = new THREE.WebGLRenderer({
    canvas: canvas,
  antialias: true
})
renderer.shadowMap.enabled = true
renderer.setClearColor(0x7f7f7f)

let controls = new THREE.OrbitControls(camera, renderer.domElement);

let light = new THREE.DirectionalLight()
light.position.set(200, 0, 0)
light.castShadow = true
scene.add(light, 
    new THREE.AmbientLight(0xffffff, 0.25),
  new THREE.HemisphereLight(0xffffff, 0x7f7f7f, 0.5)
);

let model = null;
// "Hand (low poly)" (https://skfb.ly/Dr9p) by scribbletoad is licensed under Creative Commons Attribution (http://creativecommons.org/licenses/by/4.0/).
gltfLoader.load('https://cywarr.github.io/small-shop/hand/scene.gltf', function(gltf) {
  model = gltf.scene;
  let box3 = new THREE.Box3().setFromObject(model);
  let center = new THREE.Vector3();
  box3.getCenter(center);
  model.position.sub(center);
  scene.add(model);
  console.log(model)
},
null,
err => {
    console.log(err)
})

const rendering = () => {
  renderer.render(scene, camera)
  requestAnimationFrame(rendering)
  camera.lookAt(scene.position)
}
rendering()
body{
  overflow: hidden;
  margin: 0;
}
<canvas id="canv"></canvas>
<script src="https://threejs.org/build/three.min.js"></script>
<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
<script src="https://threejs.org/examples/js/loaders/GLTFLoader.js"></script>

→ Ссылка