@drawcall/acta 0.1.20 → 0.1.22
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/dist/behavior.d.ts +1 -1
- package/dist/behavior.js +25 -3
- package/package.json +1 -1
package/dist/behavior.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnimationClip, EventDispatcher, LoadingManager, Vector3 } from 'three';
|
|
2
2
|
import type { Behavior } from './types.js';
|
|
3
3
|
import { CharacterModel, BoneMap } from '@pmndrs/viverse';
|
|
4
|
-
export type
|
|
4
|
+
export type LoadedAnimationInfo = {
|
|
5
5
|
name: string;
|
|
6
6
|
compatibleMasks: Array<'fullbody' | 'upperbody' | 'lowerbody'>;
|
|
7
7
|
isAdditiveAiming: boolean;
|
package/dist/behavior.js
CHANGED
|
@@ -18,6 +18,28 @@ const localQuaternionHelper = new Quaternion();
|
|
|
18
18
|
const eulerHelper = new Euler();
|
|
19
19
|
const directionHelper = new Vector3();
|
|
20
20
|
const vectorHelper = new Vector3();
|
|
21
|
+
const worldQuaternionHelper = new Quaternion();
|
|
22
|
+
const parentWorldQuaternionHelper = new Quaternion();
|
|
23
|
+
const parentWorldQuaternionInvHelper = new Quaternion();
|
|
24
|
+
const worldEulerHelper = new Euler(0, 0, 0, 'YXZ');
|
|
25
|
+
const worldYawDirectionHelper = new Vector3();
|
|
26
|
+
const getWorldYaw = (object) => {
|
|
27
|
+
object.getWorldQuaternion(worldQuaternionHelper);
|
|
28
|
+
worldEulerHelper.setFromQuaternion(worldQuaternionHelper, 'YXZ');
|
|
29
|
+
return worldEulerHelper.y;
|
|
30
|
+
};
|
|
31
|
+
const setWorldYaw = (object, desiredWorldYaw) => {
|
|
32
|
+
if (object.parent == null) {
|
|
33
|
+
object.rotation.y = desiredWorldYaw;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
worldYawDirectionHelper.set(Math.sin(desiredWorldYaw), 0, Math.cos(desiredWorldYaw));
|
|
37
|
+
object.parent.getWorldQuaternion(parentWorldQuaternionHelper);
|
|
38
|
+
parentWorldQuaternionInvHelper.copy(parentWorldQuaternionHelper).invert();
|
|
39
|
+
worldYawDirectionHelper.applyQuaternion(parentWorldQuaternionInvHelper);
|
|
40
|
+
const localYaw = Math.atan2(worldYawDirectionHelper.x, worldYawDirectionHelper.z);
|
|
41
|
+
object.rotation.y = localYaw;
|
|
42
|
+
};
|
|
21
43
|
//TODO: support direction AND position targets for head and aim
|
|
22
44
|
export class CharacterBehavior extends EventDispatcher {
|
|
23
45
|
model;
|
|
@@ -145,14 +167,14 @@ export class CharacterBehavior extends EventDispatcher {
|
|
|
145
167
|
}
|
|
146
168
|
// Lerp body yaw with angle wrapping
|
|
147
169
|
this.currentBodyYaw = lerpAngle(this.currentBodyYaw, targetBodyYaw, BodyRotationSpeed * delta);
|
|
148
|
-
this.model.scene
|
|
170
|
+
setWorldYaw(this.model.scene, this.currentBodyYaw);
|
|
149
171
|
this.updateTimeline?.(undefined, delta);
|
|
150
172
|
this.model.mixer.update(delta);
|
|
151
173
|
// Stabilize spine during aiming to face the aim direction
|
|
152
174
|
if (this.isAiming) {
|
|
153
175
|
const spineBone = this.model.scene.getObjectByName('spine');
|
|
154
176
|
// Extract yaw from aim direction and add PI offset for model facing
|
|
155
|
-
const aimYaw = this.model.scene
|
|
177
|
+
const aimYaw = getWorldYaw(this.model.scene) + Math.PI + SpineAimYawOffset;
|
|
156
178
|
// Create target quaternion with just the yaw (no pitch/roll)
|
|
157
179
|
eulerHelper.set(0, aimYaw, 0, 'YXZ');
|
|
158
180
|
quaternionHelper.setFromEuler(eulerHelper);
|
|
@@ -260,7 +282,7 @@ export class CharacterBehavior extends EventDispatcher {
|
|
|
260
282
|
return () => parallel('all', action({
|
|
261
283
|
update: () => {
|
|
262
284
|
// Transform world velocity to model's local space by rotating by inverse of model's Y rotation
|
|
263
|
-
vectorHelper.copy(this.worldMoveVelocity).applyAxisAngle(UpVector, -this.model.scene
|
|
285
|
+
vectorHelper.copy(this.worldMoveVelocity).applyAxisAngle(UpVector, -getWorldYaw(this.model.scene));
|
|
264
286
|
const speed = normalizedLocalMoveDirection.set(vectorHelper.x, -vectorHelper.z).length();
|
|
265
287
|
normalizedLocalMoveDirection.divideScalar(speed);
|
|
266
288
|
jogFwdAction.timeScale = 0.222 * speed;
|