@drawcall/acta 0.1.21 → 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.
Files changed (2) hide show
  1. package/dist/behavior.js +25 -3
  2. package/package.json +1 -1
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.rotation.y = this.currentBodyYaw;
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.rotation.y + Math.PI + SpineAimYawOffset;
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.rotation.y);
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;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@drawcall/acta",
3
3
  "type": "module",
4
4
  "main": "dist/index.js",
5
- "version": "0.1.21",
5
+ "version": "0.1.22",
6
6
  "author": "Bela Bohlender",
7
7
  "license": "SEE LICENSE IN LICENSE",
8
8
  "homepage": "https://drawcall.ai",