moeru-ai/airi · warning

No hips node found in VRM model.

Error message

No hips node found in VRM model.

What it means

reAnchorRootPositionTrack() re-centers a VRM animation by offsetting the root position track relative to the model's hips. It fetches the normalized hips node via _vrm.humanoid?.getNormalizedBoneNode('hips'); when the VRM has no humanoid rig (or no hips bone), it warns and returns without re-anchoring, so the animation may play at an offset position.

Source

Thrown at packages/stage-ui-three/src/composables/vrm/animation.ts:55

export async function clipFromVRMAnimation(vrm?: VRMCore, animation?: VRMAnimation) {
  if (!vrm) {
    console.warn('No VRM found')
    return
  }
  if (!animation) {
    return
  }

  // create animation clip
  return createVRMAnimationClip(animation, vrm)
}

// Set initial positions for animation
export function reAnchorRootPositionTrack(clip: AnimationClip, _vrm: VRMCore) {
// Get the hips node to re-anchor the root position track
  const hipNode = _vrm.humanoid?.getNormalizedBoneNode('hips')
  if (!hipNode) {
    console.warn('No hips node found in VRM model.')
    return
  }
  hipNode.updateMatrixWorld(true)
  const defaultHipPos = new Vector3()
  hipNode.getWorldPosition(defaultHipPos)

  // Calculate the offset from the hips node to the hips's first frame position
  const hipsTrack = clip.tracks.find(track =>
    track instanceof VectorKeyframeTrack
    && track.name === `${hipNode.name}.position`,
  )
  if (!(hipsTrack instanceof VectorKeyframeTrack)) {
    console.warn('No Hips.position track of type VectorKeyframeTrack found in animation.')
    return
  }

  const animeHipPos = new Vector3(
    hipsTrack.values[0],

View on GitHub (pinned to 677329427f)

Solutions

  1. Check _vrm.humanoid is defined and getNormalizedBoneNode('hips') returns a node before calling reAnchorRootPositionTrack.
  2. Re-export the model with a complete VRM humanoid mapping (hips is mandatory in the spec).
  3. Skip re-anchoring for non-humanoid models — the clip still plays, only root offset correction is lost.

Example fix

// before
reAnchorRootPositionTrack(clip, vrm) // warns when humanoid is missing

// after
if (vrm.humanoid?.getNormalizedBoneNode('hips')) {
  reAnchorRootPositionTrack(clip, vrm)
}
Defensive patterns

Strategy: validation

Validate before calling

if (!vrm.humanoid?.getNormalizedBoneNode('hips')) { /* skip re-anchor */ }

Type guard

function hasHips(vrm: VRMCore): boolean {
  return !!vrm.humanoid?.getNormalizedBoneNode('hips')
}

Prevention

When it happens

Trigger: Passing a VRM exported without the VRMC_vrm humanoid extension; a model whose humanoid bone map omits hips; calling the helper on a plain glTF/VRM0 model through the same code path.

Common situations: Non-humanoid props or creatures exported as VRM; broken VRM exporters that skip the humanoid block; testing with placeholder models.

Related errors


AI-assisted analysis of moeru-ai/airi@677329427f (2026-08-18). Data as JSON: /api/errors/eb0218e2874b0b4b. Report an issue: GitHub.