
Free · No sign-up · Nothing uploaded
About this viewer
ARKit Blendshape Checker
The Character XYZ Blendshape Checker opens a character in a web browser and reports its face against the 52 standard ARKit blendshapes: how many are present, which are missing by name, and how the gaps fall across the eyes, jaw, mouth, brows, cheeks, nose and tongue. It reads the common naming conventions, so a rig that spells them eyeBlink_L or Head.eyeBlinkLeft is still recognised. The file is parsed on your own device and is never uploaded.
Works withGLB, glTF and FBX — any format that carries morph targets.
Reports
What it checks
- How many of the 52 are there
- A single number against the set that ARKit, a phone capture and every retargeting preset assume. The list is the canonical one in Apple's own order, which is also the order the weights travel in, so the count means the same thing here as it does downstream.
- Which ones are missing, by name
- Not a score but a list: mouthStretchLeft, cheekSquintRight, and so on. That list is what you take back to the exporter, because the fix is nearly always regenerating specific shapes rather than rebuilding the face.
- Where the gaps fall
- The count broken down by facial area. A face missing three scattered shapes and a face missing every brow shape are different problems with different causes, and one total cannot tell them apart — a whole area at zero usually means a region was never authored, while scattered gaps usually mean an export filter.
- Naming conventions, read and reported
- eyeBlink_L, eyeBlink.L, EyeBlinkLeft and Head.eyeBlinkLeft all mean eyeBlinkLeft, and each is recognised. Where a match was a naming judgement rather than an exact ARKit name the page says so and shows the spelling it found, because a judgement presented as a fact is not a report.
- The set your file is actually using
- A VRoid avatar has a complete, working facial rig and scores zero against ARKit, because it uses a different vocabulary entirely. Rather than a bare zero that reads as "your model is broken", the checker names the set it recognises — VRoid's Fcl_ expressions, a MetaHuman control rig, VRChat visemes — so the number means something.
- Every morph target, driven live
- The morphs tab lists all of them by name, grouped by the mesh that owns them, each with a weight slider. Driving a shape to one and watching the face is how you tell a shape that is present but empty from one that works.
Getting started
How to use it
- 1Open the viewerGo to character.xyz/3d-viewer. There is nothing to install and no account to create.
- 2Drop in your modelDrag .glb, .gltf, .fbx, .obj, .ply, .stl or .vrm onto the page, or use the file picker. The file is read on your own device — for a .gltf, drop its folder so the buffers and textures come with it.
- 3Inspect itOpen the inspector panel to read mesh statistics, materials, skeleton, morph targets, animation clips and texture budgets.
- 4Fix what it findsRun the validation report to see every issue against the glTF specification, then re-export and check again.
Questions
Frequently asked questions
How do I check if a model has ARKit blendshapes?
Drag the file onto character.xyz/3d-viewer and open the ARKit-52 tab. It reports how many of the 52 are present, lists every one that is missing by name, and breaks the count down by facial area. Nothing is uploaded — the file is read by your own browser.
Why will my character's face not drive from a phone capture?
Nearly always because shapes are missing rather than because the wiring is wrong. ARKit sends 52 weights by name, and a shape the model does not have simply has nowhere to go, so the face moves partially or not at all. Checking which of the 52 are actually in the file answers it in a few seconds; a face with the eyes and jaw but no mouth shapes is a very common and very specific failure.
My blendshapes are named differently — will they still be found?
Yes, for the usual conventions. A side written as a suffix (eyeBlink_L, eyeBlink.L, eyeBlink-L) and a namespace written in front (Head.eyeBlinkLeft, blendShape1.jawOpen) are both resolved, and the page reports how many were matched that way rather than by an exact name. A genuinely different vocabulary — VRoid's, MetaHuman's — is not translated, because guessing a mapping between two facial sets would produce a confident answer that is wrong.
What are the 52 ARKit blendshapes?
They are the facial expressions Apple's ARFaceAnchor reports: 14 for the eyes, 4 for the jaw, 23 for the mouth, 5 for the brows, 3 for the cheeks, 2 for the nose and 1 for the tongue. The set has become the de-facto standard for face capture well beyond Apple's own devices, which is why an avatar missing part of it will not drive from most capture tools rather than only from an iPhone.
Does a model need all 52?
Not to be useful — a face with the eyes, jaw and the main mouth shapes reads convincingly for a lot of work. It needs all 52 to be driven by an unmodified ARKit stream without falling back, and the missing list tells you exactly how far off you are rather than leaving it as a yes or no.
Elsewhere
Other checks
By format
Missing shapes can be generated
Character XYZ generates the ARKit-52 set from a face rig as part of its pipeline. The checker is the inspection half of that, given away — if the list above is long, generating the shapes is usually faster than sculpting them.
See the creator toolsDrop a 3D model here
or choose a file — nothing is uploaded
Your file never leaves your browser. There is no upload, no account and no server-side processing.