關閉
標題:在 div 顯示 glb
內容:
<!-- Three.js CDN (non-module) -->
<script src="https://cdn.jsdelivr.net/npm/three/build/three.min.js"></script>
<!-- GLTFLoader -->
<script src="https://cdn.jsdelivr.net/npm/three/examples/js/loaders/GLTFLoader.js"></script>
<!-- OrbitControls -->
<script src="https://cdn.jsdelivr.net/npm/three/examples/js/controls/OrbitControls.js"></script>
function showGLBToDiv(divDom, glbUrl) {
divDom.innerHTML = ""; // 清空
const scene = new THREE.Scene();
scene.background = new THREE.Color(0xeeeeee);
const camera = new THREE.PerspectiveCamera(
60,
divDom.clientWidth / divDom.clientHeight,
0.1,
2000
);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(divDom.clientWidth, divDom.clientHeight);
divDom.appendChild(renderer.domElement);
// 燈光
scene.add(new THREE.HemisphereLight(0xffffff, 0x444444, 1));
scene.add(new THREE.DirectionalLight(0xffffff, 1));
// 控制器
const controls = new THREE.OrbitControls(camera, renderer.domElement);
const loader = new THREE.GLTFLoader();
loader.load(glbUrl, function (gltf) {
const model = gltf.scene;
scene.add(model);
// ---- 自動置中 + fit ----
const box = new THREE.Box3().setFromObject(model);
const size = box.getSize(new THREE.Vector3());
const center = box.getCenter(new THREE.Vector3());
model.position.sub(center); // 移到原點
controls.target.set(0, 0, 0);
const maxDim = Math.max(size.x, size.y, size.z);
const fov = camera.fov * (Math.PI / 180);
const cameraDist = maxDim / Math.sin(fov / 2) * 0.6;
// ---- 設定相機傾斜 45° ----
const angle = Math.PI / 4; // 45° 往下傾
// XZ 平面斜角 45°,Y 軸高度 = cameraDist * sin(angle)
const y = cameraDist * Math.sin(angle);
const z = cameraDist * Math.cos(angle);
camera.position.set(0, y, z);
camera.lookAt(0, 0, 0);
controls.update();
});
// Render Loop
function animate() {
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
animate();
// 自適應 div 大小
new ResizeObserver(() => {
const w = divDom.clientWidth;
const h = divDom.clientHeight;
camera.aspect = w / h;
camera.updateProjectionMatrix();
renderer.setSize(w, h);
}).observe(divDom);
}