shaogen1995 9 ay önce
ebeveyn
işleme
120ce5d66c
1 değiştirilmiş dosya ile 35 ekleme ve 5 silme
  1. 35 5
      js/main.js

+ 35 - 5
js/main.js

@@ -56,7 +56,7 @@ document.addEventListener("DOMContentLoaded", async () => {
     position += chunk.length; // 更新位置
   }
 
-  const usd_binary = new Uint8Array(usd_data);
+  // const usd_binary = new Uint8Array(usd_data);
 
   // 加载 TinyUSDZ
   initTinyUSDZ().then(function (TinyUSDZLoader) {
@@ -138,10 +138,31 @@ document.addEventListener("DOMContentLoaded", async () => {
 
     //const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
     const cube = new THREE.Mesh(geometry, material);
+
+    // 缩放模型
+    cube.scale.set(2, 2, 2);
+    cube.updateMatrixWorld(true); // 强制更新世界矩阵[3](@ref)
+
+    // 计算包围盒
+    const box = new THREE.Box3().setFromObject(cube);
+    const center = new THREE.Vector3();
+    box.getCenter(center);
+
+    // 居中模型
+    cube.position.sub(center);
+
+    // 计算尺寸并调整相机
+    const size = box.getSize(new THREE.Vector3()).length();
+    camera.near = size / 100;
+    camera.far = size * 100;
+    camera.updateProjectionMatrix();
+    camera.position.set(size * 0.5, size * 0.5, size * 0.5);
+    camera.lookAt(0, 0, 0);
+
     scene.add(cube);
 
     //camera.position.z = 25;
-    camera.position.z = 1.0;
+    // camera.position.z = 1.0;
 
     const controls = new OrbitControls(camera, renderer.domElement);
 
@@ -158,8 +179,17 @@ document.addEventListener("DOMContentLoaded", async () => {
     const handleZoom = (delta) => {
       // console.log('--------',delta);
 
+      cube.updateMatrixWorld(true);
+      // 计算包围盒
+      const box = new THREE.Box3().setFromObject(cube);
+      const center = new THREE.Vector3();
+      box.getCenter(center);
+
+      // 居中模型
+      cube.position.sub(center);
+
       cube.scale.multiplyScalar(delta);
-      cube.scale.clampScalar(0.5, 2); // 限制缩放范围0.5-3倍[1,6](@ref)
+      cube.scale.clampScalar(0.5, 4); // 限制缩放范围0.5-3倍[1,6](@ref)
     };
 
     // 鼠标滚轮事件
@@ -167,7 +197,7 @@ document.addEventListener("DOMContentLoaded", async () => {
       "wheel",
       (e) => {
         e.preventDefault();
-        const zoomFactor = e.deltaY > 0 ? 0.9 : 1.1;
+        const zoomFactor = e.deltaY > 0 ? 0.95 : 1.05;
         handleZoom(zoomFactor);
       },
       { passive: false }
@@ -190,7 +220,7 @@ document.addEventListener("DOMContentLoaded", async () => {
           e.touches[0].pageX - e.touches[1].pageX,
           e.touches[0].pageY - e.touches[1].pageY
         );
-        const zoomFactor = currentDistance > initialDistance ? 1.03 : 0.97;
+        const zoomFactor = currentDistance > initialDistance ? 1.01 : 0.99;
         handleZoom(zoomFactor);
         initialDistance = currentDistance;
       }