Vienna Ulf Tram – Rigged & Animated

Larry3d in Animation


Highly detailed model of the Vienna ULF (Ultra Low Floor) tram, line 25 to Floridsdorf. The model features accurate proportions, detailed exterior with doors, windows, pantograph, destination displays, and Wiener Linien branding.

Includes a fully functional path-following rig. The tram automatically follows any Bezier curve while maintaining correct segment spacing. Rigid body sections articulate only at the real-world joint positions, just like the actual ULF. No Spline IK — the rig uses a clean Empty-chain system with drivers and a small Python script that dynamically adapts to any curve length.

This is uploaded as a scene. To use the tram in your own project, append the ULF_Tram collection from this file.

How to use the rig:

1. Append the ULF_Tram collection into your scene (File → Append → Collection → ULF_Tram)

2. Create or select a Bezier curve for your tram track

3. Select each ULF_Pivot empty (ULF_Pivot.Front, .01–.04, .Rear) and change the Follow Path constraint target to your curve

4. Open the included "curve_length" script in the Scripting tab and run it. If the script is missing after appending, create a new text file in the Text Editor and paste the script below

5. Animate the Offset Factor of ULF_Pivot.Front — the entire tram follows automatically

6. Enable "Auto Run Python Scripts" in Preferences → Save & Load


Recommended: Blender 5.1 or later (driver issues in 5.0.1)


Required Python script (curve_length):


import bpy
def update_curve_length(scene, depsgraph):
    pivot = bpy.data.objects.get("ULF_Pivot.Front")
    if not pivot:
        return
    for con in pivot.constraints:
        if con.type == 'FOLLOW_PATH' and con.target:
            length = con.target.data.splines[0].calc_length()
            old_curve = bpy.data.objects.get("ULF_Track")
            if old_curve:
                old_curve["curve_length"] = length
            con.target["curve_length"] = length
            break
bpy.app.handlers.depsgraph_update_post.append(update_curve_length)
update_curve_length(None, None)


For more details about the rigging process and how to use this asset, check out the blog posts:


English: https://larry.at/vienna-ulf-tram-english/


Deutsch: https://larry.at/wiener-ulf-strassenbahn-deutsch/

$49.90

Have questions about this product?
Login to message

Details
Dev Fund Contributor
Published 6 months ago
Blender Version 5.1
Render Engine Used Cycles
Misc Data Uvs-Unwrapped, Rigged, Animated, Textured
License Royalty Free
Discover more products like this

ulf rail vehicle animated tram blender urban Rigged streetcar vienna