Punch Glitch: Difference between revisions
No edit summary |
|||
| Line 5: | Line 5: | ||
<blockquote> | <blockquote> | ||
The issue is the acos in logic-target.gc. In PCSX2/PS2 it can never quite return 0.0. But on PC it does, and it causes 0/0 instead of 0/very-small-number. This is used as the input to a slerp and it ends up setting the output quaternion to 0 0 0 0. Over the next 2 frames, this completely breaks the dir-targ and unknown-quaternion00 and the target/camera rotation matrix ends up being identity. This sudden change rotates jak's velocity so it is entirely in the global x direction. | ''The issue is the acos in logic-target.gc. In PCSX2/PS2 it can never quite return 0.0. But on PC it does, and it causes 0/0 instead of 0/very-small-number. This is used as the input to a slerp and it ends up setting the output quaternion to 0 0 0 0. Over the next 2 frames, this completely breaks the dir-targ and unknown-quaternion00 and the target/camera rotation matrix ends up being identity. This sudden change rotates jak's velocity so it is entirely in the global x direction. | ||
My understanding is that this should only happen when the dir-targ aligns with jak's velocity exactly. It may only be catastrophic if the camera is also aligned so that pushing forward on the stick will move jak in this direction. | My understanding is that this should only happen when the dir-targ aligns with jak's velocity exactly. It may only be catastrophic if the camera is also aligned so that pushing forward on the stick will move jak in this direction. | ||
| Line 11: | Line 11: | ||
I don't think the location has anything to do with it. It's possible that it only happens on ground that's perfectly level but I don't know. Instead, I think it tends to happen in places where people are lined up well with the camera and punching in/out of the camera exactly. | I don't think the location has anything to do with it. It's possible that it only happens on ground that's perfectly level but I don't know. Instead, I think it tends to happen in places where people are lined up well with the camera and punching in/out of the camera exactly. | ||
- Water111 | - Water111'' | ||
</blockquote> | </blockquote> | ||
The following code was added to <code>acos</code> in <code>trigonometry.gc</code> to fix the problem: | The following code was added to <code>acos</code> in <code>trigonometry.gc</code> to fix the problem: | ||
Revision as of 00:48, 19 February 2024
Punch glitch is a bug that is exclusively encountered on the PlayStation 3 Jak and Daxter Collection.
Technical
During the development of the PC port for Jak and Daxter: The Precursor Legacy, it was discovered that punch glitch was occurring.
The issue is the acos in logic-target.gc. In PCSX2/PS2 it can never quite return 0.0. But on PC it does, and it causes 0/0 instead of 0/very-small-number. This is used as the input to a slerp and it ends up setting the output quaternion to 0 0 0 0. Over the next 2 frames, this completely breaks the dir-targ and unknown-quaternion00 and the target/camera rotation matrix ends up being identity. This sudden change rotates jak's velocity so it is entirely in the global x direction.
My understanding is that this should only happen when the dir-targ aligns with jak's velocity exactly. It may only be catastrophic if the camera is also aligned so that pushing forward on the stick will move jak in this direction.
I don't think the location has anything to do with it. It's possible that it only happens on ground that's perfectly level but I don't know. Instead, I think it tends to happen in places where people are lined up well with the camera and punching in/out of the camera exactly.
- Water111
The following code was added to acos in trigonometry.gc to fix the problem:
(defun acos ((arg0 float))
"Inverse cosine. Returns rotation units"
(let ((result (- 16384.000000 (asin arg0))))
(#when PC_PORT
;; to avoid punch glitch:
;; (note: it might be a better fix to change the global rounding mode,
;; but it's not super clear to me that the mode picked by PCSX2 is
;; more accurate than normal in all cases. So, we'll do this for now.)
(when (= result 0.0)
(set! result 0.00000000001)
)
)
result
)
)