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
- Check _vrm.humanoid is defined and getNormalizedBoneNode('hips') returns a node before calling reAnchorRootPositionTrack.
- Re-export the model with a complete VRM humanoid mapping (hips is mandatory in the spec).
- 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
- Validate VRM imports in onboarding: require the humanoid extension with hips.
- Branch on humanoid presence so non-humanoid VRM uses a separate code path.
- Unit-test helpers with minimal mock VRMs lacking humanoid.
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
- No VRM found
- No Hips.position track of type VectorKeyframeTrack found in
- No VRM animation loaded
- VRM model loading failure!
- [mmd] playAction skipped: "${name}" is not registered
AI-assisted analysis of moeru-ai/airi@677329427f (2026-08-18).
Data as JSON: /api/errors/eb0218e2874b0b4b.
Report an issue: GitHub.