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



所有评论(0)