Я сталкиваюсь с ошибкой при реализации трех загрузчиков JS Gltf с nuxt 3. Сообщение об ошибке : " Uncaught (в обещании) TypeError: Загрузчик конструктора класса не может быть вызван без "нового" .."
версии:
"три": "^0.148.0", "три-gltf-загрузчик": "^ 1.111.0"
<template>
<div ref = "container"></div>
</template>
<script>
import { ref, onMounted } from "vue";
import * as THREE from "three";
import GLTFLoader from "three-gltf-loader";
export default {
setup() {
const container = ref(null);
const scene = ref(new THREE.Scene());
const renderer = ref(new THREE.WebGLRenderer({ antialias: true }));
const width = 700;
const height = 700;
const camera = ref(
new THREE.PerspectiveCamera(75, width / height, 0.1, 1000)
);
const loader = ref(new GLTFLoader());
onMounted(async () => {
renderer.value.setSize(
container.value.clientWidth,
container.value.clientHeight
);
container.value.appendChild(renderer.value.domElement);
camera.value.position.z = 5;
const response = await fetch("logo.gltf");
const gltf = await response.json();
loader.value.parse(
gltf,
"",
(gltf) => {
scene.value.add(gltf.scene);
renderer.value.render(scene.value, camera.value);
},
undefined,
(error) => {
console.error(error);
}
);
});
return { container };
},
};
</script>





"три": "^0.148.0", "три-gltf-загрузчик": "^1.111.0"
Такая установка не рекомендуется, так как вы можете импортировать последний GLTFLoader модуль из three репозитория. Попробуйте еще раз с этим импортом:
import * as THREE from "three";
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
Я нашел решение на YT-канале Alvaro Dev Labs, он использовал TroisJS вместо ThreeJS (на самом деле это Vite + Three). А для nuxt 3 вам просто нужно добавить «.client.vue» к имени файла вашего компонента, чтобы запустить его на стороне клиента (Model.client.vue).
<script lang = "ts">
import { defineComponent, ref, onMounted } from "vue";
import {
Renderer,
Scene,
Camera,
PointLight,
AmbientLight,
GltfModel,
} from "troisjs";
export default defineComponent({
components: {
Renderer,
Scene,
Camera,
PointLight,
AmbientLight,
GltfModel,
},
setup() {
const renderer = ref(null);
const model = ref(null);
function onReady(model) {
console.info("Ready", model);
}
onMounted(() => {
renderer?.value?.onBeforeRender(() => {
model.value.rotation.x += 0.01;
});
});
return {
renderer,
model,
onReady,
};
},
});
</script>
<template>
<div>
<Renderer ref = "renderer" antialias orbit-ctrl resize = "window">
<Camera :position = "{ x: -10, z: 20 }" />
<Scene background = "#fff">
<AmbientLight />
<PointLight
color = "white"
:position = "{ x: 100, y: 1000, z: 40 }"
:intensity = "1"
/>
<GltfModel ref = "model" src = "/Models/logo.gltf" @load = "onReady" />
</Scene>
</Renderer>
</div>
</template>
импортировать вот так
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
Затем используйте вот так
const loader = new GLTFLoader()
Не работает, единственное решение с TroisJS