fix(puppet): v0.4.1 — normalize target_local before clamp (south-flick fix)
When body's world.rot crosses ±π (e.g., body facing south), target_local in the look-at-block could momentarily be ≈±2π. Without normalization, the snap-branch wrote that raw value to state.angle, then rot_min/rot_max clamp produced a discontinuous jump (head 'flicked sideways' when body faced south, per manual interactive test). Fix: normalize target_local to (-π, π] BEFORE the snap/slerp/rate-limit branch and BEFORE clamp. Symmetric handling regardless of which smoothing mode the bone uses.
This commit is contained in:
6
init.lua
6
init.lua
@@ -980,6 +980,12 @@ update_bone_recursive = function(p, b, dt)
|
|||||||
-- atan(dx, -dy): rot=0 when target is straight up, rot=pi/2 when target is to the right.
|
-- atan(dx, -dy): rot=0 when target is straight up, rot=pi/2 when target is to the right.
|
||||||
local world_angle = math.atan(dx, -dy)
|
local world_angle = math.atan(dx, -dy)
|
||||||
local target_local = world_angle - pa
|
local target_local = world_angle - pa
|
||||||
|
-- Normalize target_local to (-π, π] so snap/clamp don't see ±2π
|
||||||
|
-- discontinuities when parent.world.rot crosses ±π (e.g., body
|
||||||
|
-- facing south wraps parent.world.rot near ±π and target_local
|
||||||
|
-- can momentarily be ≈ ±2π without normalization → head flicks).
|
||||||
|
while target_local > math.pi do target_local = target_local - 2 * math.pi end
|
||||||
|
while target_local < -math.pi do target_local = target_local + 2 * math.pi end
|
||||||
|
|
||||||
-- Persistent state for slerp/rate-limit (carries angle across frames).
|
-- Persistent state for slerp/rate-limit (carries angle across frames).
|
||||||
local state = p.look_at_state[bid]
|
local state = p.look_at_state[bid]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"id": "lib-core.puppet",
|
"id": "lib-core.puppet",
|
||||||
"version": "0.4.0",
|
"version": "0.4.1",
|
||||||
"api_min": "0.1",
|
"api_min": "0.1",
|
||||||
"deps": []
|
"deps": []
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user