the symptom, in your words

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

✓ verified on 26.07.08e
lane 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.08e: seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?

Want to know when new guides or fixes drop? Join the community to help build this out. Report gotchas, flag outdated fixes, or just lurk.

Join the Discord