OBJLoader/ 模型加载器,MTLLoader / 材质加载器
import * as THREE from "three";
import Stats from "three/examples/jsm/libs/stats.module";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader";
import { MTLLoader } from "three/examples/jsm/loaders/MTLLoader";
let w = window.innerWidth;
let h = window.innerHeight;
const scene = new THREE.Scene();
const axes = new THREE.AxesHelper(10, 10, 10);
const grid = new THREE.GridHelper(10, 10, "red", "red");
const camera = new THREE.PerspectiveCamera(75, w / h, 0.1, 1000);
camera.position.set(0, 6, 3);
camera.lookAt(0, 0, 0);
const light = new THREE.AmbientLight("#ffffff", 1);
const objLoader = new OBJLoader();
const mtlLoader = new MTLLoader();
const getFrame = new Promise((resolve, reject) => {
mtlLoader
.loadAsync("/frame.mtl")
.then((materialCreator) => {
objLoader
.setMaterials(materialCreator)
.loadAsync("/frame.obj")
.then((objGroup) => {
resolve(objGroup);
})
.catch((err) => {
reject(err);
});
})
.catch((err) => {
reject(err);
});
});
getFrame.then((objGroup) => {
objGroup.scale.set(0.1, 0.1, 0.1);
scene.add(objGroup);
});
scene.add(light);
scene.add(axes);
scene.add(grid);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(w, h);
renderer.shadowMap.enabled = true;
renderer.render(scene, camera);
const stats = new Stats();
document.getElementById("box-container").append(renderer.domElement);
document.getElementById("box-container").append(stats.domElement);
const orbitControls = new OrbitControls(camera, renderer.domElement);
const clock = new THREE.Clock();
function render() {
const time = clock.getElapsedTime();
cube.rotation.z = time;
renderer.render(scene, camera);
stats.update();
orbitControls.update();
requestAnimationFrame(render);
}
render();
window.addEventListener("resize", () => {
w = window.innerWidth;
h = window.innerHeight;
camera.aspect = w / h;
camera.updateProjectionMatrix();
renderer.setSize(w, h);
});