目录

three.js 坐标系

three-bvh-csg 缩放模型


three.js 坐标系

在 Three.js 中,默认的坐标系规则是右手坐标系(与 OpenGL 一致)

//  x 右是正  y 上是正 z:靠近相机是正 

three-bvh-csg 缩放模型

        this.loader.load(url, gltf => {
            const model = gltf.scene;
            const modelId = this._generateId();

            model.traverse(c => {
                if (c.isMesh) {
                    c.castShadow = true;
                    c.receiveShadow = true;
                }
            });

            if (!this._hasValidMeshes(model)) {
                console.warn("⚠️ 模型无有效网格:", url);
                alert("上传的模型不包含任何网格,无法操作。");
                reject(new Error("No mesh in model"));
                return;
            }

            const pos = position || { x: this.models.size * 1.8, y: -0.3, z: 0 };
            model.position.set(pos.x, pos.y, pos.z);
            model.userData = { id: modelId, url, type: 'loaded' };
            const model_size =5;
			const box = new THREE.Box3().setFromObject(model);
			const sz = box.getSize(new THREE.Vector3());
			const maxDim = Math.max(sz.x, sz.y, sz.z);
			const size = box.getSize(new THREE.Vector3());
			const center = box.getCenter(new THREE.Vector3());

			const scaleFactor = model_size / maxDim;

			model.scale.multiplyScalar(scaleFactor);

			console.log("原始 maxDim =", maxDim);
			console.log("自动缩放 =", scaleFactor);
			console.log(`GLB模型: ${modelId}原始尺寸:`);
			console.log(`  宽度(X): ${size.x.toFixed(3)} mm`);
			console.log(`  高度(Y): ${size.y.toFixed(3)} mm`);
			console.log(`  深度(Z): ${size.z.toFixed(3)} mm`);
			console.log(`  中心点: (${center.x.toFixed(3)}, ${center.y.toFixed(3)}, ${center.z.toFixed(3)})`);

            this.scene.add(model);

            this.models.set(modelId, {
                model: model,
                cutParts: [],
                cutPlaneMesh: null,
                currentCutPlaneSize: DEFAULT_PLANE_SIZE,
                url: url,
                originalModelGroup: model.clone(),
                selectedPartIndex: -1,
                selectedObject: 'model'
            });

            this.setActiveModel(modelId);

            console.log(`✅ 模型加载成功: ${url} (ID: ${modelId})`);
            resolve({ modelId, model });

        }, undefined, err => {
            console.error(`❌ 模型加载失败: ${url}`, err);
            alert(`模型加载失败: ${err.message || '未知错误'}`);
            reject(err);
        });

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐