{"record":{"id":"65243aec2c78821c","repo":"moeru-ai/airi","slug":"no-look-at-target-found-in-vrm-model","errorCode":null,"errorMessage":"No look-at target found in VRM model","messagePattern":"No look-at target found in VRM model","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"packages/stage-ui-three/src/composables/vrm/core.ts","lineNumber":69,"sourceCode":"  const _vrmGroup = new Group()\n  _vrmGroup.add(_vrm.scene)\n  // Add to scene\n  if (options?.scene) {\n    options.scene.add(_vrmGroup)\n  }\n\n  // Preset the facing direction\n  const targetDirection = new Vector3(0, 0, -1) // Default facing direction\n  const lookAt = _vrm.lookAt\n  const quaternion = new Quaternion()\n  if (lookAt) {\n    const facingDirection = lookAt.faceFront\n    quaternion.setFromUnitVectors(facingDirection.normalize(), targetDirection.normalize())\n    _vrmGroup.quaternion.premultiply(quaternion)\n    _vrmGroup.updateMatrixWorld(true)\n  }\n  else {\n    console.warn('No look-at target found in VRM model')\n  }\n  (_vrm as VRM).springBoneManager?.reset()\n  _vrmGroup.updateMatrixWorld(true)\n\n  function computeBoundingBox(vrm: Object3D) {\n    const box = new Box3()\n    const childBox = new Box3()\n\n    vrm.updateMatrixWorld(true)\n\n    vrm.traverse((obj) => {\n      if (!obj.visible)\n        return\n      const mesh = obj as Mesh\n      if (!mesh.isMesh)\n        return\n      if (!mesh.geometry)\n        return","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/moeru-ai/airi/blob/677329427f32468c74b17f3ec47eeca4e05bec65/packages/stage-ui-three/src/composables/vrm/core.ts#L51-L87","documentation":"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.","triggerScenarios":"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.","commonSituations":"Faceless or stylized avatars whose authors disabled look-at; export pipelines that drop the extension; older VRM 0.x models converted to 1.0.","solutions":["Treat it as benign if you do not need gaze: head/eye tracking simply will not aim.","Re-export the model with the lookAt extension enabled (bone-offset or expression based).","If orientation matters, apply your own known forward rotation when _vrm.lookAt is absent."],"exampleFix":"// before\n// rely on automatic faceFront alignment\n\n// after\nif (!vrm.lookAt) {\n  vrmGroup.rotation.y = Math.PI // known forward for this model\n}","handlingStrategy":"validation","validationCode":"if (!vrm.lookAt) { /* apply model-specific forward rotation instead of faceFront alignment */ }","typeGuard":"function hasLookAt(vrm: VRMCore): boolean {\n  return !!vrm.lookAt\n}","tryCatchPattern":null,"preventionTips":["Prefer VRM exports with the lookAt extension when gaze features matter.","Keep per-model orientation overrides configurable for models lacking lookAt.","Feature-detect VRM capabilities once at load and branch, rather than warning per frame."],"tags":["vrm","lookat","orientation","model-export"],"backgroundTag":"missing-model-extension","analyzedSha":"677329427f32468c74b17f3ec47eeca4e05bec65","analyzedAt":"2026-08-18T17:29:58.153Z","contentChangedAt":"2026-08-18T17:29:58.153Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}