moeru-ai/airi · info

No look-at target found in VRM model

Error message

No look-at target found in VRM model

What it means

During VRM placement, the code rotates the model group so its look-at 'faceFront' direction aligns with world -Z. If _vrm.lookAt is undefined (the model ships no look-at rig/extension), it skips the correction with this warn and the model keeps whatever default orientation the group had. Only orientation correction is lost; rendering and spring bones proceed normally.

Source

Thrown at packages/stage-ui-three/src/composables/vrm/core.ts:69

  const _vrmGroup = new Group()
  _vrmGroup.add(_vrm.scene)
  // Add to scene
  if (options?.scene) {
    options.scene.add(_vrmGroup)
  }

  // Preset the facing direction
  const targetDirection = new Vector3(0, 0, -1) // Default facing direction
  const lookAt = _vrm.lookAt
  const quaternion = new Quaternion()
  if (lookAt) {
    const facingDirection = lookAt.faceFront
    quaternion.setFromUnitVectors(facingDirection.normalize(), targetDirection.normalize())
    _vrmGroup.quaternion.premultiply(quaternion)
    _vrmGroup.updateMatrixWorld(true)
  }
  else {
    console.warn('No look-at target found in VRM model')
  }
  (_vrm as VRM).springBoneManager?.reset()
  _vrmGroup.updateMatrixWorld(true)

  function computeBoundingBox(vrm: Object3D) {
    const box = new Box3()
    const childBox = new Box3()

    vrm.updateMatrixWorld(true)

    vrm.traverse((obj) => {
      if (!obj.visible)
        return
      const mesh = obj as Mesh
      if (!mesh.isMesh)
        return
      if (!mesh.geometry)
        return

View on GitHub (pinned to 677329427f)

Solutions

  1. Treat it as benign if you do not need gaze: head/eye tracking simply will not aim.
  2. Re-export the model with the lookAt extension enabled (bone-offset or expression based).
  3. If orientation matters, apply your own known forward rotation when _vrm.lookAt is absent.

Example fix

// before
// rely on automatic faceFront alignment

// after
if (!vrm.lookAt) {
  vrmGroup.rotation.y = Math.PI // known forward for this model
}
Defensive patterns

Strategy: validation

Validate before calling

if (!vrm.lookAt) { /* apply model-specific forward rotation instead of faceFront alignment */ }

Type guard

function hasLookAt(vrm: VRMCore): boolean {
  return !!vrm.lookAt
}

Prevention

When it happens

Trigger: Loading a VRM without the VRMC_vrm lookAt extension (or VRM 0.x model with no lookAt bone configured); a minimal/test VRM exported with look-at disabled.

Common situations: Faceless or stylized avatars whose authors disabled look-at; export pipelines that drop the extension; older VRM 0.x models converted to 1.0.

Related errors


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