リソース詳細 · 3D建模
让分件从原位移开,再准确回到原位
用拆解程度0至1计算部件位置,避免每次在当前位置累加,越拖越偏。
本文・例・ライセンスは原文のままです。コードを表示するだけで、オンライン実行やAI呼び出しは行いません。
リソース詳細
理解产品爆炸图的最小数学规则。这里计算位置数据;配合3D引擎才能显示真实模型,不生成模型、不验证碰撞或真实装配。
始める前に
- 対応環境
- Windows · macOS · Linux
- 更新日
- 先安装Node.js 24,准备文本编辑器;无需先安装建模软件。
- 保存为explode-plan.mjs;原位和偏移须使用同一坐标系、同一单位。
node explode-plan.mjsNode.js 24;无需 npm install;本例不联网、不调用AI、不读写用户文件。
よくある注意点
- 文件不要变成.mjs.txt;这是展示位置计算,不会读取或渲染GLB文件。
- 拆解偏移不等于真实拆卸步骤;遮挡、穿插及内部结构需人工验证。
本文全文
// SPDX-License-Identifier: MIT
// 原创教学示例:只算分件展示位置,不打开模型或改文件。
export function explodeParts(parts, amount) {
if (!Array.isArray(parts) || parts.length < 1 || parts.length > 32) throw new TypeError("部件数量须为1至32");
if (!Number.isFinite(amount) || amount < 0 || amount > 1) throw new RangeError("拆解程度须为0至1");
const ids = new Set();
const ownData = (object, key) => {
const field = Object.getOwnPropertyDescriptor(object, key);
if (!field || !("value" in field)) throw new TypeError("部件与坐标须逐项填写,不能使用空位、继承值或getter");
return field.value;
};
const vector = value => {
if (!Array.isArray(value) || value.length !== 3) throw new TypeError("位置与偏移须为三个有限数字");
const copy = [];
for (let axis = 0; axis < 3; axis++) {
const number = ownData(value, String(axis));
if (!Number.isFinite(number) || Math.abs(number) > 10000) throw new TypeError("位置与偏移须为三个有限数字,绝对值不超过10000");
copy.push(number);
}
return copy;
};
const result = [];
for (let index = 0; index < parts.length; index++) {
const part = ownData(parts, String(index));
if (!part || typeof part !== "object" || Array.isArray(part)) throw new TypeError("每项须为一个部件对象");
const id = ownData(part, "id");
if (typeof id !== "string" || !/^[a-z][a-z0-9-]{0,39}$/.test(id) || ids.has(id)) throw new TypeError("部件ID须为唯一小写英文短名:小写字母开头,只含小写字母、数字和连字符");
const position = vector(ownData(part, "position"));
const offset = vector(ownData(part, "offset"));
ids.add(id);
result.push({ id, position: position.map((x, axis) => x + offset[axis] * amount) });
}
return result;
}
const parts = [
{id:"base",position:[0,0,6],offset:[0,0,0]},
{id:"circuit",position:[0,0,15],offset:[0,0,16]},
{id:"frame",position:[0,0,22],offset:[0,0,32]},
{id:"lid",position:[0,0,31],offset:[0,0,48]}
];
console.log(JSON.stringify(explodeParts(parts, 0.5)));使い方
先算清每个部件的原位和展示偏移,再让滑块驱动同一条公式。
先运行固定样品
下载代码,保持.mjs扩展名,在文件所在目录打开终端,输入下方命令。首次只用内置四层桌面控制盒,部件ID为base、circuit、frame、lid;必须用小写,不要写成P01。完整练习入口:/3d/workshop。
核对半拆解位置
单位为毫米,X右、Y后、Z上。amount为0.5时,四个部件的z坐标应为6、23、38、55;这只表示展示位移,不是装配工艺。
回到原位再接画面
把0.5改为0,核对原位6、15、22、31。完整练习入口:/3d/workshop;接入画面时保留原位副本,每帧从原位计算,不在上一帧的位置上反复累加。
- 保存ファイル名
explode-plan.mjs- 実行環境
- Node.js 24;本轮使用v24.19.0核对完整含许可文件。
- 依存関係と費用
- 本例不联网、无第三方依赖、不调用AI、不读写用户文件;无需npm install。真实模型制作、设备及外部服务费用另计。
実行コマンド
node explode-plan.mjs期待される出力
[{"id":"base","position":[0,0,6]},{"id":"circuit","position":[0,0,23]},{"id":"frame","position":[0,0,38]},{"id":"lid","position":[0,0,55]}]ローカル検証
2026-10-23 · Node.js v24.19.0
已运行完整含许可示例,并检查归零、输入边界、重复部件及不改原数据;未安装上游3D引擎,不代表CAD或碰撞验证。
適した用途
- 理解拆解滑块怎样改变位置
- 将已有分件模型接到展示动画
使用前の注意
- 例中尺寸和位移均为虚构示意,不代表真实电路、强度、公差或制造建议。
- 这份.mjs只输出JSON;网页专区另有固定几何体投影演示,不会把本文件当浏览器3D引擎。
作者と出典
- クレジット
- 包子海梦 · AI辅助开发
- 作者と出典
- 提示集贡献者
通知と変更内容
新编写的通用教学示例,发布前仍需核对来源与运行效果。
ライセンス全文
MIT
MIT License Copyright (c) 2026 提示集贡献者 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
検証範囲
教学代码已运行
已运行完整带许可的教学文件并核对输出;不代表生产部署、平台接入或全部边界情况都已验证。
2026-10-23 Node.js v24.19.0