rswiki-book/src/317/317-Camera-shake.md

57 lines
3.0 KiB
Markdown
Raw Normal View History

2018-07-03 00:31:18 -04:00
\[\[Category Packet\]\] \[\[Category Packet 317\]\]
{{packet\|name=Camera oscillate\|description=Begin camera
oscillation\|opcode=35\|type=Fixed\|length=4\|revision=317}} == Camera
oscillate ==
=== Description === Begins camera oscillation, which is implemented
using a configurable sinusoidal oscillator to offset a specific degree
of freedom.
=== Packet Structure ===
{\| border=2 ! Data type ! Description \|- \| \[\[Data Types\#Standard
data types\|Byte\]\] \| Parameter (camera X, Z, Y, yaw, pitch) \|- \|
\[\[Data Types\#Standard data types\|Byte\]\] \| Jitter - for
randomization \|- \| \[\[Data Types\#Standard data types\|Byte\]\] \|
Amplitude \|- \| \[\[Data Types\#Standard data types\|Byte\]\] \|
Frequency (scaled by 100) \|- \|}
=== Other Information === The oscillate event enables the client to
oscillate one of 5 of it's position parameters, i.e. corresponding to
the camera's degrees of freedom; parameters 0, 1, and 2 refer to the
location of the camera, while 3 and 4 deal with the camera's
orientation. Together, these enable complex effects involving
manipulation of the camera position to give rise to simulated
earth-quakes and camera shock. {\| border=2 ! Parameter ! Description
\|- \| 0 \| Camera location along world X axis (a horizontal axis,
aligned with map grid X) \|- \| 1 \| Camera location along world Z axis
(vertical axis) \|- \| 2 \| Camera location along world Y axis (a
horizontal axis, aligned with map grid Y) \|- \| 3 \| Camera orientation
in world X plane w.r.t. world Z axis, i.e. yaw \|- \| 4 \| Camera
orientation in world Z plane w.r.t. world X axis, i.e. pitch \|- \|}
Note there is no built-in way to manipulate camera roll, as this is not
one of the camera's degrees of freedom.
=== What it's doing === Every time the world is rendered, each camera
parameter that is enabled for oscillation is offset by a value computed
as follows: {\| border=2 ! Calculation ! Formula \|- \| Delta \| (int)
((Math.random() \* (double) (jitter \* 2 + 1) - (double) jitter) +
Math.sin((double) phase \* ((double) frequency / 100D)) \* (double)
amplitude); \|- \|} Each parameter's phase accumulator (phase) is
incremented by 1 each logic update.
=== Parameter === The offset itself is detailed as follows for each
parameter: {\| border=2 ! Parameter ! Action \|- \| 0 \| camera\_x +=
delta \|- \| 1 \| camera\_z += delta \|- \| 2 \| camera\_y += delta \|-
\| 3 \| camera\_yaw = camera\_yaw + delta & 0x7ff; \|- \| 4 \|
camera\_pitch += delta \|- \|} Note that the camera's yaw is corrected
modulo 0x7ff, or 2048, which is equivalent to 2{{{pi}}} radians in
Jagex's binary angle system. This is not done to the camera pitch, which
is instead clamped (see below).
=== Note === For oscillating the camera pitch, clamping is done to
ensure the angle not out of bounds: {\| border=2 \|- \|if (camera\_pitch
\< 128) then camera\_pitch = 128 \|- \|if (camera\_pitch \> 383) then
camera\_pitch = 383 \|- \|} This is do to Jagex restricting the possible
range of orientations the camera may take.