-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Vehicle Sprite Layout
This page shows the order and angles in which the sprites for the various angles for tracked ride vehicles are laid out.
Legacy sprite groups combined multiple angles into a single sprite group, new sprite groups combine fewer angles into a single sprite group - most have a single bank and pitch which are mirrored for all permutations.
All vehicles start facing the Northeast direction. This is sprite_direction 0 (sprite_direction is used to control the vehicle's yaw). Vehicles turn clockwise as sprite_direction increases in 360/n increments where n is the sprite precision. One revolution of the vehicle with a particular pitch and roll is called a rank.
The order begins at the Northeast direction and rotates clockwise
The only exception to the Northeast rule is diagonal sprite groups, since no cardinally-aligned track piece uses the same slopes as the diagonal slopes. Diagonal track sprites start aligned to the diagonal (East) instead of Northeast. This is allowed because sprite_direction is divided by the precision to get the correctly-rotated sprite in each rank, and because of that a 45-degree offset is allowed when the diagonal sprite groups have a precision set to 4; if the precision is set to 8 or higher (potentially because a new track element uses the slope), the sprites must use the Northeast rule.
Every vehicle (almost) has to have its riders. Rider sprites use the same order as the vehicle they belong to, and follow directly after the vehicle's sprites. If multiple rider sprites are present, they follow each other in complete blocks of sprites: the peep sprite associated with a given vehicle sprite is found by incrementing by the total number of the vehicle sprites as many times as the peep number you want to find.
If a vehicle is animated in any way (animated, swinging, or spinning), the animation frames of a given angle are contiguous. The number of these frames is known as the base_num_frames.
The animation frames are contiguous for the given angle
The base_num_frames for swinging and spinning coasters are properly calculated from the flags that determine spin and swing type. The base_num_frames for animated rides is assumed to be 4 despite the animation code, and the overrideVerticalFrames flag and value must be set according to the animation type.
The below table shows all current sprite groups, their associated legacy sprite group, and the geometric angles they represent. The table is organized to represent the order the game expects. If a sprite group is unused in an object, the game continues to the next sprite group and treats that sprite group as having 0 images.
Sprite Group | Default sprite precision | Incline | Banking | Starting Yaw Offset | Legacy Sprite Group | Notes |
---|---|---|---|---|---|---|
slopeFlat | 32 | 0 | 0 | 0 | flat | |
slopes12 | 4 | 11.1026 | 0 | 0 | gentleSlopes | |
slopes12 | 4 | -11.1026 | 0 | 0 | gentleSlopes | |
slopes25 | 32 | 22.2052 | 0 | 0 | gentleSlopes | Min precision 8 for diag steep slopes. Defaults to 4 on rides with additional spinning frames |
slopes25 | 32 | -22.2052 | 0 | 0 | gentleSlopes | Min precision 8 for diag steep slopes. Defaults to 4 on rides with additional spinning frames |
slopes42 | 8 | 40.36 | 0 | 0 | steepSlopes | Min precision 8 for diag steep slopes |
slopes42 | 8 | -40.36 | 0 | 0 | steepSlopes | Min precision 8 for diag steep slopes |
slopes60 | 32 | 58.5148 | 0 | 0 | steepSlopes | |
slopes60 | 32 | -58.5148 | 0 | 0 | steepSlopes | |
slopes75 | 4 | 75 | 0 | 0 | verticalSlopes | |
slopes75 | 4 | -75 | 0 | 0 | verticalSlopes | |
slopes90 | 32 | 90 | 0 | 0 | verticalSlopes | |
slopes90 | 32 | -90 | 0 | 0 | verticalSlopes | |
slopes105 | 4 | 105 | 0 | 0 | verticalSlopes | |
slopes105 | 4 | -105 | 0 | 0 | verticalSlopes | |
slopes120 | 4 | 120 | 0 | 0 | verticalSlopes | |
slopes120 | 4 | -120 | 0 | 0 | verticalSlopes | |
slopes135 | 4 | 135 | 0 | 0 | verticalSlopes | |
slopes135 | 4 | -135 | 0 | 0 | verticalSlopes | |
slopes150 | 4 | 150 | 0 | 0 | verticalSlopes | |
slopes150 | 4 | -150 | 0 | 0 | verticalSlopes | |
slopes165 | 4 | 165 | 0 | 0 | verticalSlopes | |
slopes165 | 4 | -165 | 0 | 0 | verticalSlopes | |
slopeInverted | 4 | 180 | 0 | 0 | verticalSlopes | |
slopes8 | 4 | 8.0503 | 0 | 0 | diagonalSlopes | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes8 | 4 | -8.0503 | 0 | 0 | diagonalSlopes | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes16 | 4 | 16.1005 | 0 | 0 | diagonalSlopes | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes16 | 4 | -16.1005 | 0 | 0 | diagonalSlopes | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes50 | 4 | 49.1035 | 0 | 0 | diagonalSlopes | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes50 | 4 | -49.1035 | 0 | 0 | diagonalSlopes | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
flatBanked22 | 8 | 0 | -22.5 | 0 | flatBanked | Min precision 4 for inline twist |
flatBanked22 | 8 | 0 | 22.5 | 0 | flatBanked | Min precision 4 for inline twist |
flatBanked45 | 32 | 0 | -45 | 0 | flatBanked | Min precision 4 for inline twist |
flatBanked45 | 32 | 0 | 45 | 0 | flatBanked | Min precision 4 for inline twist |
inlineTwists | 4 | 0 | -15 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | 15 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | -30 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | 30 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | -45 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | 45 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | -60 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | 60 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | -75 | 0 | inlineTwist | |
inlineTwists | 4 | 0 | 75 | 0 | inlineTwist | |
slopes12Banked22 | 32 | 11.1026 | -22.5 | 0 | flatToGentleSlopeBankedTransitions | Only rides with BankedCurveTo25Up need higher precision than 4 |
slopes12Banked22 | 32 | 11.1026 | 22.5 | 0 | flatToGentleSlopeBankedTransitions | Only rides with BankedCurveTo25Up need higher precision than 4 |
slopes12Banked22 | 32 | -11.1026 | -22.5 | 0 | flatToGentleSlopeBankedTransitions | Only rides with BankedCurveTo25Up need higher precision than 4 |
slopes12Banked22 | 32 | -11.1026 | 22.5 | 0 | flatToGentleSlopeBankedTransitions | Only rides with BankedCurveTo25Up need higher precision than 4 |
slopes8Banked22 | 4 | 8.0503 | -22.5 | 0 | diagonalGentleSlopeBankedTransitions | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes8Banked22 | 4 | 8.0503 | 22.5 | 0 | diagonalGentleSlopeBankedTransitions | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes8Banked22 | 4 | -8.0503 | -22.5 | 0 | diagonalGentleSlopeBankedTransitions | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes8Banked22 | 4 | -8.0503 | 22.5 | 0 | diagonalGentleSlopeBankedTransitions | Most rides have a 45-degree yaw offset since they have precision 4. Above 4, use a 0-degree yaw offset |
slopes25Banked22 | 4 | 22.2052 | -22.5 | 0 | gentleSlopeBankedTransitions | |
slopes25Banked22 | 4 | 22.2052 | 22.5 | 0 | gentleSlopeBankedTransitions | |
slopes25Banked22 | 4 | -22.2052 | -22.5 | 0 | gentleSlopeBankedTransitions | |
slopes25Banked22 | 4 | -22.2052 | 22.5 | 0 | gentleSlopeBankedTransitions | |
slopes25Banked45 | 32 | 22.2052 | -45 | 0 | gentleSlopeBankedTurns | |
slopes25Banked45 | 32 | 22.2052 | 45 | 0 | gentleSlopeBankedTurns | |
slopes25Banked45 | 32 | -22.2052 | -45 | 0 | gentleSlopeBankedTurns | |
slopes25Banked45 | 32 | -22.2052 | 45 | 0 | gentleSlopeBankedTurns | |
slopes12Banked45 | 4 | 11.1026 | -45 | 0 | flatToGentleSlopeWhileBankedTransitions | |
slopes12Banked45 | 4 | 11.1026 | 45 | 0 | flatToGentleSlopeWhileBankedTransitions | |
slopes12Banked45 | 4 | -11.1026 | -45 | 0 | flatToGentleSlopeWhileBankedTransitions | |
slopes12Banked45 | 4 | -11.1026 | 45 | 0 | flatToGentleSlopeWhileBankedTransitions | |
corkscrews | 4 | -16.4 | -15.8 | 2.3 | corkscrews | |
corkscrews | 4 | -43.3 | -34.4 | 14 | corkscrews | |
corkscrews | 4 | -90 | -45 | 45 | corkscrews | |
corkscrews | 4 | -136.7 | -34.4 | 76 | corkscrews | |
corkscrews | 4 | -163.6 | -15.8 | 87.7 | corkscrews | |
corkscrews | 4 | 16.4 | 15.8 | 2.3 | corkscrews | |
corkscrews | 4 | 43.3 | 34.4 | 14 | corkscrews | |
corkscrews | 4 | 90 | 45 | 45 | corkscrews | |
corkscrews | 4 | 136.7 | 34.4 | 76 | corkscrews | |
corkscrews | 4 | 163.6 | 15.8 | 87.7 | corkscrews | |
corkscrews | 4 | -16.4 | 15.8 | -2.3 | corkscrews | |
corkscrews | 4 | -43.3 | 34.4 | -14 | corkscrews | |
corkscrews | 4 | -90 | 45 | -45 | corkscrews | |
corkscrews | 4 | -136.7 | 34.4 | -76 | corkscrews | |
corkscrews | 4 | -163.6 | 15.8 | -87.7 | corkscrews | |
corkscrews | 4 | 16.4 | -15.8 | -2.3 | corkscrews | |
corkscrews | 4 | 43.3 | -34.4 | -14 | corkscrews | |
corkscrews | 4 | 90 | -45 | -45 | corkscrews | |
corkscrews | 4 | 136.7 | -34.4 | -76 | corkscrews | |
corkscrews | 4 | 163.6 | -15.8 | -87.7 | corkscrews | |
restraintAnimation | 4 | 0 | 0 | 0 | restraintAnimation | |
restraintAnimation | 4 | 0 | 0 | 0 | restraintAnimation | |
restraintAnimation | 4 | 0 | 0 | 0 | restraintAnimation | |
curvedLiftHill | 32 | 9.8287 | 0 | 0 | curvedLiftHill |
The angles were calculated with data from Sizes and angles in the game world.
- Home
- FAQ & Common Issues
- Roadmap
- Installation
- Building
- Features
- Development
- Benchmarking & stress testing OpenRCT2
- Coding Style
- Commit Messages
- Overall program structure
- Data Structures
- CSS1.DAT
- Custom Music and Ride Music Objects
- Game Actions
- G1 Elements Layout
- game.cfg structure
- Maps
- Music Cleanup
- Objects
- Official extended scenery set
- Peep AI
- Peep Sprite Type
- RCT1 ride and vehicle types and their RCT2 equivalents
- RCT12_MAX_SOMETHING versus MAX_SOMETHING
- Ride rating calculation
- SV6 Ride Structure
- Settings in config.ini
- Sizes and angles in the game world
- Sprite List csg1.dat
- Sprite List g1.dat
- Strings used in RCT1
- Strings used in the game
- TD6 format
- Terminology
- Track Data
- Track Designs
- Track drawers, RTDs and vehicle types
- Track types
- Vehicle Sprite Layout
- Widget colours
- Debugging OpenRCT2 on macOS
- OpenGL renderer
- Rebase and Sync fork with OpenRCT2
- Release Checklist
- Replay System
- Using minidumps from crash reports
- Using Track Block Get Previous
- History
- Testing