UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

1 lines 4.25 kB
{"version":3,"file":"XRHandMeshModel.cjs","sources":["../../src/webxr/XRHandMeshModel.ts"],"sourcesContent":["import { Object3D } from 'three'\nimport { GLTFLoader } from '../loaders/GLTFLoader'\n\nconst DEFAULT_HAND_PROFILE_PATH =\n 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/'\n\nclass XRHandMeshModel {\n controller: Object3D\n handModel: Object3D\n bones: Object3D[]\n\n constructor(\n handModel: Object3D,\n controller: Object3D,\n path: string = DEFAULT_HAND_PROFILE_PATH,\n handedness: string,\n customModelPath?: string,\n ) {\n this.controller = controller\n this.handModel = handModel\n\n this.bones = []\n\n const loader = new GLTFLoader()\n if (!customModelPath) loader.setPath(path)\n loader.load(customModelPath ?? `${handedness}.glb`, (gltf: { scene: Object3D }) => {\n const object = gltf.scene.children[0]\n this.handModel.add(object)\n\n const mesh = object.getObjectByProperty('type', 'SkinnedMesh')!\n mesh.frustumCulled = false\n mesh.castShadow = true\n mesh.receiveShadow = true\n\n const joints = [\n 'wrist',\n 'thumb-metacarpal',\n 'thumb-phalanx-proximal',\n 'thumb-phalanx-distal',\n 'thumb-tip',\n 'index-finger-metacarpal',\n 'index-finger-phalanx-proximal',\n 'index-finger-phalanx-intermediate',\n 'index-finger-phalanx-distal',\n 'index-finger-tip',\n 'middle-finger-metacarpal',\n 'middle-finger-phalanx-proximal',\n 'middle-finger-phalanx-intermediate',\n 'middle-finger-phalanx-distal',\n 'middle-finger-tip',\n 'ring-finger-metacarpal',\n 'ring-finger-phalanx-proximal',\n 'ring-finger-phalanx-intermediate',\n 'ring-finger-phalanx-distal',\n 'ring-finger-tip',\n 'pinky-finger-metacarpal',\n 'pinky-finger-phalanx-proximal',\n 'pinky-finger-phalanx-intermediate',\n 'pinky-finger-phalanx-distal',\n 'pinky-finger-tip',\n ]\n\n joints.forEach((jointName) => {\n const bone = object.getObjectByName(jointName) as any\n\n if (bone !== undefined) {\n bone.jointName = jointName\n } else {\n console.warn(`Couldn't find ${jointName} in ${handedness} hand mesh`)\n }\n\n this.bones.push(bone)\n })\n })\n }\n\n updateMesh(): void {\n // XR Joints\n const XRJoints = (this.controller as any).joints\n\n for (let i = 0; i < this.bones.length; i++) {\n const bone = this.bones[i]\n\n if (bone) {\n const XRJoint = XRJoints[(bone as any).jointName]\n\n if (XRJoint.visible) {\n const position = XRJoint.position\n\n bone.position.copy(position)\n bone.quaternion.copy(XRJoint.quaternion)\n // bone.scale.setScalar( XRJoint.jointRadius || defaultRadius );\n }\n }\n }\n }\n}\n\nexport { XRHandMeshModel }\n"],"names":["GLTFLoader"],"mappings":";;;;;;;;;AAGA,MAAM,4BACJ;AAEF,MAAM,gBAAgB;AAAA,EAKpB,YACE,WACA,YACA,OAAe,2BACf,YACA,iBACA;AAVF;AACA;AACA;AASE,SAAK,aAAa;AAClB,SAAK,YAAY;AAEjB,SAAK,QAAQ;AAEP,UAAA,SAAS,IAAIA,WAAAA;AACnB,QAAI,CAAC;AAAiB,aAAO,QAAQ,IAAI;AACzC,WAAO,KAAK,4CAAmB,GAAG,kBAAkB,CAAC,SAA8B;AACjF,YAAM,SAAS,KAAK,MAAM,SAAS,CAAC;AAC/B,WAAA,UAAU,IAAI,MAAM;AAEzB,YAAM,OAAO,OAAO,oBAAoB,QAAQ,aAAa;AAC7D,WAAK,gBAAgB;AACrB,WAAK,aAAa;AAClB,WAAK,gBAAgB;AAErB,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGK,aAAA,QAAQ,CAAC,cAAc;AACtB,cAAA,OAAO,OAAO,gBAAgB,SAAS;AAE7C,YAAI,SAAS,QAAW;AACtB,eAAK,YAAY;AAAA,QAAA,OACZ;AACG,kBAAA,KAAK,iBAAiB,gBAAgB,sBAAsB;AAAA,QACtE;AAEK,aAAA,MAAM,KAAK,IAAI;AAAA,MAAA,CACrB;AAAA,IAAA,CACF;AAAA,EACH;AAAA,EAEA,aAAmB;AAEX,UAAA,WAAY,KAAK,WAAmB;AAE1C,aAAS,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;AACpC,YAAA,OAAO,KAAK,MAAM,CAAC;AAEzB,UAAI,MAAM;AACF,cAAA,UAAU,SAAU,KAAa,SAAS;AAEhD,YAAI,QAAQ,SAAS;AACnB,gBAAM,WAAW,QAAQ;AAEpB,eAAA,SAAS,KAAK,QAAQ;AACtB,eAAA,WAAW,KAAK,QAAQ,UAAU;AAAA,QAEzC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;"}