terminalCode Example

Working with Models and Rendering

calendar_today May 3, 2026 schedule ~1 min read person patrickjr verified 50

Guide to displaying 3D models in s&box.

ModelRenderer Component

CSHARP
public class Player : Component
{
    [Property] public ModelRenderer Body { get; set; }
    
    protected override void OnStart()
    {
        // Set model
        Body.Model = Model.Load("models/citizen/citizen.vmdl");
        
        // Enable shadows
        Body.CastShadows = true;
        
        // Set color tint
        Body.Tint = Color.Red;
        
        // Enable/disable
        Body.Enabled = false;
    }
}

Loading Models

CSHARP
// Load model resource
var model = Model.Load("models/props/balloon.vmdl");

// Check if loaded
if (model is null)
{
    Log.Warning("Failed to load model!");
    return;
}

SkinnedMeshRenderer (Animated Models)

CSHARP
var skinnedMesh = Components.Get<SkinnedMeshRenderer>();

// Play animation
skinnedMesh.SetAnimation("walk");

// Set animation speed
skinnedMesh.AnimationSpeed = 1.5f;

Dynamic Model Creation

CSHARP
void CreateVisual()
{
    var go = new GameObject("Visual");
    go.SetParent(this.GameObject);
    
    var renderer = go.Components.Create<ModelRenderer>();
    renderer.Model = Model.Load("models/effects/impact.vmdl");
    renderer.Tint = Color.Yellow;
    
    // Auto-destroy after 5 seconds
    go.DestroyAsync(5f);
}

LODs (Level of Detail)

Models automatically use LODs based on distance. Ensure your model has LOD groups set up in ModelDoc.

Material Override

CSHARP
// Change material on specific mesh group
Body.SetMaterialOverride("skin", Material.Load("materials/characters/alternate_skin.vmat"));

Rendering Bounds

CSHARP
// Custom bounds for culling (optional)
Body.Bounds = new BBox(-50, 50);

Common Model Paths

CSHARP
// Citizen character
Model.Load("models/citizen/citizen.vmdl");

// Error model (fallback)
Model.Load("models/dev/error.vmdl");
Was this helpful?