reze-engine 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -6
- package/dist/engine.d.ts +1 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +3 -0
- package/dist/model.d.ts +7 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +43 -0
- package/package.json +1 -1
- package/src/engine.ts +8 -0
- package/src/model.ts +51 -0
- package/dist/runtime-bone.d.ts +0 -49
- package/dist/runtime-bone.d.ts.map +0 -1
- package/dist/runtime-bone.js +0 -121
package/README.md
CHANGED
|
@@ -2,17 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
A lightweight engine built with WebGPU and TypeScript for real-time 3D anime character MMD model rendering.
|
|
4
4
|
|
|
5
|
+

|
|
6
|
+
|
|
5
7
|
## Features
|
|
6
8
|
|
|
7
|
-
-
|
|
9
|
+
- Blinn-Phong lighting
|
|
8
10
|
- Alpha blending
|
|
9
|
-
- Post alpha eye rendering
|
|
11
|
+
- Post alpha eye rendering (the see-through eyes)
|
|
10
12
|
- Rim lighting
|
|
11
13
|
- Outlines
|
|
12
14
|
- MSAA 4x anti-aliasing
|
|
13
|
-
- Bone and morph
|
|
15
|
+
- Bone and morph API
|
|
14
16
|
- VMD animation
|
|
15
|
-
-
|
|
17
|
+
- IK solver
|
|
18
|
+
- Ammo/Bullet physics
|
|
16
19
|
|
|
17
20
|
## Usage
|
|
18
21
|
|
|
@@ -24,10 +27,10 @@ export default function Scene() {
|
|
|
24
27
|
const initEngine = useCallback(async () => {
|
|
25
28
|
if (canvasRef.current) {
|
|
26
29
|
try {
|
|
27
|
-
const engine = new Engine(canvasRef.current)
|
|
30
|
+
const engine = new Engine(canvasRef.current, {})
|
|
28
31
|
engineRef.current = engine
|
|
29
32
|
await engine.init()
|
|
30
|
-
await engine.loadModel("/models
|
|
33
|
+
await engine.loadModel("/models/reze/reze.pmx")
|
|
31
34
|
|
|
32
35
|
engine.runRenderLoop(() => {})
|
|
33
36
|
} catch (error) {
|
|
@@ -52,11 +55,76 @@ export default function Scene() {
|
|
|
52
55
|
}
|
|
53
56
|
```
|
|
54
57
|
|
|
58
|
+
Engine options
|
|
59
|
+
|
|
60
|
+
```javascript
|
|
61
|
+
const DEFAULT_ENGINE_OPTIONS: RequiredEngineOptions = {
|
|
62
|
+
ambientColor: new Vec3(0.82, 0.82, 0.82),
|
|
63
|
+
directionalLightIntensity: 0.2,
|
|
64
|
+
minSpecularIntensity: 0.3,
|
|
65
|
+
rimLightIntensity: 0.4,
|
|
66
|
+
cameraDistance: 26.6,
|
|
67
|
+
cameraTarget: new Vec3(0, 12.5, 0),
|
|
68
|
+
cameraFov: Math.PI / 4,
|
|
69
|
+
onRaycast: undefined,
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## API
|
|
74
|
+
|
|
75
|
+
### Animation Playback
|
|
76
|
+
|
|
77
|
+
Load and play VMD animation files.
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
await engine.loadAnimation("/animations/dance.vmd")
|
|
81
|
+
engine.playAnimation()
|
|
82
|
+
engine.pauseAnimation()
|
|
83
|
+
engine.stopAnimation()
|
|
84
|
+
engine.seekAnimation(2.5) // seek to 2.5 seconds
|
|
85
|
+
|
|
86
|
+
const { current, duration, percentage } = engine.getAnimationProgress()
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Bone and Morph Tweening
|
|
90
|
+
|
|
91
|
+
Rotate and move bones with optional tween duration. Translations are VMD-style (relative to bind pose world position).
|
|
92
|
+
|
|
93
|
+
```javascript
|
|
94
|
+
engine.rotateBones({ "首": neckQuat, "頭": headQuat }, 300)
|
|
95
|
+
engine.moveBones({ "センター": centerVec }, 300)
|
|
96
|
+
engine.setMorphWeight("まばたき", 1.0, 300)
|
|
97
|
+
|
|
98
|
+
engine.resetAllBones()
|
|
99
|
+
engine.resetAllMorphs()
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Atomic Pose Setting
|
|
103
|
+
|
|
104
|
+
Set rotations, translations, and morphs in a single atomic pass — for animation editors, motion capture, or any use case that needs precise, immediate pose updates matching the quality of internal VMD playback.
|
|
105
|
+
|
|
106
|
+
```javascript
|
|
107
|
+
engine.setPose(
|
|
108
|
+
{ "首": neckQuat, "頭": headQuat, "左腕": leftArmQuat },
|
|
109
|
+
{ "センター": centerVec },
|
|
110
|
+
{ "まばたき": 0.5, "あ": 0.3 }
|
|
111
|
+
)
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
All three parameters are optional. Pass only what you need:
|
|
115
|
+
|
|
116
|
+
```javascript
|
|
117
|
+
engine.setPose(rotations) // rotations only
|
|
118
|
+
engine.setPose(undefined, translations) // translations only
|
|
119
|
+
engine.setPose(undefined, undefined, morphs) // morphs only
|
|
120
|
+
```
|
|
121
|
+
|
|
55
122
|
## Projects Using This Engine
|
|
56
123
|
|
|
57
124
|
- **[MiKaPo](https://mikapo.vercel.app)** - Online real-time motion capture for MMD using webcam and MediaPipe
|
|
58
125
|
- **[Popo](https://popo.love)** - Fine-tuned LLM that generates MMD poses from natural language descriptions
|
|
59
126
|
- **[MPL](https://mmd-mpl.vercel.app)** - Semantic motion programming language for scripting MMD animations with intuitive syntax
|
|
127
|
+
- **[Mixamo-MMD](https://mixamo-mmd.vercel.app)** - Retarget Mixamo FBX animation to VMD in one click
|
|
60
128
|
|
|
61
129
|
## Tutorial
|
|
62
130
|
|
package/dist/engine.d.ts
CHANGED
|
@@ -129,6 +129,7 @@ export declare class Engine {
|
|
|
129
129
|
loadModel(path: string): Promise<void>;
|
|
130
130
|
rotateBones(boneRotations: Record<string, Quat>, durationMs?: number): void;
|
|
131
131
|
moveBones(boneTranslations: Record<string, Vec3>, durationMs?: number): void;
|
|
132
|
+
setPose(rotations?: Record<string, Quat>, translations?: Record<string, Vec3>, morphs?: Record<string, number>): void;
|
|
132
133
|
resetAllBones(): void;
|
|
133
134
|
resetAllMorphs(): void;
|
|
134
135
|
setMorphWeight(name: string, weight: number, durationMs?: number): void;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -987,6 +987,9 @@ export class Engine {
|
|
|
987
987
|
moveBones(boneTranslations, durationMs) {
|
|
988
988
|
this.currentModel?.moveBones(boneTranslations, durationMs);
|
|
989
989
|
}
|
|
990
|
+
setPose(rotations, translations, morphs) {
|
|
991
|
+
this.currentModel?.setPose(rotations, translations, morphs);
|
|
992
|
+
}
|
|
990
993
|
resetAllBones() {
|
|
991
994
|
this.currentModel?.resetAllBones();
|
|
992
995
|
}
|
package/dist/model.d.ts
CHANGED
|
@@ -156,6 +156,13 @@ export declare class Model {
|
|
|
156
156
|
getBoneInverseBindMatrices(): Float32Array;
|
|
157
157
|
getSkinMatrices(): Float32Array;
|
|
158
158
|
setMorphWeight(name: string, weight: number, durationMs?: number): void;
|
|
159
|
+
/**
|
|
160
|
+
* Atomic pose setter for external animation editors.
|
|
161
|
+
* Sets bone rotations, translations, and morph weights in a single pass,
|
|
162
|
+
* identical to how getPoseAtTime applies VMD poses during playback.
|
|
163
|
+
* Cancels any active tweens on affected bones/morphs.
|
|
164
|
+
*/
|
|
165
|
+
setPose(rotations?: Record<string, Quat>, translations?: Record<string, Vec3>, morphs?: Record<string, number>): void;
|
|
159
166
|
private applyMorphs;
|
|
160
167
|
/**
|
|
161
168
|
* Load VMD animation file
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/model.js
CHANGED
|
@@ -464,6 +464,49 @@ export class Model {
|
|
|
464
464
|
this.runtimeMorph.weights[idx] = startWeight;
|
|
465
465
|
this.applyMorphs();
|
|
466
466
|
}
|
|
467
|
+
/**
|
|
468
|
+
* Atomic pose setter for external animation editors.
|
|
469
|
+
* Sets bone rotations, translations, and morph weights in a single pass,
|
|
470
|
+
* identical to how getPoseAtTime applies VMD poses during playback.
|
|
471
|
+
* Cancels any active tweens on affected bones/morphs.
|
|
472
|
+
*/
|
|
473
|
+
setPose(rotations, translations, morphs) {
|
|
474
|
+
const state = this.tweenState;
|
|
475
|
+
if (rotations) {
|
|
476
|
+
for (const [name, quat] of Object.entries(rotations)) {
|
|
477
|
+
const idx = this.runtimeSkeleton.nameIndex[name] ?? -1;
|
|
478
|
+
if (idx < 0 || idx >= this.skeleton.bones.length)
|
|
479
|
+
continue;
|
|
480
|
+
this.runtimeSkeleton.localRotations[idx].set(quat.clone().normalize());
|
|
481
|
+
state.rotActive[idx] = 0;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
if (translations) {
|
|
485
|
+
for (const [name, vec] of Object.entries(translations)) {
|
|
486
|
+
const idx = this.runtimeSkeleton.nameIndex[name] ?? -1;
|
|
487
|
+
if (idx < 0 || idx >= this.skeleton.bones.length)
|
|
488
|
+
continue;
|
|
489
|
+
const rotation = rotations?.[name]?.clone().normalize();
|
|
490
|
+
const localTranslation = this.convertVMDTranslationToLocal(idx, vec, rotation);
|
|
491
|
+
this.runtimeSkeleton.localTranslations[idx].set(localTranslation);
|
|
492
|
+
state.transActive[idx] = 0;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (morphs) {
|
|
496
|
+
let morphChanged = false;
|
|
497
|
+
for (const [name, weight] of Object.entries(morphs)) {
|
|
498
|
+
const idx = this.runtimeMorph.nameIndex[name] ?? -1;
|
|
499
|
+
if (idx < 0 || idx >= this.runtimeMorph.weights.length)
|
|
500
|
+
continue;
|
|
501
|
+
this.runtimeMorph.weights[idx] = Math.max(0, Math.min(1, weight));
|
|
502
|
+
state.morphActive[idx] = 0;
|
|
503
|
+
morphChanged = true;
|
|
504
|
+
}
|
|
505
|
+
if (morphChanged) {
|
|
506
|
+
this.applyMorphs();
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
467
510
|
applyMorphs() {
|
|
468
511
|
// Reset vertex data to base positions
|
|
469
512
|
this.vertexData.set(this.baseVertexData);
|
package/package.json
CHANGED
package/src/engine.ts
CHANGED
|
@@ -1155,6 +1155,14 @@ export class Engine {
|
|
|
1155
1155
|
this.currentModel?.moveBones(boneTranslations, durationMs)
|
|
1156
1156
|
}
|
|
1157
1157
|
|
|
1158
|
+
public setPose(
|
|
1159
|
+
rotations?: Record<string, Quat>,
|
|
1160
|
+
translations?: Record<string, Vec3>,
|
|
1161
|
+
morphs?: Record<string, number>
|
|
1162
|
+
): void {
|
|
1163
|
+
this.currentModel?.setPose(rotations, translations, morphs)
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1158
1166
|
public resetAllBones() {
|
|
1159
1167
|
this.currentModel?.resetAllBones()
|
|
1160
1168
|
}
|
package/src/model.ts
CHANGED
|
@@ -723,6 +723,57 @@ export class Model {
|
|
|
723
723
|
this.applyMorphs()
|
|
724
724
|
}
|
|
725
725
|
|
|
726
|
+
/**
|
|
727
|
+
* Atomic pose setter for external animation editors.
|
|
728
|
+
* Sets bone rotations, translations, and morph weights in a single pass,
|
|
729
|
+
* identical to how getPoseAtTime applies VMD poses during playback.
|
|
730
|
+
* Cancels any active tweens on affected bones/morphs.
|
|
731
|
+
*/
|
|
732
|
+
setPose(
|
|
733
|
+
rotations?: Record<string, Quat>,
|
|
734
|
+
translations?: Record<string, Vec3>,
|
|
735
|
+
morphs?: Record<string, number>
|
|
736
|
+
): void {
|
|
737
|
+
const state = this.tweenState
|
|
738
|
+
|
|
739
|
+
if (rotations) {
|
|
740
|
+
for (const [name, quat] of Object.entries(rotations)) {
|
|
741
|
+
const idx = this.runtimeSkeleton.nameIndex[name] ?? -1
|
|
742
|
+
if (idx < 0 || idx >= this.skeleton.bones.length) continue
|
|
743
|
+
|
|
744
|
+
this.runtimeSkeleton.localRotations[idx].set(quat.clone().normalize())
|
|
745
|
+
state.rotActive[idx] = 0
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
if (translations) {
|
|
750
|
+
for (const [name, vec] of Object.entries(translations)) {
|
|
751
|
+
const idx = this.runtimeSkeleton.nameIndex[name] ?? -1
|
|
752
|
+
if (idx < 0 || idx >= this.skeleton.bones.length) continue
|
|
753
|
+
|
|
754
|
+
const rotation = rotations?.[name]?.clone().normalize()
|
|
755
|
+
const localTranslation = this.convertVMDTranslationToLocal(idx, vec, rotation)
|
|
756
|
+
this.runtimeSkeleton.localTranslations[idx].set(localTranslation)
|
|
757
|
+
state.transActive[idx] = 0
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
if (morphs) {
|
|
762
|
+
let morphChanged = false
|
|
763
|
+
for (const [name, weight] of Object.entries(morphs)) {
|
|
764
|
+
const idx = this.runtimeMorph.nameIndex[name] ?? -1
|
|
765
|
+
if (idx < 0 || idx >= this.runtimeMorph.weights.length) continue
|
|
766
|
+
|
|
767
|
+
this.runtimeMorph.weights[idx] = Math.max(0, Math.min(1, weight))
|
|
768
|
+
state.morphActive[idx] = 0
|
|
769
|
+
morphChanged = true
|
|
770
|
+
}
|
|
771
|
+
if (morphChanged) {
|
|
772
|
+
this.applyMorphs()
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
|
|
726
777
|
private applyMorphs(): void {
|
|
727
778
|
// Reset vertex data to base positions
|
|
728
779
|
this.vertexData.set(this.baseVertexData)
|
package/dist/runtime-bone.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Quat, Vec3, Mat4 } from "./math";
|
|
2
|
-
import type { Bone } from "./model";
|
|
3
|
-
/**
|
|
4
|
-
* Runtime bone state - encapsulates bone pose and world matrix
|
|
5
|
-
* Similar to babylon-mmd's IMmdRuntimeBone approach
|
|
6
|
-
*/
|
|
7
|
-
export declare class RuntimeBone {
|
|
8
|
-
localRotation: Quat;
|
|
9
|
-
localTranslation: Vec3;
|
|
10
|
-
worldMatrix: Mat4;
|
|
11
|
-
readonly bone: Bone;
|
|
12
|
-
readonly index: number;
|
|
13
|
-
ikRotation?: Quat;
|
|
14
|
-
constructor(bone: Bone, index: number);
|
|
15
|
-
/**
|
|
16
|
-
* Set local rotation
|
|
17
|
-
*/
|
|
18
|
-
setRotation(rotation: Quat): void;
|
|
19
|
-
/**
|
|
20
|
-
* Set local translation
|
|
21
|
-
*/
|
|
22
|
-
setTranslation(translation: Vec3): void;
|
|
23
|
-
/**
|
|
24
|
-
* Get world position from world matrix
|
|
25
|
-
*/
|
|
26
|
-
getWorldPosition(): Vec3;
|
|
27
|
-
/**
|
|
28
|
-
* Update world matrix based on local rotation, translation, and parent's world matrix
|
|
29
|
-
* Handles append rotations and translations
|
|
30
|
-
*
|
|
31
|
-
* @param parentWorldMatrix Parent's world matrix (null if root bone)
|
|
32
|
-
* @param allBones Array of all runtime bones (for append parent lookup)
|
|
33
|
-
* @param applyIK Whether to apply IK rotation (default: true). Set to false when computing initial world matrices before IK solving.
|
|
34
|
-
*/
|
|
35
|
-
updateWorldMatrix(parentWorldMatrix: Mat4 | null, allBones: RuntimeBone[], applyIK?: boolean): void;
|
|
36
|
-
/**
|
|
37
|
-
* Reset IK rotation to identity
|
|
38
|
-
*/
|
|
39
|
-
resetIKRotation(): void;
|
|
40
|
-
/**
|
|
41
|
-
* Set IK rotation delta (accumulated during IK solving)
|
|
42
|
-
*/
|
|
43
|
-
setIKRotation(ikRotation: Quat): void;
|
|
44
|
-
/**
|
|
45
|
-
* Apply IK rotation to local rotation and clear IK rotation
|
|
46
|
-
*/
|
|
47
|
-
applyIKRotation(): void;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=runtime-bone.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-bone.d.ts","sourceRoot":"","sources":["../src/runtime-bone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAEnC;;;GAGG;AACH,qBAAa,WAAW;IACf,aAAa,EAAE,IAAI,CAAA;IACnB,gBAAgB,EAAE,IAAI,CAAA;IACtB,WAAW,EAAE,IAAI,CAAA;IACxB,SAAgB,IAAI,EAAE,IAAI,CAAA;IAC1B,SAAgB,KAAK,EAAE,MAAM,CAAA;IAGtB,UAAU,CAAC,EAAE,IAAI,CAAA;gBAEZ,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM;IAQrC;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI;IAIjC;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI;IAIvC;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;;;;;;OAOG;IACH,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,GAAE,OAAc,GAAG,IAAI;IA2EzG;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI;IAIrC;;OAEG;IACH,eAAe,IAAI,IAAI;CAMxB"}
|
package/dist/runtime-bone.js
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { Quat, Vec3, Mat4 } from "./math";
|
|
2
|
-
/**
|
|
3
|
-
* Runtime bone state - encapsulates bone pose and world matrix
|
|
4
|
-
* Similar to babylon-mmd's IMmdRuntimeBone approach
|
|
5
|
-
*/
|
|
6
|
-
export class RuntimeBone {
|
|
7
|
-
constructor(bone, index) {
|
|
8
|
-
this.bone = bone;
|
|
9
|
-
this.index = index;
|
|
10
|
-
this.localRotation = Quat.identity();
|
|
11
|
-
this.localTranslation = new Vec3(0, 0, 0);
|
|
12
|
-
this.worldMatrix = Mat4.identity();
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Set local rotation
|
|
16
|
-
*/
|
|
17
|
-
setRotation(rotation) {
|
|
18
|
-
this.localRotation.set(rotation);
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Set local translation
|
|
22
|
-
*/
|
|
23
|
-
setTranslation(translation) {
|
|
24
|
-
this.localTranslation.set(translation);
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Get world position from world matrix
|
|
28
|
-
*/
|
|
29
|
-
getWorldPosition() {
|
|
30
|
-
const m = this.worldMatrix.values;
|
|
31
|
-
return new Vec3(m[12], m[13], m[14]);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Update world matrix based on local rotation, translation, and parent's world matrix
|
|
35
|
-
* Handles append rotations and translations
|
|
36
|
-
*
|
|
37
|
-
* @param parentWorldMatrix Parent's world matrix (null if root bone)
|
|
38
|
-
* @param allBones Array of all runtime bones (for append parent lookup)
|
|
39
|
-
* @param applyIK Whether to apply IK rotation (default: true). Set to false when computing initial world matrices before IK solving.
|
|
40
|
-
*/
|
|
41
|
-
updateWorldMatrix(parentWorldMatrix, allBones, applyIK = true) {
|
|
42
|
-
// Start with local rotation
|
|
43
|
-
let finalRot = this.localRotation;
|
|
44
|
-
// Apply IK rotation if present and applyIK is true
|
|
45
|
-
if (applyIK && this.ikRotation) {
|
|
46
|
-
finalRot = this.ikRotation.multiply(finalRot).normalize();
|
|
47
|
-
}
|
|
48
|
-
// Build rotation matrix
|
|
49
|
-
let rotateM = Mat4.fromQuat(finalRot.x, finalRot.y, finalRot.z, finalRot.w);
|
|
50
|
-
let addLocalTx = 0, addLocalTy = 0, addLocalTz = 0;
|
|
51
|
-
// Handle append rotation and translation
|
|
52
|
-
const appendParentIdx = this.bone.appendParentIndex;
|
|
53
|
-
const hasAppend = this.bone.appendRotate && appendParentIdx !== undefined && appendParentIdx >= 0 && appendParentIdx < allBones.length;
|
|
54
|
-
if (hasAppend) {
|
|
55
|
-
const ratio = this.bone.appendRatio === undefined ? 1 : Math.max(-1, Math.min(1, this.bone.appendRatio));
|
|
56
|
-
const hasRatio = Math.abs(ratio) > 1e-6;
|
|
57
|
-
if (hasRatio) {
|
|
58
|
-
if (this.bone.appendRotate) {
|
|
59
|
-
const appendParent = allBones[appendParentIdx];
|
|
60
|
-
const appendRot = appendParent.localRotation;
|
|
61
|
-
let ax = appendRot.x;
|
|
62
|
-
let ay = appendRot.y;
|
|
63
|
-
let az = appendRot.z;
|
|
64
|
-
const aw = appendRot.w;
|
|
65
|
-
const absRatio = ratio < 0 ? -ratio : ratio;
|
|
66
|
-
if (ratio < 0) {
|
|
67
|
-
ax = -ax;
|
|
68
|
-
ay = -ay;
|
|
69
|
-
az = -az;
|
|
70
|
-
}
|
|
71
|
-
const appendQuat = new Quat(ax, ay, az, aw);
|
|
72
|
-
const result = Quat.slerp(Quat.identity(), appendQuat, absRatio);
|
|
73
|
-
rotateM = Mat4.fromQuat(result.x, result.y, result.z, result.w).multiply(rotateM);
|
|
74
|
-
}
|
|
75
|
-
if (this.bone.appendMove) {
|
|
76
|
-
const appendParent = allBones[appendParentIdx];
|
|
77
|
-
const appendTrans = appendParent.localTranslation;
|
|
78
|
-
const appendRatio = this.bone.appendRatio ?? 1;
|
|
79
|
-
addLocalTx = appendTrans.x * appendRatio;
|
|
80
|
-
addLocalTy = appendTrans.y * appendRatio;
|
|
81
|
-
addLocalTz = appendTrans.z * appendRatio;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
// Build local matrix: bind translation, then rotation, then local translation + append translation
|
|
86
|
-
const localTx = this.localTranslation.x + addLocalTx;
|
|
87
|
-
const localTy = this.localTranslation.y + addLocalTy;
|
|
88
|
-
const localTz = this.localTranslation.z + addLocalTz;
|
|
89
|
-
const bindMat = Mat4.identity().translateInPlace(this.bone.bindTranslation[0], this.bone.bindTranslation[1], this.bone.bindTranslation[2]);
|
|
90
|
-
const transMat = Mat4.identity().translateInPlace(localTx, localTy, localTz);
|
|
91
|
-
const localM = bindMat.multiply(rotateM).multiply(transMat);
|
|
92
|
-
// Compute world matrix
|
|
93
|
-
if (parentWorldMatrix) {
|
|
94
|
-
this.worldMatrix = parentWorldMatrix.multiply(localM);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
this.worldMatrix = localM;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Reset IK rotation to identity
|
|
102
|
-
*/
|
|
103
|
-
resetIKRotation() {
|
|
104
|
-
this.ikRotation = undefined;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Set IK rotation delta (accumulated during IK solving)
|
|
108
|
-
*/
|
|
109
|
-
setIKRotation(ikRotation) {
|
|
110
|
-
this.ikRotation = ikRotation;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Apply IK rotation to local rotation and clear IK rotation
|
|
114
|
-
*/
|
|
115
|
-
applyIKRotation() {
|
|
116
|
-
if (this.ikRotation) {
|
|
117
|
-
this.localRotation = this.ikRotation.multiply(this.localRotation).normalize();
|
|
118
|
-
this.ikRotation = undefined;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|