Skip to content

Metallica

Stern table (2013). Dense technical development focusing on 3D inserts, physics tuning, lighting, playfield alignment, and troubleshooting.

Build Notes

3D Insert Implementation

Complete workflow for adding 3D inserts to a table:

  1. Preparation: Separate insert images to their own layer in Photoshop at high DPI
  2. Copy from existing tables: Most insert trays already exist in other tables (e.g., Austin Powers, Ghostbusters). Don't recreate - copy/paste both primitives (ON and OFF trays must stay aligned on top of each other)
  3. Naming convention: Primitive names should match light numbering for easier scripting
  4. Each insert consists of 2 primitives: An "off" state and an "on" state, positioned at identical coordinates
  5. Reference tutorial: https://paper.dropbox.com/doc/3D-Inserts-Tutorial--A8g61ERlUoB7tH7sBQbZYRanAg-b60OwX9BGWhDMQkC0WFRu

Tutorial Clarification

The tutorial Part 1 describes how inserts are made (modeling in Blender, rendering textures) but is NOT a step-by-step guide. For actual table work, copy existing inserts from other tables rather than creating new ones from scratch.

Insert Depth and Y-Size Configuration

When positioning 3D insert primitives: - Use camera mode zoom to check if inserts are positioned correctly - Check for gaps between playfield and insert - If Y-size is too small (e.g., 100) and other dimensions are larger, increase Y-size to make inserts deeper (e.g., 170) - Important: In VPX, axes are swapped for some objects - Y controls height/depth for insert primitives - IRL inserts aren't as deep as VPX inserts are made, but the team agreed to make them deeper anyway for better visual effect

Insert Bulb Configuration

Recommended workflow for tuning insert lighting:

  1. Start with BlendDisableLighting value:
  2. Set bulb intensity to 0 first
  3. Use debug editor to test DL value
  4. Set the working value into script

  5. Add bulb intensity gradually:

  6. Start with intensity around 10
  7. Throw a ball in and move it near the insert
  8. Fiddle with colors and falloff values
  9. Left color reflects from the ball
  10. Right color gives hue to insert

  11. Bulb placement:

  12. Recent practice: Z position at -3 or -4 (inside the playfield)
  13. Bulb mainly gives ball reflection but can help with insert effect when Z is inside the insert

  14. Ball reflection settings:

  15. Falloff Power is KEY: Higher falloff power = MORE ball reflection (counterintuitive)
  16. Recommended: Large Falloff Size with 2-2.5 falloff power (not too bright)
  17. Scale Mesh around 5 (default is 20)

  18. Bulb Transmit value:

  19. Can bring nice glow to insert
  20. Use around 5-10
  21. Keep it 0-2 where surrounding plastic gets affected too much
  22. Too high values affect primitives higher on top of it

RGB Insert Handling

RGB inserts are challenging because you need materials that mix colors on the fly.

Workaround approach (used in Ghostbusters): - Keep both "on" and "off" primitives - Don't use DisableLighting (DL) for the primitive - Use a more powerful RGB bulb instead - The "on" material needs to be different from regular inserts

This avoids the complexity of creating dynamic color-mixing materials while still allowing RGB color changes.

3D & Art

AO Shadow Flasher Implementation

AO (Ambient Occlusion) shadow stays on all the time. It's rendered as a flasher layer.

Advantages over hard silhouette shadows: - Hard shadows (50% opacity silhouettes) only work where you expect hard shadows - AO provides detail in nooks and crannies where items intersect with playfield - "Ties everything together"

Potential issue: AO shadows can sometimes cause lighting issues (happened on Dr Dude). Solution: bake it onto the playfield instead.

Behavior with flashers: When flashers activate, they normally "light up" the AO flasher, so it doesn't look weird. The opacity can be adjusted if it makes the table too dark.

GI Render Pass Technique

For enhanced lighting effects (especially for brightening back walls and side areas):

Technique: Swap pre-rendered images on primitives/playfield/plastics based on GI state - Render at least 2 passes: GI on and GI off - Apply images to primitives - Script switches images when GI lights turn on/off or when things flash (like bumpers)

Reference tables: Guardians of the Galaxy (GOTG), AFM (by GK5)

Cheating without full re-texture: - Take a full-screen 5K screenshot of table in VPX - Project onto geometry from camera POV (after aligning camera) - Works well for getting colored light bouncing around for ramp reflection/refraction - For GI pass: Reduce screenshot exposure a couple stops, then add lights

This is less work than fully re-texturing everything in C4D/Blender.

Normal Map Generation

Tools for normal map generation: - Online tool: https://cpetry.github.io/NormalMap-Online/ (free, client-side, no uploads) - CrazyBump software: https://www.crazybump.com (lots of fine-tuning options, can export different map types)

CrazyBump advantages: - Adjust sharpness and intensity parameters - Can generate specular maps in addition to normal maps - More control over final result

Application to Metallica hammer: - Source texture was poor quality - CrazyBump used to generate normal maps with different settings (sharp 75/intense 60, sharp 95/intense 90/shape 50) - Generated specular map as well

Reference video showing real hammer under light helps calibrate how shiny the texture should be.

Black Color Avoidance

Many objects in Metallica were set to black (#000000). These should be changed to dark grey instead.

Reason: Pure black (#000000) is "poop" for rendering - it doesn't interact with lighting properly. Dark grey provides better depth and reacts to lighting.

Scripting

FadeDisableLighting2 Speed Adjustment

The FadeDisableLighting2 sub is not optimal for primitive fading, but can be adjusted for fade speed. Modified version with faster fade:

Sub FadeDisableLighting2(nr, a, alvl)
    Select Case FadingLevel(nr)
        Case 0
            a.UserValue = a.UserValue - 0.335
            If a.UserValue < 0 Then
                a.UserValue = 0
                FadingLevel(nr) = -1
            end If
            a.BlendDisableLighting = alvl * a.UserValue 'brightness
        Case 1
            a.UserValue = a.UserValue + 0.335
            If a.UserValue > 1 Then
                a.UserValue = 1
                FadingLevel(nr) = -1
            end If
            a.BlendDisableLighting = alvl * a.UserValue 'brightness
    End Select
End Sub

The 0.335 value defines the fade speed. Adjust this value to make fading faster or slower.

Better Solution

Replace old lamp methods with nFozzy light scripts that work better with DL primitive fading. This is a demanding task requiring lots of testing but becomes easier once all primitives are set up and named correctly.

Troubleshooting

Playfield Image Misalignment

Problem: New high-quality playfield scan was "squished" to fit HauntFreak's existing version for quick play testing. This caused all playfield elements to be misaligned.

Manifestation: - Ramps exits hitting wrong spots - Insert holes not lining up - Tight shots becoming too easy or impossible - Playfield appeared skewed (right side higher than left) - The playfield image itself had horizontal/vertical lines that weren't straight

Solution: 1. Straighten the playfield image in Photoshop (make all horizontal lines horizontal, all vertical lines vertical) 2. Reference manual images for correct proportions (note: some manual scans are also skewed) 3. Realign ALL playfield elements to the corrected playfield 4. Layers that needed adjustment: 5, 9, 11 (insert flashers), 1, 2, 3 (general items), 4 (GI), 8 (some lights)

Lesson Learned

Don't skip proper playfield alignment at the start, even for "quick tests." Moving forward with misaligned PF creates massive rework later. The original scans by ebislit were "literally perfect" - the issue was the squishing/skewing done afterward.

Flipper Nudge Bug - Balls Jumping

Problem: When both flippers have cradled balls, the balls start jumping on their own.

Root cause: Flipper is getting knocked off the end angle, triggering EOS recheck and mistakenly nudging the ball on the other flipper.

Solution 2 (rothbauerw's suggestion): Increase the range of the end angle check:

If abs(Flipper1.currentangle) < abs(Endangle1) + 3 and EOSNudge1 <> 1 Then

This prevents triggering a recheck for EOS if the flipper gets knocked off the endangle slightly.

Note

Later flipper nudge code in Austin Powers was updated and didn't have this issue.

Ramp Speed Too Fast

Problem: Ramps felt way too fast after physics adjustments.

Context: This was noticed during office testing on 4K cabinet. May require ramp friction adjustment or ramp primitive material changes.

Normal Map Not Working from All Viewing Angles

Problem: Normal map looks great from VR view, but effect disappears from desktop POV. Effect changes dramatically depending on point of view. When hammer swings, the bump effect "jumps" there.

Potential cause: Object may have preset direction of UV map or normals. VPX may have issues with how normal maps are oriented.

Related issue: Dark mentioned that normal maps need to be baked in the right X, Y, Z position for rendering due to issues in VPX.

Warning

No definitive solution provided in the conversation - this appears to be a known VPX limitation with normal maps.

Game Knowledge

Ball Mass and Slope Relationship

Ball mass experimentation findings: - Some tables increased ball mass for better ball collisions/reactions (e.g., Austin Powers: 1.7, Hook: 1.5) - When ball mass is increased, table slope is often reduced to offset ball speed - Problem: VPX slope numbers lose real-world correlation when ball mass changes - Changing flipper strength requires tweaking flipper trick values (difficult to explain how)

Rothbauerw's recommendation: - Stick with ball mass of 1 - Don't increase ball mass without understanding the tradeoffs - Ball mass above 1.2 introduces too many problems - "It's a balancing act"

For table feel, reference how the table "feels" rather than slope numbers when ball mass has been adjusted.

Mesh Playfield Physics Improvements

Added mesh playfield to improve physics: - Right Mystery scoop now works without fallthrough kicker - Gives nice play to slow-moving ball - Added hole at snake to allow more accurate snake scoop where ball falls into snake's mouth (previously ball went up slight ramp and could roll back out)

Physics tuning that accompanied mesh: - PF slope: 6.75 (from 6.0) - PF friction: 0.2 (gives clear coated and waxed feel)

LED vs Warm Bulbs Decision

Early discussion about whether to use LED or warm bulb lighting:

Decision: Go with LEDs for Metallica due to the lightning/electric chair theme.

Compromise: Can add a LUT as an option for warmth if LEDs feel too harsh.

Some team members (benji084) "hate LEDs" but won't "cry about it" - personal preference varies. The table theme should drive the decision.


Contributors: iaakki, benji084, ebislit, sixtoe, rothbauerw, bord1947, cyberpez, mrh7712, daphishbowl, embee1979, astronasty, flupper1