32 lines
1.0 KiB
JavaScript
32 lines
1.0 KiB
JavaScript
/* IK 求解 Worker(module 之外的经典 Worker,用 importScripts 取 UMD 求解器)。
|
||||
|
|
协议:主线程先发 {op:'init', cfg} → 回 {op:'ready'};之后 {id, op, args} → {id, r}。
|
|||
|
|
旧实现是从页面 <script> 里刮求解器源码再拼 boot 字符串,那是单文件时代的产物:
|
|||
|
|
拆成 <script src> 之后 textContent 为空,会静默退回主线程同步求解。 */
|
|||
|
|
importScripts('../js/ik-solver.js');
|
|||
|
|
|
|||
|
|
let S = null;
|
|||
|
|
|
|||
|
|
onmessage = e => {
|
|||
|
|
const d = e.data || {};
|
|||
|
|
if (d.op === 'init') {
|
|||
|
|
try {
|
|||
|
|
S = ArmIK.make(d.cfg);
|
|||
|
|
postMessage({ op: 'ready' });
|
|||
|
|
} catch (err) {
|
|||
|
|
postMessage({ id: d.id, r: { __err: 'init 失败: ' + String(err && err.message || err) } });
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (!S) {
|
|||
|
|
postMessage({ id: d.id, r: { __err: 'worker 未初始化(没收到 init)' } });
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
let r;
|
|||
|
|
try {
|
|||
|
|
r = S[d.op].apply(S, d.args);
|
|||
|
|
} catch (err) {
|
|||
|
|
r = { __err: String(err && err.message || err) };
|
|||
|
|
}
|
|||
|
|
postMessage({ id: d.id, r: r });
|
|||
|
|
};
|