{"id":13715790,"url":"https://github.com/exokitxr/avatars","last_synced_at":"2025-04-15T07:21:34.548Z","repository":{"id":35714640,"uuid":"216910412","full_name":"exokitxr/avatars","owner":"exokitxr","description":"Avatar system for Exokit","archived":false,"fork":false,"pushed_at":"2023-08-07T00:38:37.000Z","size":310998,"stargazers_count":74,"open_issues_count":29,"forks_count":27,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-28T17:47:47.875Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://avatars.exokit.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/exokitxr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-10-22T21:10:46.000Z","updated_at":"2025-02-16T13:23:46.000Z","dependencies_parsed_at":"2024-01-03T07:22:32.323Z","dependency_job_id":"c9c7572a-8eff-4427-9c9f-ed7f7b1bd5b5","html_url":"https://github.com/exokitxr/avatars","commit_stats":{"total_commits":179,"total_committers":5,"mean_commits":35.8,"dds":0.03351955307262566,"last_synced_commit":"bcbaaecd7ff282a997ac0086a0e7197950b4acef"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exokitxr%2Favatars","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exokitxr%2Favatars/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exokitxr%2Favatars/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/exokitxr%2Favatars/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/exokitxr","download_url":"https://codeload.github.com/exokitxr/avatars/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249024028,"owners_count":21200013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T00:01:03.555Z","updated_at":"2025-04-15T07:21:34.518Z","avatar_url":"https://github.com/exokitxr.png","language":"JavaScript","funding_links":[],"categories":["Avatars"],"sub_categories":[],"readme":"# Exokit Avatars\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/exokitxr/exokit/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/exokitxr/exokit/total.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/exokit\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/exokit.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://travis-ci.org/modulesio/exokit-windows\"\u003e\u003cimg src=\"https://travis-ci.org/modulesio/exokit-windows.svg?branch=master\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://ci.appveyor.com/project/modulesio/exokit-windows\"\u003e\u003cimg src=\"https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true\"\u003e\u003c/a\u003e  \n  \u003ca href=\"https://twitter.com/exokitxr\"\u003e\u003cimg src=\"https://img.shields.io/twitter/follow/exokitxr.svg?style=social\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://exokit.org\"\u003eSite\u003c/a\u003e\n  \u0026mdash;\n  \u003ca href=\"https://exokit.org/docs/\"\u003eDocs\u003c/a\u003e\n  \u0026mdash;\n  \u003ca href=\"https://discordapp.com/invite/Apk6cZN\"\u003eDiscord\u003c/a\u003e\n  \u0026mdash;\n  \u003ca href=\"https://twitter.com/exokitxr\"\u003eTwitter\u003c/a\u003e\n  \u0026mdash;\n  \u003ca href=\"http://eepurl.com/dFiLMz\"\u003eEmail List\u003c/a\u003e\n\u003c/div\u003e\n\n\u003ca href=\"https://youtu.be/cd_DEwCDF6U\"\u003e\u003cimg alt=\"Hands Reality Tab\" target=\"_blank\" src=\"https://user-images.githubusercontent.com/6926057/68093240-89482400-fe61-11e9-84b0-365002f64f84.gif\" height=\"190\" width=\"32%\"\u003e\u003c/a\u003e\n\u003ca href=\"https://youtu.be/b-UKSg0QCRE\"\u003e\u003cimg alt=\"Live Reload Magic Leap\" target=\"_blank\" src=\"https://user-images.githubusercontent.com/6926057/68093243-8e0cd800-fe61-11e9-8e7b-d2440c4f622b.gif\" height=\"190\" width=\"32%\"\u003e\u003c/a\u003e\n\u003ca href=\"https://youtu.be/O1xA1r5SZUM\"\u003e\u003cimg alt=\"Tutorial Reality Tab\" target=\"_blank\" src=\"https://user-images.githubusercontent.com/6926057/68093247-9238f580-fe61-11e9-9276-9e2584382d41.gif\" height=\"190\" width=\"32%\"\u003e\u003c/a\u003e\n\nThe only web-based avatar system you need.\n\n- Loads GLB, FBX, VRChat, VRoid, .unitypackage humanoid\n- Auto-detects rigs, height, orientation\n- World scale matching\n- HMD + gamepads input\n- Bones orientation output\n- Arms, legs inverse kinematics\n- Walking kinematics\n- Face animation (visemes) with microphone\n- Hair/clothing animation\n\n## How it works\n\n```\nimport './three.js';\nimport Avatar from 'https://avatars.exokit.org/avatars.js';\n\nconst avatar = new Avatar(model, { // model is the gltf object that includes the scene, can use https://github.com/exokitxr/model-loader\n  // all options are optional\n\n  // animate fingers\n  fingers: true,\n\n  // animate hair\n  hair: true,\n\n  // remove head for first person\n  decapitate: false,\n\n  // animate visemes (blink, mouth, etc.)\n  visemes: true,\n  // navigator.mediaDevices.getUserMedia({audio: true}); // microphone input for visemes\n  microphoneMediaStream,\n  // false to passthrough microphone audio\n  muted: true,\n\n  // add debug bone geometry\n  debug: true,\n});\n\navatar.setMicrophoneMediaStream(microphoneMediaStream); // set microphoneMediaStream separately\n\nfunction animate() {\n  const now = Date.now();\n  avatar.inputs.hmd.position.set(0, 1.5 + Math.sin((now%2000)/2000*Math.PI*2)*0.5, 0); // or, get pose from WebXR\n  avatar.inputs.leftGamepad.position.copy(avatar.inputs.hmd.position).add(new THREE.Vector3(0.2, -0.3, -0.3));\n  avatar.inputs.leftGamepad.pointer = 0.5; // for finger animation\n  avatar.inputs.leftGamepad.grip = 1;\n  avatar.inputs.rightGamepad.position.copy(avatar.inputs.hmd.position).add(new THREE.Vector3(-0.2, -0.3, -0.3));\n\n  avatar.setFloorHeight(0) // sets the floor height that exokit uses to determine the pose\n\n  avatar.update();\n\n  requestAnimationFrame(animate);\n}\nanimate();\n```\n\n## [License](https://github.com/exokitxr/license)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexokitxr%2Favatars","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexokitxr%2Favatars","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexokitxr%2Favatars/lists"}