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

71 lines
2.8 KiB
Markdown
Raw Normal View History

2018-10-13 09:48:41 -04:00
# Camera oscillate
Begins camera oscillation, which is implemented using a configurable sinusoidal oscillator to offset a specific degree of freedom.
## Packet Details
| Key | Value |
|--|--|
| Name | Camera oscillate |
| Description | Begin camera oscillation. |
| Opcode | 35 |
| Type | Fixed |
| Length | 4 |
| Revision | 317 |
## Packet Structure
| Data Type | Description |
|--|--|
| [Byte](/Data-Types.html#common-data-types) | Parameter (camera X, Z, Y, yaw, pitch) |
| [Byte](/Data-Types.html#common-data-types) | Jitter (for randomization) |
| [Byte](/Data-Types.html#common-data-types) | Amplitude |
| [Byte](/Data-Types.html#common-data-types) | 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.
| 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:
| 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:
| 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:
```java
if (camera_pitch < 128)
camera_pitch = 128
if (camera_pitch > 383)
camera_pitch = 383
```
This is due to Jagex restricting the possible range of orientations the camera may take.