s&box/field-guide
the symptom, in your words

"My scaled-up tree's collider didn't scale"

✓ verified on engine 26.07lane: Getting art inposted
▸ SYMPTOM
  • You scale a GameObject (WorldScale = 4.5) so a ~1 m mesh becomes a tall tree / prop.
  • The visual is correct height.
  • Players fall through the trunk, or climb "through" branches — collision stays near the base at the unscaled size.
  • A "0.5 m" trunk capsule behaves like a ~6 cm noodle after a large WorldScale.
▸ CAUSE

CapsuleCollider Radius / Start / End do NOT follow WorldScale. (BoxCollider does.)

ModelCollider's physics hull also does NOT follow WorldScale (same class of bug). A 1 m-normalized mesh on a GO scaled 4.5× renders 4.5 m tall but the per-poly collider stays ~1 m, buried in the base.

▸ FIX

Option A — capsules on an unscaled sibling

Put capsules on an unscaled sibling GameObject with dimensions already in world units (inches). Keep the visual child scaled; keep the collider child at WorldScale = 1.

Option B — bake scale into the vmdl (preferred for ModelCollider)

Create a per-model wrapper that bakes height into import_scale, then load it at GO WorldScale = 1:

snippet
import_scale = 39.37 * desiredHeightMeters

Same OBJ path, same both-names material remap rule. New vmdls need an editor kick to compile.

Then ModelCollider matches the visual 1:1.

Caveat for "normalized ~1 m" AI meshes

import_scale = 39.37 × N only delivers an exact N-metre model if the source mesh's native bounding box is exactly 1 m. AI-generated OBJs are "normalized ~1 m", not exactly 1 m — a flat bake can under/over-shoot.

Safer runtime scale (self-corrects to true native size):

snippet
float M = 39.37f;
go.WorldScale = desiredHeightMeters * M / model.Bounds.Size.z;

If you use baked wrappers and a graceful Model.Load(...) == null / IsError fallback, watch for mid-session .vmdl_c compiles: a boot-audit footprint can flip with a clean git diff when a wrapper finishes compiling between boots. See ai-generated-models.

▸ WHY IT WORKS

BoxCollider dimensions are transformed with the GameObject. Capsule endpoints/radius and ModelCollider hulls are authored in model/local physics space and are not uniformly multiplied by WorldScale in current engine behavior — so visual scale and collision scale diverge. Baking import_scale makes the compiled physics and render meshes the same size at unit scale, which is the only frame those collider types reliably share.

Verified on engine 26.07 — seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?