|
@@ -56,7 +56,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
position += chunk.length; // 更新位置
|
|
position += chunk.length; // 更新位置
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- const usd_binary = new Uint8Array(usd_data);
|
|
|
|
|
|
|
+ // const usd_binary = new Uint8Array(usd_data);
|
|
|
|
|
|
|
|
// 加载 TinyUSDZ
|
|
// 加载 TinyUSDZ
|
|
|
initTinyUSDZ().then(function (TinyUSDZLoader) {
|
|
initTinyUSDZ().then(function (TinyUSDZLoader) {
|
|
@@ -138,10 +138,31 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
|
|
|
|
|
//const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
|
|
//const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
|
|
|
const cube = new THREE.Mesh(geometry, material);
|
|
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);
|
|
scene.add(cube);
|
|
|
|
|
|
|
|
//camera.position.z = 25;
|
|
//camera.position.z = 25;
|
|
|
- camera.position.z = 1.0;
|
|
|
|
|
|
|
+ // camera.position.z = 1.0;
|
|
|
|
|
|
|
|
const controls = new OrbitControls(camera, renderer.domElement);
|
|
const controls = new OrbitControls(camera, renderer.domElement);
|
|
|
|
|
|
|
@@ -158,8 +179,17 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
const handleZoom = (delta) => {
|
|
const handleZoom = (delta) => {
|
|
|
// console.log('--------',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.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",
|
|
"wheel",
|
|
|
(e) => {
|
|
(e) => {
|
|
|
e.preventDefault();
|
|
e.preventDefault();
|
|
|
- const zoomFactor = e.deltaY > 0 ? 0.9 : 1.1;
|
|
|
|
|
|
|
+ const zoomFactor = e.deltaY > 0 ? 0.95 : 1.05;
|
|
|
handleZoom(zoomFactor);
|
|
handleZoom(zoomFactor);
|
|
|
},
|
|
},
|
|
|
{ passive: false }
|
|
{ passive: false }
|
|
@@ -190,7 +220,7 @@ document.addEventListener("DOMContentLoaded", async () => {
|
|
|
e.touches[0].pageX - e.touches[1].pageX,
|
|
e.touches[0].pageX - e.touches[1].pageX,
|
|
|
e.touches[0].pageY - e.touches[1].pageY
|
|
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);
|
|
handleZoom(zoomFactor);
|
|
|
initialDistance = currentDistance;
|
|
initialDistance = currentDistance;
|
|
|
}
|
|
}
|