import * as THREE from “three”;
import { GLTFLoader } from “three/examples/jsm/loaders/GLTFLoader”;
import { OrbitControls } from “three/examples/jsm/controls/OrbitControls”;
let scene: THREE.Scene,
camera: THREE.Camera,
renderer: THREE.WebGLRenderer,
model: THREE.Object3D;
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
export const init = (modelDivId: string) => {
//Scene
scene = new THREE.Scene();
scene.background = new THREE.Color(0xffffff);
//Renderer
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.shadowMap.enabled = true;
renderer.toneMappingExposure = 0.9;
//Ambient Light
const ambiLight = new THREE.AmbientLight(0xfffef2, 1);
ambiLight.castShadow = true;
scene.add(ambiLight);
//Spot Light
const spotLight = new THREE.SpotLight(0xf6cdb8, 1.05);
spotLight.position.set(140, 320, 300);
spotLight.castShadow = true;
spotLight.shadow.mapSize.width = 1000;
spotLight.shadow.mapSize.height = 1000;
spotLight.shadow.camera.near = 0.2;
spotLight.shadow.camera.far = 2000;
scene.add(spotLight);
// var helper = new THREE.CameraHelper(spotLight.shadow.camera);
// scene.add(helper);
//Floor
const meshFloor = new THREE.Mesh(
new THREE.PlaneGeometry(500, 500, 500, 500),
new THREE.MeshPhongMaterial({ color: 0xececec })
);
meshFloor.position.set(-200, 0, -200);
meshFloor.rotation.x -= Math.PI / 2;
meshFloor.receiveShadow = true;
scene.add(meshFloor);
//Camera
camera = new THREE.PerspectiveCamera(
40,
window.innerWidth / window.innerHeight,
0.1,
5000
);
camera.position.z = 700;
camera.position.y = 200;
const modelDiv = document.getElementById(modelDivId);
if (!modelDiv) {
throw new Error(“No model container”);
}
modelDiv.appendChild(renderer.domElement);
new OrbitControls(camera, renderer.domElement);
const loader = new GLTFLoader();
loader.load("./model/FBX1.glb", function (gltf) {
gltf.scene.traverse(function (child) {
child.castShadow = true;
child.receiveShadow = true;
});
model = gltf.scene.children[0];
model.scale.set(1, 1, 1);
scene.add(gltf.scene);
animate();
});
};