feat(web): T-WEB-006 BVH/FBX → MediaPipe33 关键点预处理
This commit is contained in:
+197
@@ -0,0 +1,197 @@
|
||||
/**
|
||||
* 生成用于测试与验收的 BVH 样例(60 帧挥手 + 深蹲)。
|
||||
* 用法:node test/fixtures/generate-sample-bvh.mjs [输出路径]
|
||||
*/
|
||||
import { writeFileSync } from 'node:fs';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const here = dirname(fileURLToPath(import.meta.url));
|
||||
const outPath = process.argv[2] ?? join(here, 'sample.bvh');
|
||||
|
||||
const HIERARCHY = `HIERARCHY
|
||||
ROOT Hips
|
||||
{
|
||||
OFFSET 0.0 0.0 0.0
|
||||
CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
|
||||
JOINT Spine
|
||||
{
|
||||
OFFSET 0.0 12.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT Neck
|
||||
{
|
||||
OFFSET 0.0 14.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT Head
|
||||
{
|
||||
OFFSET 0.0 8.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 0.0 8.0 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT LeftShoulder
|
||||
{
|
||||
OFFSET 6.0 10.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftArm
|
||||
{
|
||||
OFFSET 12.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftForeArm
|
||||
{
|
||||
OFFSET 22.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftHand
|
||||
{
|
||||
OFFSET 20.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 8.0 0.0 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT RightShoulder
|
||||
{
|
||||
OFFSET -6.0 10.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightArm
|
||||
{
|
||||
OFFSET -12.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightForeArm
|
||||
{
|
||||
OFFSET -22.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightHand
|
||||
{
|
||||
OFFSET -20.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET -8.0 0.0 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT LeftUpLeg
|
||||
{
|
||||
OFFSET 5.0 -3.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftLeg
|
||||
{
|
||||
OFFSET 0.0 -26.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftFoot
|
||||
{
|
||||
OFFSET 0.0 -25.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftToeBase
|
||||
{
|
||||
OFFSET 0.0 -4.0 10.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 0.0 -2.0 6.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT RightUpLeg
|
||||
{
|
||||
OFFSET -5.0 -3.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightLeg
|
||||
{
|
||||
OFFSET 0.0 -26.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightFoot
|
||||
{
|
||||
OFFSET 0.0 -25.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightToeBase
|
||||
{
|
||||
OFFSET 0.0 -4.0 10.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 0.0 -2.0 6.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MOTION
|
||||
`;
|
||||
|
||||
/** 通道顺序(与上面的 HIERARCHY 一致):Hips 6 通道 + 19 个关节各 3 通道 */
|
||||
const JOINT_ORDER = [
|
||||
'Hips',
|
||||
'Spine',
|
||||
'Neck',
|
||||
'Head',
|
||||
'LeftShoulder',
|
||||
'LeftArm',
|
||||
'LeftForeArm',
|
||||
'LeftHand',
|
||||
'RightShoulder',
|
||||
'RightArm',
|
||||
'RightForeArm',
|
||||
'RightHand',
|
||||
'LeftUpLeg',
|
||||
'LeftLeg',
|
||||
'LeftFoot',
|
||||
'LeftToeBase',
|
||||
'RightUpLeg',
|
||||
'RightLeg',
|
||||
'RightFoot',
|
||||
'RightToeBase',
|
||||
];
|
||||
const CHANNELS = 6 + 3 * (JOINT_ORDER.length - 1);
|
||||
const FRAMES = 60;
|
||||
const FRAME_TIME = 1 / 30;
|
||||
|
||||
const lines = [];
|
||||
for (let f = 0; f < FRAMES; f += 1) {
|
||||
const t = f / FRAMES;
|
||||
const phase = Math.sin(t * Math.PI * 2);
|
||||
const squat = (1 - Math.cos(t * Math.PI * 2)) / 2;
|
||||
|
||||
const values = [];
|
||||
for (const joint of JOINT_ORDER) {
|
||||
if (joint === 'Hips') {
|
||||
values.push(0, -squat * 12, 0); // Xposition Yposition Zposition
|
||||
values.push(phase * 6, 0, 0); // Zrotation Xrotation Yrotation
|
||||
continue;
|
||||
}
|
||||
const rot = { z: 0, x: 0, y: 0 };
|
||||
if (joint === 'LeftArm') rot.z = 20 + phase * 55;
|
||||
if (joint === 'RightArm') rot.z = -20 - phase * 55;
|
||||
if (joint === 'LeftForeArm') rot.x = -25 - phase * 30;
|
||||
if (joint === 'RightForeArm') rot.x = -25 + phase * 30;
|
||||
if (joint === 'LeftUpLeg') rot.x = -squat * 35;
|
||||
if (joint === 'RightUpLeg') rot.x = -squat * 35;
|
||||
if (joint === 'LeftLeg') rot.x = squat * 60;
|
||||
if (joint === 'RightLeg') rot.x = squat * 60;
|
||||
if (joint === 'LeftFoot') rot.x = -squat * 25;
|
||||
if (joint === 'RightFoot') rot.x = -squat * 25;
|
||||
if (joint === 'Spine') rot.z = phase * 5;
|
||||
if (joint === 'Neck') rot.z = -phase * 3;
|
||||
values.push(rot.z, rot.x, rot.y);
|
||||
}
|
||||
if (values.length !== CHANNELS) throw new Error(`帧 ${f} 通道数错误:${values.length}`);
|
||||
lines.push(values.map((v) => v.toFixed(4)).join(' '));
|
||||
}
|
||||
|
||||
const text = `${HIERARCHY}Frames: ${FRAMES}\nFrame Time: ${FRAME_TIME.toFixed(7)}\n${lines.join('\n')}\n`;
|
||||
writeFileSync(outPath, text, 'utf8');
|
||||
console.log(`已生成 ${outPath}(${FRAMES} 帧,${CHANNELS} 通道,${text.length} 字节)`);
|
||||
Vendored
+184
@@ -0,0 +1,184 @@
|
||||
HIERARCHY
|
||||
ROOT Hips
|
||||
{
|
||||
OFFSET 0.0 0.0 0.0
|
||||
CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation
|
||||
JOINT Spine
|
||||
{
|
||||
OFFSET 0.0 12.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT Neck
|
||||
{
|
||||
OFFSET 0.0 14.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT Head
|
||||
{
|
||||
OFFSET 0.0 8.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 0.0 8.0 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT LeftShoulder
|
||||
{
|
||||
OFFSET 6.0 10.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftArm
|
||||
{
|
||||
OFFSET 12.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftForeArm
|
||||
{
|
||||
OFFSET 22.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftHand
|
||||
{
|
||||
OFFSET 20.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 8.0 0.0 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT RightShoulder
|
||||
{
|
||||
OFFSET -6.0 10.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightArm
|
||||
{
|
||||
OFFSET -12.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightForeArm
|
||||
{
|
||||
OFFSET -22.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightHand
|
||||
{
|
||||
OFFSET -20.0 0.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET -8.0 0.0 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT LeftUpLeg
|
||||
{
|
||||
OFFSET 5.0 -3.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftLeg
|
||||
{
|
||||
OFFSET 0.0 -26.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftFoot
|
||||
{
|
||||
OFFSET 0.0 -25.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT LeftToeBase
|
||||
{
|
||||
OFFSET 0.0 -4.0 10.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 0.0 -2.0 6.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
JOINT RightUpLeg
|
||||
{
|
||||
OFFSET -5.0 -3.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightLeg
|
||||
{
|
||||
OFFSET 0.0 -26.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightFoot
|
||||
{
|
||||
OFFSET 0.0 -25.0 0.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
JOINT RightToeBase
|
||||
{
|
||||
OFFSET 0.0 -4.0 10.0
|
||||
CHANNELS 3 Zrotation Xrotation Yrotation
|
||||
End Site
|
||||
{
|
||||
OFFSET 0.0 -2.0 6.0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
MOTION
|
||||
Frames: 60
|
||||
Frame Time: 0.0333333
|
||||
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 20.0000 0.0000 0.0000 0.0000 -25.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -20.0000 0.0000 0.0000 0.0000 -25.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.0329 0.0000 0.6272 0.0000 0.0000 0.5226 0.0000 0.0000 -0.3136 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 25.7491 0.0000 0.0000 0.0000 -28.1359 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -25.7491 0.0000 0.0000 0.0000 -21.8641 0.0000 0.0000 0.0000 0.0000 0.0000 -0.0959 0.0000 0.0000 0.1643 0.0000 0.0000 -0.0685 0.0000 0.0000 0.0000 0.0000 0.0000 -0.0959 0.0000 0.0000 0.1643 0.0000 0.0000 -0.0685 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.1311 0.0000 1.2475 0.0000 0.0000 1.0396 0.0000 0.0000 -0.6237 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 31.4351 0.0000 0.0000 0.0000 -31.2374 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -31.4351 0.0000 0.0000 0.0000 -18.7626 0.0000 0.0000 0.0000 0.0000 0.0000 -0.3824 0.0000 0.0000 0.6556 0.0000 0.0000 -0.2732 0.0000 0.0000 0.0000 0.0000 0.0000 -0.3824 0.0000 0.0000 0.6556 0.0000 0.0000 -0.2732 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.2937 0.0000 1.8541 0.0000 0.0000 1.5451 0.0000 0.0000 -0.9271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 36.9959 0.0000 0.0000 0.0000 -34.2705 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -36.9959 0.0000 0.0000 0.0000 -15.7295 0.0000 0.0000 0.0000 0.0000 0.0000 -0.8565 0.0000 0.0000 1.4683 0.0000 0.0000 -0.6118 0.0000 0.0000 0.0000 0.0000 0.0000 -0.8565 0.0000 0.0000 1.4683 0.0000 0.0000 -0.6118 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.5187 0.0000 2.4404 0.0000 0.0000 2.0337 0.0000 0.0000 -1.2202 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 42.3705 0.0000 0.0000 0.0000 -37.2021 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -42.3705 0.0000 0.0000 0.0000 -12.7979 0.0000 0.0000 0.0000 0.0000 0.0000 -1.5130 0.0000 0.0000 2.5936 0.0000 0.0000 -1.0807 0.0000 0.0000 0.0000 0.0000 0.0000 -1.5130 0.0000 0.0000 2.5936 0.0000 0.0000 -1.0807 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.8038 0.0000 3.0000 0.0000 0.0000 2.5000 0.0000 0.0000 -1.5000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 47.5000 0.0000 0.0000 0.0000 -40.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -47.5000 0.0000 0.0000 0.0000 -10.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -2.3446 0.0000 0.0000 4.0192 0.0000 0.0000 -1.6747 0.0000 0.0000 0.0000 0.0000 0.0000 -2.3446 0.0000 0.0000 4.0192 0.0000 0.0000 -1.6747 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -1.1459 0.0000 3.5267 0.0000 0.0000 2.9389 0.0000 0.0000 -1.7634 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 52.3282 0.0000 0.0000 0.0000 -42.6336 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -52.3282 0.0000 0.0000 0.0000 -7.3664 0.0000 0.0000 0.0000 0.0000 0.0000 -3.3422 0.0000 0.0000 5.7295 0.0000 0.0000 -2.3873 0.0000 0.0000 0.0000 0.0000 0.0000 -3.3422 0.0000 0.0000 5.7295 0.0000 0.0000 -2.3873 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -1.5411 0.0000 4.0148 0.0000 0.0000 3.3457 0.0000 0.0000 -2.0074 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 56.8022 0.0000 0.0000 0.0000 -45.0739 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -56.8022 0.0000 0.0000 0.0000 -4.9261 0.0000 0.0000 0.0000 0.0000 0.0000 -4.4950 0.0000 0.0000 7.7057 0.0000 0.0000 -3.2107 0.0000 0.0000 0.0000 0.0000 0.0000 -4.4950 0.0000 0.0000 7.7057 0.0000 0.0000 -3.2107 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -1.9852 0.0000 4.4589 0.0000 0.0000 3.7157 0.0000 0.0000 -2.2294 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 60.8730 0.0000 0.0000 0.0000 -47.2943 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -60.8730 0.0000 0.0000 0.0000 -2.7057 0.0000 0.0000 0.0000 0.0000 0.0000 -5.7902 0.0000 0.0000 9.9261 0.0000 0.0000 -4.1359 0.0000 0.0000 0.0000 0.0000 0.0000 -5.7902 0.0000 0.0000 9.9261 0.0000 0.0000 -4.1359 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -2.4733 0.0000 4.8541 0.0000 0.0000 4.0451 0.0000 0.0000 -2.4271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 64.4959 0.0000 0.0000 0.0000 -49.2705 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -64.4959 0.0000 0.0000 0.0000 -0.7295 0.0000 0.0000 0.0000 0.0000 0.0000 -7.2138 0.0000 0.0000 12.3664 0.0000 0.0000 -5.1527 0.0000 0.0000 0.0000 0.0000 0.0000 -7.2138 0.0000 0.0000 12.3664 0.0000 0.0000 -5.1527 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -3.0000 0.0000 5.1962 0.0000 0.0000 4.3301 0.0000 0.0000 -2.5981 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 67.6314 0.0000 0.0000 0.0000 -50.9808 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -67.6314 0.0000 0.0000 0.0000 0.9808 0.0000 0.0000 0.0000 0.0000 0.0000 -8.7500 0.0000 0.0000 15.0000 0.0000 0.0000 -6.2500 0.0000 0.0000 0.0000 0.0000 0.0000 -8.7500 0.0000 0.0000 15.0000 0.0000 0.0000 -6.2500 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -3.5596 0.0000 5.4813 0.0000 0.0000 4.5677 0.0000 0.0000 -2.7406 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 70.2450 0.0000 0.0000 0.0000 -52.4064 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -70.2450 0.0000 0.0000 0.0000 2.4064 0.0000 0.0000 0.0000 0.0000 0.0000 -10.3821 0.0000 0.0000 17.7979 0.0000 0.0000 -7.4158 0.0000 0.0000 0.0000 0.0000 0.0000 -10.3821 0.0000 0.0000 17.7979 0.0000 0.0000 -7.4158 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -4.1459 0.0000 5.7063 0.0000 0.0000 4.7553 0.0000 0.0000 -2.8532 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 72.3081 0.0000 0.0000 0.0000 -53.5317 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -72.3081 0.0000 0.0000 0.0000 3.5317 0.0000 0.0000 0.0000 0.0000 0.0000 -12.0922 0.0000 0.0000 20.7295 0.0000 0.0000 -8.6373 0.0000 0.0000 0.0000 0.0000 0.0000 -12.0922 0.0000 0.0000 20.7295 0.0000 0.0000 -8.6373 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -4.7525 0.0000 5.8689 0.0000 0.0000 4.8907 0.0000 0.0000 -2.9344 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 73.7981 0.0000 0.0000 0.0000 -54.3444 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -73.7981 0.0000 0.0000 0.0000 4.3444 0.0000 0.0000 0.0000 0.0000 0.0000 -13.8615 0.0000 0.0000 23.7626 0.0000 0.0000 -9.9011 0.0000 0.0000 0.0000 0.0000 0.0000 -13.8615 0.0000 0.0000 23.7626 0.0000 0.0000 -9.9011 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -5.3728 0.0000 5.9671 0.0000 0.0000 4.9726 0.0000 0.0000 -2.9836 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 74.6987 0.0000 0.0000 0.0000 -54.8357 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -74.6987 0.0000 0.0000 0.0000 4.8357 0.0000 0.0000 0.0000 0.0000 0.0000 -15.6708 0.0000 0.0000 26.8641 0.0000 0.0000 -11.1934 0.0000 0.0000 0.0000 0.0000 0.0000 -15.6708 0.0000 0.0000 26.8641 0.0000 0.0000 -11.1934 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -6.0000 0.0000 6.0000 0.0000 0.0000 5.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 75.0000 0.0000 0.0000 0.0000 -55.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -75.0000 0.0000 0.0000 0.0000 5.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -17.5000 0.0000 0.0000 30.0000 0.0000 0.0000 -12.5000 0.0000 0.0000 0.0000 0.0000 0.0000 -17.5000 0.0000 0.0000 30.0000 0.0000 0.0000 -12.5000 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -6.6272 0.0000 5.9671 0.0000 0.0000 4.9726 0.0000 0.0000 -2.9836 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 74.6987 0.0000 0.0000 0.0000 -54.8357 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -74.6987 0.0000 0.0000 0.0000 4.8357 0.0000 0.0000 0.0000 0.0000 0.0000 -19.3292 0.0000 0.0000 33.1359 0.0000 0.0000 -13.8066 0.0000 0.0000 0.0000 0.0000 0.0000 -19.3292 0.0000 0.0000 33.1359 0.0000 0.0000 -13.8066 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -7.2475 0.0000 5.8689 0.0000 0.0000 4.8907 0.0000 0.0000 -2.9344 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 73.7981 0.0000 0.0000 0.0000 -54.3444 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -73.7981 0.0000 0.0000 0.0000 4.3444 0.0000 0.0000 0.0000 0.0000 0.0000 -21.1385 0.0000 0.0000 36.2374 0.0000 0.0000 -15.0989 0.0000 0.0000 0.0000 0.0000 0.0000 -21.1385 0.0000 0.0000 36.2374 0.0000 0.0000 -15.0989 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -7.8541 0.0000 5.7063 0.0000 0.0000 4.7553 0.0000 0.0000 -2.8532 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 72.3081 0.0000 0.0000 0.0000 -53.5317 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -72.3081 0.0000 0.0000 0.0000 3.5317 0.0000 0.0000 0.0000 0.0000 0.0000 -22.9078 0.0000 0.0000 39.2705 0.0000 0.0000 -16.3627 0.0000 0.0000 0.0000 0.0000 0.0000 -22.9078 0.0000 0.0000 39.2705 0.0000 0.0000 -16.3627 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -8.4404 0.0000 5.4813 0.0000 0.0000 4.5677 0.0000 0.0000 -2.7406 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 70.2450 0.0000 0.0000 0.0000 -52.4064 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -70.2450 0.0000 0.0000 0.0000 2.4064 0.0000 0.0000 0.0000 0.0000 0.0000 -24.6179 0.0000 0.0000 42.2021 0.0000 0.0000 -17.5842 0.0000 0.0000 0.0000 0.0000 0.0000 -24.6179 0.0000 0.0000 42.2021 0.0000 0.0000 -17.5842 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -9.0000 0.0000 5.1962 0.0000 0.0000 4.3301 0.0000 0.0000 -2.5981 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 67.6314 0.0000 0.0000 0.0000 -50.9808 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -67.6314 0.0000 0.0000 0.0000 0.9808 0.0000 0.0000 0.0000 0.0000 0.0000 -26.2500 0.0000 0.0000 45.0000 0.0000 0.0000 -18.7500 0.0000 0.0000 0.0000 0.0000 0.0000 -26.2500 0.0000 0.0000 45.0000 0.0000 0.0000 -18.7500 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -9.5267 0.0000 4.8541 0.0000 0.0000 4.0451 0.0000 0.0000 -2.4271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 64.4959 0.0000 0.0000 0.0000 -49.2705 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -64.4959 0.0000 0.0000 0.0000 -0.7295 0.0000 0.0000 0.0000 0.0000 0.0000 -27.7862 0.0000 0.0000 47.6336 0.0000 0.0000 -19.8473 0.0000 0.0000 0.0000 0.0000 0.0000 -27.7862 0.0000 0.0000 47.6336 0.0000 0.0000 -19.8473 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -10.0148 0.0000 4.4589 0.0000 0.0000 3.7157 0.0000 0.0000 -2.2294 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 60.8730 0.0000 0.0000 0.0000 -47.2943 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -60.8730 0.0000 0.0000 0.0000 -2.7057 0.0000 0.0000 0.0000 0.0000 0.0000 -29.2098 0.0000 0.0000 50.0739 0.0000 0.0000 -20.8641 0.0000 0.0000 0.0000 0.0000 0.0000 -29.2098 0.0000 0.0000 50.0739 0.0000 0.0000 -20.8641 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -10.4589 0.0000 4.0148 0.0000 0.0000 3.3457 0.0000 0.0000 -2.0074 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 56.8022 0.0000 0.0000 0.0000 -45.0739 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -56.8022 0.0000 0.0000 0.0000 -4.9261 0.0000 0.0000 0.0000 0.0000 0.0000 -30.5050 0.0000 0.0000 52.2943 0.0000 0.0000 -21.7893 0.0000 0.0000 0.0000 0.0000 0.0000 -30.5050 0.0000 0.0000 52.2943 0.0000 0.0000 -21.7893 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -10.8541 0.0000 3.5267 0.0000 0.0000 2.9389 0.0000 0.0000 -1.7634 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 52.3282 0.0000 0.0000 0.0000 -42.6336 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -52.3282 0.0000 0.0000 0.0000 -7.3664 0.0000 0.0000 0.0000 0.0000 0.0000 -31.6578 0.0000 0.0000 54.2705 0.0000 0.0000 -22.6127 0.0000 0.0000 0.0000 0.0000 0.0000 -31.6578 0.0000 0.0000 54.2705 0.0000 0.0000 -22.6127 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.1962 0.0000 3.0000 0.0000 0.0000 2.5000 0.0000 0.0000 -1.5000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 47.5000 0.0000 0.0000 0.0000 -40.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -47.5000 0.0000 0.0000 0.0000 -10.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -32.6554 0.0000 0.0000 55.9808 0.0000 0.0000 -23.3253 0.0000 0.0000 0.0000 0.0000 0.0000 -32.6554 0.0000 0.0000 55.9808 0.0000 0.0000 -23.3253 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.4813 0.0000 2.4404 0.0000 0.0000 2.0337 0.0000 0.0000 -1.2202 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 42.3705 0.0000 0.0000 0.0000 -37.2021 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -42.3705 0.0000 0.0000 0.0000 -12.7979 0.0000 0.0000 0.0000 0.0000 0.0000 -33.4870 0.0000 0.0000 57.4064 0.0000 0.0000 -23.9193 0.0000 0.0000 0.0000 0.0000 0.0000 -33.4870 0.0000 0.0000 57.4064 0.0000 0.0000 -23.9193 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.7063 0.0000 1.8541 0.0000 0.0000 1.5451 0.0000 0.0000 -0.9271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 36.9959 0.0000 0.0000 0.0000 -34.2705 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -36.9959 0.0000 0.0000 0.0000 -15.7295 0.0000 0.0000 0.0000 0.0000 0.0000 -34.1435 0.0000 0.0000 58.5317 0.0000 0.0000 -24.3882 0.0000 0.0000 0.0000 0.0000 0.0000 -34.1435 0.0000 0.0000 58.5317 0.0000 0.0000 -24.3882 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.8689 0.0000 1.2475 0.0000 0.0000 1.0396 0.0000 0.0000 -0.6237 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 31.4351 0.0000 0.0000 0.0000 -31.2374 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -31.4351 0.0000 0.0000 0.0000 -18.7626 0.0000 0.0000 0.0000 0.0000 0.0000 -34.6176 0.0000 0.0000 59.3444 0.0000 0.0000 -24.7268 0.0000 0.0000 0.0000 0.0000 0.0000 -34.6176 0.0000 0.0000 59.3444 0.0000 0.0000 -24.7268 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.9671 0.0000 0.6272 0.0000 0.0000 0.5226 0.0000 0.0000 -0.3136 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 25.7491 0.0000 0.0000 0.0000 -28.1359 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -25.7491 0.0000 0.0000 0.0000 -21.8641 0.0000 0.0000 0.0000 0.0000 0.0000 -34.9041 0.0000 0.0000 59.8357 0.0000 0.0000 -24.9315 0.0000 0.0000 0.0000 0.0000 0.0000 -34.9041 0.0000 0.0000 59.8357 0.0000 0.0000 -24.9315 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -12.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 20.0000 0.0000 0.0000 0.0000 -25.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -20.0000 0.0000 0.0000 0.0000 -25.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -35.0000 0.0000 0.0000 60.0000 0.0000 0.0000 -25.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -35.0000 0.0000 0.0000 60.0000 0.0000 0.0000 -25.0000 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.9671 0.0000 -0.6272 0.0000 0.0000 -0.5226 0.0000 0.0000 0.3136 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 14.2509 0.0000 0.0000 0.0000 -21.8641 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -14.2509 0.0000 0.0000 0.0000 -28.1359 0.0000 0.0000 0.0000 0.0000 0.0000 -34.9041 0.0000 0.0000 59.8357 0.0000 0.0000 -24.9315 0.0000 0.0000 0.0000 0.0000 0.0000 -34.9041 0.0000 0.0000 59.8357 0.0000 0.0000 -24.9315 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.8689 0.0000 -1.2475 0.0000 0.0000 -1.0396 0.0000 0.0000 0.6237 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 8.5649 0.0000 0.0000 0.0000 -18.7626 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -8.5649 0.0000 0.0000 0.0000 -31.2374 0.0000 0.0000 0.0000 0.0000 0.0000 -34.6176 0.0000 0.0000 59.3444 0.0000 0.0000 -24.7268 0.0000 0.0000 0.0000 0.0000 0.0000 -34.6176 0.0000 0.0000 59.3444 0.0000 0.0000 -24.7268 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.7063 0.0000 -1.8541 0.0000 0.0000 -1.5451 0.0000 0.0000 0.9271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 3.0041 0.0000 0.0000 0.0000 -15.7295 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -3.0041 0.0000 0.0000 0.0000 -34.2705 0.0000 0.0000 0.0000 0.0000 0.0000 -34.1435 0.0000 0.0000 58.5317 0.0000 0.0000 -24.3882 0.0000 0.0000 0.0000 0.0000 0.0000 -34.1435 0.0000 0.0000 58.5317 0.0000 0.0000 -24.3882 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.4813 0.0000 -2.4404 0.0000 0.0000 -2.0337 0.0000 0.0000 1.2202 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -2.3705 0.0000 0.0000 0.0000 -12.7979 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 2.3705 0.0000 0.0000 0.0000 -37.2021 0.0000 0.0000 0.0000 0.0000 0.0000 -33.4870 0.0000 0.0000 57.4064 0.0000 0.0000 -23.9193 0.0000 0.0000 0.0000 0.0000 0.0000 -33.4870 0.0000 0.0000 57.4064 0.0000 0.0000 -23.9193 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -11.1962 0.0000 -3.0000 0.0000 0.0000 -2.5000 0.0000 0.0000 1.5000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -7.5000 0.0000 0.0000 0.0000 -10.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 7.5000 0.0000 0.0000 0.0000 -40.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -32.6554 0.0000 0.0000 55.9808 0.0000 0.0000 -23.3253 0.0000 0.0000 0.0000 0.0000 0.0000 -32.6554 0.0000 0.0000 55.9808 0.0000 0.0000 -23.3253 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -10.8541 0.0000 -3.5267 0.0000 0.0000 -2.9389 0.0000 0.0000 1.7634 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -12.3282 0.0000 0.0000 0.0000 -7.3664 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 12.3282 0.0000 0.0000 0.0000 -42.6336 0.0000 0.0000 0.0000 0.0000 0.0000 -31.6578 0.0000 0.0000 54.2705 0.0000 0.0000 -22.6127 0.0000 0.0000 0.0000 0.0000 0.0000 -31.6578 0.0000 0.0000 54.2705 0.0000 0.0000 -22.6127 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -10.4589 0.0000 -4.0148 0.0000 0.0000 -3.3457 0.0000 0.0000 2.0074 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -16.8022 0.0000 0.0000 0.0000 -4.9261 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 16.8022 0.0000 0.0000 0.0000 -45.0739 0.0000 0.0000 0.0000 0.0000 0.0000 -30.5050 0.0000 0.0000 52.2943 0.0000 0.0000 -21.7893 0.0000 0.0000 0.0000 0.0000 0.0000 -30.5050 0.0000 0.0000 52.2943 0.0000 0.0000 -21.7893 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -10.0148 0.0000 -4.4589 0.0000 0.0000 -3.7157 0.0000 0.0000 2.2294 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -20.8730 0.0000 0.0000 0.0000 -2.7057 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 20.8730 0.0000 0.0000 0.0000 -47.2943 0.0000 0.0000 0.0000 0.0000 0.0000 -29.2098 0.0000 0.0000 50.0739 0.0000 0.0000 -20.8641 0.0000 0.0000 0.0000 0.0000 0.0000 -29.2098 0.0000 0.0000 50.0739 0.0000 0.0000 -20.8641 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -9.5267 0.0000 -4.8541 0.0000 0.0000 -4.0451 0.0000 0.0000 2.4271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -24.4959 0.0000 0.0000 0.0000 -0.7295 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 24.4959 0.0000 0.0000 0.0000 -49.2705 0.0000 0.0000 0.0000 0.0000 0.0000 -27.7862 0.0000 0.0000 47.6336 0.0000 0.0000 -19.8473 0.0000 0.0000 0.0000 0.0000 0.0000 -27.7862 0.0000 0.0000 47.6336 0.0000 0.0000 -19.8473 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -9.0000 0.0000 -5.1962 0.0000 0.0000 -4.3301 0.0000 0.0000 2.5981 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -27.6314 0.0000 0.0000 0.0000 0.9808 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 27.6314 0.0000 0.0000 0.0000 -50.9808 0.0000 0.0000 0.0000 0.0000 0.0000 -26.2500 0.0000 0.0000 45.0000 0.0000 0.0000 -18.7500 0.0000 0.0000 0.0000 0.0000 0.0000 -26.2500 0.0000 0.0000 45.0000 0.0000 0.0000 -18.7500 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -8.4404 0.0000 -5.4813 0.0000 0.0000 -4.5677 0.0000 0.0000 2.7406 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -30.2450 0.0000 0.0000 0.0000 2.4064 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 30.2450 0.0000 0.0000 0.0000 -52.4064 0.0000 0.0000 0.0000 0.0000 0.0000 -24.6179 0.0000 0.0000 42.2021 0.0000 0.0000 -17.5842 0.0000 0.0000 0.0000 0.0000 0.0000 -24.6179 0.0000 0.0000 42.2021 0.0000 0.0000 -17.5842 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -7.8541 0.0000 -5.7063 0.0000 0.0000 -4.7553 0.0000 0.0000 2.8532 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -32.3081 0.0000 0.0000 0.0000 3.5317 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 32.3081 0.0000 0.0000 0.0000 -53.5317 0.0000 0.0000 0.0000 0.0000 0.0000 -22.9078 0.0000 0.0000 39.2705 0.0000 0.0000 -16.3627 0.0000 0.0000 0.0000 0.0000 0.0000 -22.9078 0.0000 0.0000 39.2705 0.0000 0.0000 -16.3627 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -7.2475 0.0000 -5.8689 0.0000 0.0000 -4.8907 0.0000 0.0000 2.9344 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -33.7981 0.0000 0.0000 0.0000 4.3444 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 33.7981 0.0000 0.0000 0.0000 -54.3444 0.0000 0.0000 0.0000 0.0000 0.0000 -21.1385 0.0000 0.0000 36.2374 0.0000 0.0000 -15.0989 0.0000 0.0000 0.0000 0.0000 0.0000 -21.1385 0.0000 0.0000 36.2374 0.0000 0.0000 -15.0989 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -6.6272 0.0000 -5.9671 0.0000 0.0000 -4.9726 0.0000 0.0000 2.9836 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -34.6987 0.0000 0.0000 0.0000 4.8357 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 34.6987 0.0000 0.0000 0.0000 -54.8357 0.0000 0.0000 0.0000 0.0000 0.0000 -19.3292 0.0000 0.0000 33.1359 0.0000 0.0000 -13.8066 0.0000 0.0000 0.0000 0.0000 0.0000 -19.3292 0.0000 0.0000 33.1359 0.0000 0.0000 -13.8066 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -6.0000 0.0000 -6.0000 0.0000 0.0000 -5.0000 0.0000 0.0000 3.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -35.0000 0.0000 0.0000 0.0000 5.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 35.0000 0.0000 0.0000 0.0000 -55.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -17.5000 0.0000 0.0000 30.0000 0.0000 0.0000 -12.5000 0.0000 0.0000 0.0000 0.0000 0.0000 -17.5000 0.0000 0.0000 30.0000 0.0000 0.0000 -12.5000 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -5.3728 0.0000 -5.9671 0.0000 0.0000 -4.9726 0.0000 0.0000 2.9836 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -34.6987 0.0000 0.0000 0.0000 4.8357 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 34.6987 0.0000 0.0000 0.0000 -54.8357 0.0000 0.0000 0.0000 0.0000 0.0000 -15.6708 0.0000 0.0000 26.8641 0.0000 0.0000 -11.1934 0.0000 0.0000 0.0000 0.0000 0.0000 -15.6708 0.0000 0.0000 26.8641 0.0000 0.0000 -11.1934 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -4.7525 0.0000 -5.8689 0.0000 0.0000 -4.8907 0.0000 0.0000 2.9344 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -33.7981 0.0000 0.0000 0.0000 4.3444 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 33.7981 0.0000 0.0000 0.0000 -54.3444 0.0000 0.0000 0.0000 0.0000 0.0000 -13.8615 0.0000 0.0000 23.7626 0.0000 0.0000 -9.9011 0.0000 0.0000 0.0000 0.0000 0.0000 -13.8615 0.0000 0.0000 23.7626 0.0000 0.0000 -9.9011 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -4.1459 0.0000 -5.7063 0.0000 0.0000 -4.7553 0.0000 0.0000 2.8532 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -32.3081 0.0000 0.0000 0.0000 3.5317 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 32.3081 0.0000 0.0000 0.0000 -53.5317 0.0000 0.0000 0.0000 0.0000 0.0000 -12.0922 0.0000 0.0000 20.7295 0.0000 0.0000 -8.6373 0.0000 0.0000 0.0000 0.0000 0.0000 -12.0922 0.0000 0.0000 20.7295 0.0000 0.0000 -8.6373 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -3.5596 0.0000 -5.4813 0.0000 0.0000 -4.5677 0.0000 0.0000 2.7406 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -30.2450 0.0000 0.0000 0.0000 2.4064 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 30.2450 0.0000 0.0000 0.0000 -52.4064 0.0000 0.0000 0.0000 0.0000 0.0000 -10.3821 0.0000 0.0000 17.7979 0.0000 0.0000 -7.4158 0.0000 0.0000 0.0000 0.0000 0.0000 -10.3821 0.0000 0.0000 17.7979 0.0000 0.0000 -7.4158 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -3.0000 0.0000 -5.1962 0.0000 0.0000 -4.3301 0.0000 0.0000 2.5981 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -27.6314 0.0000 0.0000 0.0000 0.9808 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 27.6314 0.0000 0.0000 0.0000 -50.9808 0.0000 0.0000 0.0000 0.0000 0.0000 -8.7500 0.0000 0.0000 15.0000 0.0000 0.0000 -6.2500 0.0000 0.0000 0.0000 0.0000 0.0000 -8.7500 0.0000 0.0000 15.0000 0.0000 0.0000 -6.2500 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -2.4733 0.0000 -4.8541 0.0000 0.0000 -4.0451 0.0000 0.0000 2.4271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -24.4959 0.0000 0.0000 0.0000 -0.7295 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 24.4959 0.0000 0.0000 0.0000 -49.2705 0.0000 0.0000 0.0000 0.0000 0.0000 -7.2138 0.0000 0.0000 12.3664 0.0000 0.0000 -5.1527 0.0000 0.0000 0.0000 0.0000 0.0000 -7.2138 0.0000 0.0000 12.3664 0.0000 0.0000 -5.1527 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -1.9852 0.0000 -4.4589 0.0000 0.0000 -3.7157 0.0000 0.0000 2.2294 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -20.8730 0.0000 0.0000 0.0000 -2.7057 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 20.8730 0.0000 0.0000 0.0000 -47.2943 0.0000 0.0000 0.0000 0.0000 0.0000 -5.7902 0.0000 0.0000 9.9261 0.0000 0.0000 -4.1359 0.0000 0.0000 0.0000 0.0000 0.0000 -5.7902 0.0000 0.0000 9.9261 0.0000 0.0000 -4.1359 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -1.5411 0.0000 -4.0148 0.0000 0.0000 -3.3457 0.0000 0.0000 2.0074 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -16.8022 0.0000 0.0000 0.0000 -4.9261 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 16.8022 0.0000 0.0000 0.0000 -45.0739 0.0000 0.0000 0.0000 0.0000 0.0000 -4.4950 0.0000 0.0000 7.7057 0.0000 0.0000 -3.2107 0.0000 0.0000 0.0000 0.0000 0.0000 -4.4950 0.0000 0.0000 7.7057 0.0000 0.0000 -3.2107 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -1.1459 0.0000 -3.5267 0.0000 0.0000 -2.9389 0.0000 0.0000 1.7634 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -12.3282 0.0000 0.0000 0.0000 -7.3664 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 12.3282 0.0000 0.0000 0.0000 -42.6336 0.0000 0.0000 0.0000 0.0000 0.0000 -3.3422 0.0000 0.0000 5.7295 0.0000 0.0000 -2.3873 0.0000 0.0000 0.0000 0.0000 0.0000 -3.3422 0.0000 0.0000 5.7295 0.0000 0.0000 -2.3873 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.8038 0.0000 -3.0000 0.0000 0.0000 -2.5000 0.0000 0.0000 1.5000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -7.5000 0.0000 0.0000 0.0000 -10.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 7.5000 0.0000 0.0000 0.0000 -40.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -2.3446 0.0000 0.0000 4.0192 0.0000 0.0000 -1.6747 0.0000 0.0000 0.0000 0.0000 0.0000 -2.3446 0.0000 0.0000 4.0192 0.0000 0.0000 -1.6747 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.5187 0.0000 -2.4404 0.0000 0.0000 -2.0337 0.0000 0.0000 1.2202 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -2.3705 0.0000 0.0000 0.0000 -12.7979 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 2.3705 0.0000 0.0000 0.0000 -37.2021 0.0000 0.0000 0.0000 0.0000 0.0000 -1.5130 0.0000 0.0000 2.5936 0.0000 0.0000 -1.0807 0.0000 0.0000 0.0000 0.0000 0.0000 -1.5130 0.0000 0.0000 2.5936 0.0000 0.0000 -1.0807 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.2937 0.0000 -1.8541 0.0000 0.0000 -1.5451 0.0000 0.0000 0.9271 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 3.0041 0.0000 0.0000 0.0000 -15.7295 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -3.0041 0.0000 0.0000 0.0000 -34.2705 0.0000 0.0000 0.0000 0.0000 0.0000 -0.8565 0.0000 0.0000 1.4683 0.0000 0.0000 -0.6118 0.0000 0.0000 0.0000 0.0000 0.0000 -0.8565 0.0000 0.0000 1.4683 0.0000 0.0000 -0.6118 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.1311 0.0000 -1.2475 0.0000 0.0000 -1.0396 0.0000 0.0000 0.6237 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 8.5649 0.0000 0.0000 0.0000 -18.7626 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -8.5649 0.0000 0.0000 0.0000 -31.2374 0.0000 0.0000 0.0000 0.0000 0.0000 -0.3824 0.0000 0.0000 0.6556 0.0000 0.0000 -0.2732 0.0000 0.0000 0.0000 0.0000 0.0000 -0.3824 0.0000 0.0000 0.6556 0.0000 0.0000 -0.2732 0.0000 0.0000 0.0000 0.0000
|
||||
0.0000 -0.0329 0.0000 -0.6272 0.0000 0.0000 -0.5226 0.0000 0.0000 0.3136 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 14.2509 0.0000 0.0000 0.0000 -21.8641 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -14.2509 0.0000 0.0000 0.0000 -28.1359 0.0000 0.0000 0.0000 0.0000 0.0000 -0.0959 0.0000 0.0000 0.1643 0.0000 0.0000 -0.0685 0.0000 0.0000 0.0000 0.0000 0.0000 -0.0959 0.0000 0.0000 0.1643 0.0000 0.0000 -0.0685 0.0000 0.0000 0.0000 0.0000
|
||||
@@ -0,0 +1,252 @@
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { join } from 'node:path';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { forwardKinematics, parseBvh } from '../src/preprocess/bvh-parser';
|
||||
import { bvhToKeypointFrames } from '../src/preprocess/retarget';
|
||||
import {
|
||||
BINARY_FRAME_BYTES,
|
||||
decodeBinaryFrame,
|
||||
encodeBinaryFrame,
|
||||
parseFramesNdjson,
|
||||
serializeFramesNdjson,
|
||||
} from '../src/preprocess/keypoint-codec';
|
||||
import { ANGLE_TRIPLETS, KEYPOINT_COUNT, MP, PARENT_TABLE, VIRTUAL } from '../src/preprocess/mediapipe33';
|
||||
import { angleCos } from '../src/preprocess/math3d';
|
||||
import { CONTRACT_VERSIONS, parseVersionFile } from '../src/config/contract-versions';
|
||||
|
||||
const samplePath = join(__dirname, 'fixtures', 'sample.bvh');
|
||||
const sampleText = readFileSync(samplePath, 'utf8');
|
||||
|
||||
describe('BVH 解析器', () => {
|
||||
it('解析层级、帧数与通道数', () => {
|
||||
const motion = parseBvh(sampleText);
|
||||
expect(motion.frameCount).toBe(60);
|
||||
expect(motion.channelCount).toBe(63);
|
||||
expect(motion.frameTime).toBeCloseTo(1 / 30, 6);
|
||||
expect(motion.root.name).toBe('Hips');
|
||||
expect(motion.frames).toHaveLength(60);
|
||||
expect(motion.frames[0]).toHaveLength(63);
|
||||
expect(motion.byName.get('leftforearm')).toBeDefined();
|
||||
});
|
||||
|
||||
it('前向运动学给出有限且随帧变化的世界坐标', () => {
|
||||
const motion = parseBvh(sampleText);
|
||||
const first = forwardKinematics(motion, 0);
|
||||
const last = forwardKinematics(motion, 59);
|
||||
const hipsFirst = first.get('hips')!.position;
|
||||
expect(hipsFirst.every((v) => Number.isFinite(v))).toBe(true);
|
||||
|
||||
const handFirst = first.get('lefthand')!.position;
|
||||
const handLast = last.get('lefthand')!.position;
|
||||
expect(handFirst).not.toEqual(handLast);
|
||||
});
|
||||
|
||||
it('拒绝非法输入', () => {
|
||||
expect(() => parseBvh('不是 BVH')).toThrow();
|
||||
expect(() => parseBvh('HIERARCHY\nMOTION\n')).toThrow();
|
||||
});
|
||||
|
||||
it('通道值与帧数不匹配时报错', () => {
|
||||
const broken = sampleText.replace('Frames: 60', 'Frames: 61');
|
||||
expect(() => parseBvh(broken)).toThrow(/期望 3843 个通道值/);
|
||||
});
|
||||
});
|
||||
|
||||
describe('MediaPipe33 拓扑常量', () => {
|
||||
it('父节点表覆盖 33 点 + 2 个虚拟关节', () => {
|
||||
expect(PARENT_TABLE).toHaveLength(35);
|
||||
expect(PARENT_TABLE[VIRTUAL.PELVIS]).toBe(-1);
|
||||
expect(PARENT_TABLE[VIRTUAL.NECK]).toBe(VIRTUAL.PELVIS);
|
||||
expect(PARENT_TABLE[MP.NOSE]).toBe(VIRTUAL.NECK);
|
||||
});
|
||||
|
||||
it('父节点索引不产生环(除根外均指向更大的层级)', () => {
|
||||
// 从任意点沿父链上溯必须能终止在 -1
|
||||
for (let i = 0; i <= VIRTUAL.PELVIS; i += 1) {
|
||||
let cursor = i;
|
||||
let hops = 0;
|
||||
while (cursor !== -1) {
|
||||
cursor = PARENT_TABLE[cursor];
|
||||
hops += 1;
|
||||
expect(hops).toBeLessThan(64);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('关节角三元组共 9 组且索引合法', () => {
|
||||
expect(ANGLE_TRIPLETS).toHaveLength(9);
|
||||
for (const [a, b, c] of ANGLE_TRIPLETS) {
|
||||
for (const index of [a, b, c]) {
|
||||
expect(index).toBeGreaterThanOrEqual(0);
|
||||
expect(index).toBeLessThanOrEqual(VIRTUAL.PELVIS);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('BVH → MediaPipe33 重定向', () => {
|
||||
const motion = parseBvh(sampleText);
|
||||
const frames = bvhToKeypointFrames(motion);
|
||||
|
||||
it('每帧输出 33 个关键点(虚拟关节不外泄)', () => {
|
||||
expect(frames).toHaveLength(60);
|
||||
for (const frame of frames) {
|
||||
expect(frame.points).toHaveLength(KEYPOINT_COUNT);
|
||||
expect(frame.angles).toHaveLength(9);
|
||||
}
|
||||
});
|
||||
|
||||
it('坐标落在 MediaPipe 归一化范围', () => {
|
||||
for (const frame of frames) {
|
||||
for (const [x, y, z, conf] of frame.points) {
|
||||
expect(x).toBeGreaterThanOrEqual(0);
|
||||
expect(x).toBeLessThanOrEqual(1);
|
||||
expect(y).toBeGreaterThanOrEqual(0);
|
||||
expect(y).toBeLessThanOrEqual(1);
|
||||
expect(z).toBeGreaterThanOrEqual(-1);
|
||||
expect(z).toBeLessThanOrEqual(1);
|
||||
expect(conf).toBeGreaterThanOrEqual(0);
|
||||
expect(conf).toBeLessThanOrEqual(1);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('髋部相对骨盆居中(左右髋对称于中心附近)', () => {
|
||||
const x = frames[0].points[MP.LEFT_HIP][0];
|
||||
const y = frames[0].points[MP.RIGHT_HIP][0];
|
||||
expect(Math.abs(x - y)).toBeLessThan(0.2);
|
||||
});
|
||||
|
||||
it('直接映射的点置信度为 1,推算点为 0.5', () => {
|
||||
const confs = new Set(frames[0].points.map((p) => p[3]));
|
||||
expect(confs.has(1)).toBe(true);
|
||||
expect(confs.has(0.5)).toBe(true);
|
||||
for (const conf of confs) expect([1, 0.5, 0]).toContain(conf);
|
||||
});
|
||||
|
||||
it('时间戳按帧率推进', () => {
|
||||
expect(frames[0].timeMs).toBe(0);
|
||||
expect(frames[30].timeMs).toBeCloseTo(1000, 1);
|
||||
});
|
||||
|
||||
it('关节角余弦在 [-1,1] 且非全零', () => {
|
||||
const nonZero = frames.some((f) => f.angles.some((v) => Math.abs(v) > 1e-6));
|
||||
expect(nonZero).toBe(true);
|
||||
for (const frame of frames) {
|
||||
for (const value of frame.angles) {
|
||||
expect(value).toBeGreaterThanOrEqual(-1.0001);
|
||||
expect(value).toBeLessThanOrEqual(1.0001);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('动作随时间变化(不是静止序列)', () => {
|
||||
const firstHand = frames[0].points[MP.LEFT_WRIST];
|
||||
const lastHand = frames[59].points[MP.LEFT_WRIST];
|
||||
const delta = Math.hypot(firstHand[0] - lastHand[0], firstHand[1] - lastHand[1]);
|
||||
expect(delta).toBeGreaterThan(0.01);
|
||||
});
|
||||
});
|
||||
|
||||
describe('角度计算', () => {
|
||||
it('直角余弦为 0,同向为 1,反向为 -1', () => {
|
||||
const b: [number, number, number] = [0, 0, 0];
|
||||
expect(angleCos([1, 0, 0], b, [0, 1, 0])).toBeCloseTo(0, 6);
|
||||
expect(angleCos([1, 0, 0], b, [2, 0, 0])).toBeCloseTo(1, 6);
|
||||
expect(angleCos([1, 0, 0], b, [-1, 0, 0])).toBeCloseTo(-1, 6);
|
||||
});
|
||||
|
||||
it('退化向量返回 0 而不产生 NaN', () => {
|
||||
expect(angleCos([0, 0, 0], [0, 0, 0], [1, 0, 0])).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('239 字节二进制帧编解码(契约 websocket-keypoints.md)', () => {
|
||||
const makePoints = (): Array<[number, number, number, number]> =>
|
||||
Array.from({ length: KEYPOINT_COUNT }, (_, i) => [
|
||||
(i % 33) / 32,
|
||||
1 - (i % 33) / 32,
|
||||
((i % 7) - 3) / 10,
|
||||
i % 2 === 0 ? 1 : 0.5,
|
||||
]);
|
||||
|
||||
it('编码结果恰好 239 字节且 magic/版本正确', () => {
|
||||
const buf = encodeBinaryFrame(42, makePoints(), 1);
|
||||
expect(buf).toHaveLength(BINARY_FRAME_BYTES);
|
||||
expect(buf.readUInt16LE(0)).toBe(0x4f44);
|
||||
expect(buf.readUInt8(2)).toBe(1);
|
||||
expect(buf.readUInt8(3)).toBe(1);
|
||||
expect(buf.readUInt32LE(4)).toBe(42);
|
||||
});
|
||||
|
||||
it('编解码往返误差小于定点精度', () => {
|
||||
const points = makePoints();
|
||||
const decoded = decodeBinaryFrame(encodeBinaryFrame(7, points, 0));
|
||||
expect(decoded.frameId).toBe(7);
|
||||
expect(decoded.points).toHaveLength(33);
|
||||
points.forEach((original, i) => {
|
||||
for (let axis = 0; axis < 3; axis += 1) {
|
||||
expect(decoded.points[i][axis]).toBeCloseTo(original[axis], 3);
|
||||
}
|
||||
expect(decoded.points[i][3]).toBeCloseTo(original[3], 2);
|
||||
});
|
||||
});
|
||||
|
||||
it('拒绝错误长度与错误 magic', () => {
|
||||
expect(() => decodeBinaryFrame(Buffer.alloc(238))).toThrow(/239/);
|
||||
const bad = Buffer.alloc(BINARY_FRAME_BYTES);
|
||||
expect(() => decodeBinaryFrame(bad)).toThrow(/magic/);
|
||||
});
|
||||
|
||||
it('极值不会溢出 int16', () => {
|
||||
const points = makePoints();
|
||||
points[0] = [1, 1, -1, 1];
|
||||
points[1] = [0, 0, 1, 0];
|
||||
const decoded = decodeBinaryFrame(encodeBinaryFrame(0, points));
|
||||
expect(decoded.points[0][0]).toBeCloseTo(1, 4);
|
||||
expect(decoded.points[0][2]).toBeCloseTo(-1, 4);
|
||||
});
|
||||
});
|
||||
|
||||
describe('NDJSON 关键点序列', () => {
|
||||
it('序列化后可解析回原结构', () => {
|
||||
const motion = parseBvh(sampleText);
|
||||
const frames = bvhToKeypointFrames(motion).slice(0, 5);
|
||||
const ndjson = serializeFramesNdjson(frames);
|
||||
expect(ndjson.trim().split('\n')).toHaveLength(5);
|
||||
|
||||
const parsed = parseFramesNdjson(ndjson);
|
||||
expect(parsed).toHaveLength(5);
|
||||
// JSON 往返会把 -0 变成 0,因此逐元素按精度比较
|
||||
parsed[0].points.forEach((point, i) => {
|
||||
point.forEach((value, axis) => {
|
||||
expect(value).toBeCloseTo(frames[0].points[i][axis], 10);
|
||||
});
|
||||
});
|
||||
parsed[4].angles.forEach((value, i) => {
|
||||
expect(value).toBeCloseTo(frames[4].angles[i], 10);
|
||||
});
|
||||
expect(parsed[4].points).toHaveLength(KEYPOINT_COUNT);
|
||||
});
|
||||
|
||||
it('拒绝点数不足的帧', () => {
|
||||
expect(() => parseFramesNdjson('{"frame":0,"timeMs":0,"points":[[0,0,0,1]],"angles":[]}')).toThrow(/33/);
|
||||
});
|
||||
|
||||
it('拒绝非法 JSON 行', () => {
|
||||
expect(() => parseFramesNdjson('{oops}')).toThrow(/合法 JSON/);
|
||||
});
|
||||
});
|
||||
|
||||
describe('契约版本一致性', () => {
|
||||
it('解析 contracts/VERSION 的键值', () => {
|
||||
const parsed = parseVersionFile('# 注释\nrest-api: 0.1.0\n\ndatabase: 0.1.0\n');
|
||||
expect(parsed).toEqual({ 'rest-api': '0.1.0', database: '0.1.0' });
|
||||
});
|
||||
|
||||
it('代码内常量与 contracts/VERSION 完全一致(否则 npm run contracts:check 会失败)', () => {
|
||||
const versionFile = join(__dirname, '..', '..', 'contracts', 'VERSION');
|
||||
const fileVersions = parseVersionFile(readFileSync(versionFile, 'utf8'));
|
||||
expect(fileVersions).toEqual({ ...CONTRACT_VERSIONS });
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user