71 lines
2.8 KiB
Markdown
71 lines
2.8 KiB
Markdown
# 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.
|