Panels
Panels are architectural elements used throughout Portal 2. They are individually positioned so that, together, they form the test chamber. Because the panels are moved individually by robotic arms, the room can react to the player. They can form stairs, new ledges, open like doors, and tend to convey a sense that the room itself is alive.
Contents
Creating Panels
1. Create a prop_dynamic
entity with the following settings:
Property Name Value World Model models/anim_wp/room_transform/arm64x64_interior.mdl Name panel1 HoldAnimation true Collisions Not Solid
2. Create a 32Lx32Wx2H
block brush above the model, in the space between the model and its origin. Tie it to a func_brush
entity with the following settings:
Property Name Value Name panel1_brush Parent panel1,panel_attach
panel1,panel_attach
, which is not the name of a real entity. This is a special syntax: the text after the comma (panel_attach
) is not a part of the name, but indicates an attachment point, which is used to make the brush follow the animation of the prop_dynamic
. Hammer doesn't properly recognize this syntax so it will appear red, but it works in-game.4. Create a logic_relay
with the following settings:
Property Name Value Name relay_panel1_animation
and the following outputs:
List of Panel Models and Attachments
There are a number of other panel models in Portal 2 which can be used instead of the standard one. Make sure to use the corresponding attachment point name instead of panel_attach
, if applicable. Models that do not animate can be placed as prop_static
entities, which do not count towards the entity limit.
Model Path | Animated | Panel Attachment Name |
---|---|---|
anim_wp\arm_interior_192\arm_interior_128.mdl | Yes | N/A |
anim_wp\arm_interior_192\arm_interior_192.mdl | Yes | N/A |
anim_wp\arm_interior_192\video_arm.mdl | Yes | monitor_attach |
anim_wp\arm_interior_192\video_arm_big.mdl | Yes | monitor_attach |
anim_wp\circle_shield\circle_shield.mdl | Yes | panel_top |
anim_wp\framework\circle_shield_static.mdl | No | N/A |
anim_wp\room_transform\arm64x64_interior.mdl | Yes | panel_attach |
anim_wp\room_transform\arm64x64_interior_rusty.mdl | Yes | panel_attach |
anim_wp\telescope_arm\telescope_arm.mdl | Yes | panel_top |
anim_wp\telescope_arm_128\telescope_arm_128.mdl | Yes | panel_top |
anim_wp\telescope_arm_128\telescope_arm_128_glass.mdl | Yes | panel_top |
anim_wp\telescope_arm_128\telescope_arm_128_idle.mdl | No | N/A |
anim_wp\telescope_arm_128\telescope_arm_128_upidle.mdl | No | N/A |
anim_wp\telescope_arm_128\telescope_arm_128x256.mdl | Yes | panel_top |
anim_wp\telescope_arm_trans\telescope_arm_trans.mdl | Yes | panel_attach |
props_livingwall\armliving64x64.mdl | Yes | panel_attach |
anim_wp\arm_4panel.mdl | Yes | panel_attach |
Animation Playback Rate
Sometimes it might be required for an arm (or any other prop_dynamic
) to play its animation faster or slower. The playback rate of a prop_dynamic
entity is expressed in numbers as representation of percentage, where 1 is equivalent to 100%, 2 is 200%, 0.5 is 50%, 0 is 0% of the animation playback rate (note that 0 will stop the animation completely). There are two ways to change default playback rate.
The first method is easier and applied to all of animation of a particular prop_dynamic
. The playback rate can be assigned to the arm, and this will have a constant effect on the arm's animations playback rate (it will always be playing any animations at that set rate). In order to do so, a new output need to be added in the arm's properties:
The above output will make an arm to play all of its animations 5 times faster. !self
is a special wildcard that selects the entity that is firing that output (the arm selects itself).
The second way of setting up the playback rate is more complex but also more flexible. The triggering entity (e.g., trigger_once
) has to set the following outputs:
When triggered, the above setup will cause arm_0
to start animation. One hundredth second later, the animation playback will be increased to 200% (note that if both outputs were fired at the same time, the playback rate will remain at default—1).
Powerup Panels
For some themes in Portal 2, panels can be seen doing powerup animations—starting limp and lifeless, then "waking up" and moving back into their proper position. Done correctly, this can make your map feel far more dynamic and will look more realistic for the theme.
Creating these panels, however, is a little different from ordinary panels. This is how Valve does it:
1. Create a prop_dynamic
entity with the following settings:
Property Name Value World Model models/anim_wp/room_transform/arm64x64_interior.mdl Name panel1 HoldAnimation true Collisions Not Solid Default Animation powerup(X_0Y)idleend
powerupA_01
. Choose whatever fits best.2. Create a brush above the model, making sure it fits the panel face and is aligned to it. Tie it to a func_brush
entity with the following settings:
Property Name Value Name panel1_brush Parent panel1,panel_attach
3. Create a logic_auto
entity and add the following outputs:
4. Create a logic_relay
with the following settings:
Property Name Value Name relay_panel1_animation
and the following outputs:
Now just add a trigger somewhere and activate the relay. A trigger_look
works great for this.
The idle powerup animations are horribly off-grid in Hammer, and are therefore impossible to correctly parent the brush to. By using this method, we can align the brush to the panel face in Hammer on-grid, but when the map spawns, it will move into an idle powerup animation, with the brush perfectly parented.