# Character XYZ 3D Viewer — complete text Every page of https://www.character.xyz/3d-viewer in one document, for language models. The index, with links, is at https://www.character.xyz/llms.txt. Last updated 2026-09-07. --- ## 3D Model Viewer URL: https://www.character.xyz/3d-viewer The Character XYZ 3D Viewer is a free online tool for opening and inspecting 3D models in a web browser. It reads GLB, glTF, FBX, OBJ, PLY, STL and VRM files and reports their meshes, materials, skeletons, morph targets and animation clips. Files are parsed on your own device and are never uploaded. Your file never leaves your browser. There is no upload, no account and no server-side processing. ### Formats it opens Drag in .glb, .gltf, .fbx, .obj, .ply, .stl or .vrm — or the whole folder a .gltf lives in. - .glb (GLB): Draco, KTX2 and meshopt decoding - .gltf (glTF): the .gltf JSON form with its external buffers and textures - .fbx (FBX): skeletons, bone counts and animation takes - .obj (OBJ): groups, and the materials from the .mtl beside it - .ply (PLY): scan meshes, with vertex colours when the file carries them - .stl (STL): triangle count and real-world dimensions, for print checks - .vrm (VRM): VRM 1.0 avatars — the humanoid bone map, expressions, spring-bone chains and first-person flags Not supported: .usdz. ### What you can inspect Most online viewers render a model and stop. This one reports what is actually inside the file, which is what you need when an export goes wrong. - Khronos validation report: Runs the official glTF validator over your file and lists every error, warning and hint with its severity and the node it came from. - Skeleton and rig: Every bone by name with the count, plus an overlay drawn over the model, so you can tell a 9-joint production rig from a 92-bone Rigify export without opening Blender. - Morph targets: Every morph target by name, grouped per mesh, each with a live weight slider so you can drive a shape and see it move. - ARKit-52 blendshape check: Which of the 52 standard ARKit blendshapes your model has and which are missing, broken down by facial area — the answer to why a face will not drive from a phone capture. It reads the common naming conventions, and names the facial set your file is using when it turns out not to be ARKit's. - Textures and VRAM budget: Each texture with the slot it fills and its resolution, plus an estimated GPU memory total, so you can see which map is blowing the budget. - Animation clips: Every clip in the file with its real duration, playable with speed and looping — including takes that ship as separate GLBs. Clip changes use inertial blending, so a limb's motion carries through the cut instead of stalling at it. - Mesh statistics: Vertex and triangle counts, material and texture counts, bone and morph-target counts, and the model's bounding dimensions. ### How to use it 1. Open the viewer — Go to character.xyz/3d-viewer. There is nothing to install and no account to create. 2. Drop in your model — Drag .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. 3. Inspect it — Open the inspector panel to read mesh statistics, materials, skeleton, morph targets, animation clips and texture budgets. 4. Fix what it finds — Run the validation report to see every issue against the glTF specification, then re-export and check again. ### Frequently asked questions **How do I view a GLB file online?** Open character.xyz/3d-viewer and drag your .glb file onto the page. It opens in the browser straight away — there is no upload, no plugin and no account. You can then orbit the model, change the lighting and open the inspector to read its meshes, materials, skeleton and animations. **Is my 3D model uploaded to a server?** No. The file is read and rendered entirely by your own browser using WebGL and WebGPU. Nothing is transmitted, stored or logged, which means you can safely inspect unreleased or client-confidential assets. **What is the difference between GLB and glTF?** They are the same format in two containers. A .gltf file is JSON that references its geometry buffers and textures as separate files alongside it. A .glb file packs that same JSON, the buffers and the textures into one binary file, which is why GLB is what most tools export for delivery. This viewer opens both. **How do I check if my GLB has a skeleton or rig?** Drop the file in and open the skeleton tab in the inspector. It lists the bone hierarchy and the total bone count, and shows which meshes are skinned to it. That is usually enough to tell a clean production rig from an export that brought a control rig or a whole Rigify hierarchy along with it. **How do I check if a model has ARKit blendshapes?** Open the ARKit-52 tab. It reports how many of the 52 standard ARKit blendshapes your file has, broken down by facial area, and lists every one that is missing by name. It reads the usual naming conventions, so a rig that spells them eyeBlink_L or Head.eyeBlinkLeft is still recognised — and when a file uses a different facial set altogether, such as VRoid's, it says which one rather than reporting a bare zero. A face that will not drive from a phone capture is almost always missing shapes rather than wired up wrongly. **Why is my GLB animation not playing?** The three usual causes are that the clip was never exported, that it targets bones that are not in the file, or that the exporter wrote it against a different skeleton than the mesh is skinned to. The inspector lists every animation clip with its real duration, so an empty list tells you the export dropped it rather than the player failing to run it. **Why are my textures missing after a Blender export?** Usually the images were left as external file references rather than packed, or the material used a node the glTF exporter cannot translate. The textures tab lists every image the file actually contains with its resolution and format, so you can tell an unpacked texture from an unsupported material graph. **How many bones can a glTF file have?** The glTF 2.0 specification sets no limit at all on the number of joints in a skin — the ceiling you actually hit belongs to whatever engine plays the file. Older renderers pass bone matrices as shader uniforms and cap out somewhere around 64 to 256 per skin, while ones that use a bone texture handle thousands. Separately, each vertex is bound to four joints per JOINTS_0 set, so a mesh needing more influences per vertex needs a second set. The skeleton tab reports the real count in your file, which is the number to compare against your target engine's documented limit. **Can I change the lighting?** Yes. There are six lighting presets — Realistic full image-based lighting, Studio, Detail, two sculpting matcaps and Flat base-colour-only — and the viewer opens on Realistic so a textured asset looks the way it will in an engine. On a browser with WebGPU you can also switch on screen-space global illumination for softer indirect bounce light. Your choice is remembered the next time you open the page. **Can I export a screenshot of my model?** Yes. Save a PNG at one, two or four times the on-screen size, with the option to leave the background out so the image carries a real alpha channel and drops straight into a comp. You can also record a six-second turntable as a WebM video. Both are produced in your browser and saved to your device — nothing is rendered on a server. **Is the 3D viewer free?** Yes, completely, with no account and no limits on file size beyond what your own device can hold in memory. --- ## GLB Viewer URL: https://www.character.xyz/3d-viewer/glb The Character XYZ GLB Viewer opens .glb files in a web browser and reports what is inside them — meshes, materials, textures, the skeleton, morph targets and animation clips — along with a validation report from the official Khronos glTF validator. Draco, KTX2 and meshopt compression are all decoded. The file is read on your own device and is never uploaded. **What is a GLB file?** A GLB is the binary form of glTF 2.0: the scene description, the geometry buffers and the textures packed into one file. It is what most tools export for delivery, because a single file cannot arrive with its textures missing the way a .gltf and its siblings can. **Why does my GLB open somewhere else but not here?** The usual cause is compression. A GLB can be Draco-compressed, meshopt-compressed, or carry KTX2 textures, and a viewer without those decoders shows nothing or an untextured mesh. This viewer wires all three, so a compressed export opens the same as an uncompressed one. **How do I check whether my GLB is valid?** Open the inspector and run the validation report. It runs the official Khronos glTF validator over the original bytes and lists every error, warning, info and hint with the JSON pointer it came from — for example an unused TEXCOORD accessor, with the hint to re-export with 'purge unused' enabled. --- ## glTF Viewer URL: https://www.character.xyz/3d-viewer/gltf The Character XYZ glTF Viewer opens .gltf files in a web browser, resolving the .bin buffers and image files that sit beside them, and reports the meshes, materials, skeleton, morph targets and animation clips inside. It also validates the file against the Khronos glTF 2.0 specification. Everything is parsed on your own device and nothing is uploaded. **Why does my .gltf open with no geometry?** Because a .gltf is only the JSON. Its geometry lives in a .bin file and its textures in image files beside it, all referenced by relative path. Opening the .gltf alone gives an empty or untextured scene. Drop the whole folder — or select the .gltf together with its companions — and the references resolve. **What is the difference between .gltf and .glb?** They are the same format in two containers. A .gltf is JSON with its buffers and textures as separate sibling files; a .glb packs all of it into one binary file. This viewer opens both, and the inspector reports the same information either way. **Can I validate a glTF file online?** Yes. The inspector runs the official KhronosGroup/glTF-Validator over the original bytes and reports the errors, warnings, infos and hints with their JSON pointers — the same engine the specification's own tooling uses. --- ## FBX Viewer URL: https://www.character.xyz/3d-viewer/fbx The Character XYZ FBX Viewer opens .fbx files in a web browser and reports their meshes, materials, skeleton and animation takes. Clips can be played, looped and speed-changed, and clip changes are blended with inertialization so motion carries through the cut. The file is read on your own device and is never uploaded. **Why does my FBX look a hundred times too big?** Because FBX usually stores centimetres while glTF and most engines assume metres, so the same model measures around 100× larger. It is a property of the file rather than a fault: this viewer frames the camera from the model's own bounds, so an FBX in centimetres opens correctly framed and the dimensions in the inspector are the file's real numbers. **Can I see the rig and the animation takes in an FBX?** Yes. The skeleton tab lists every bone by name with the total count and can draw a bone overlay over the model, and the animation tab lists each take with its real duration and plays it. That is usually enough to tell a clean production rig from an export that brought a whole control hierarchy with it. **Do I need Maya, 3ds Max or Blender to open an FBX?** No. This viewer parses FBX in the browser, so you can check a delivery, a Mixamo download or a client file without installing anything and without uploading the file anywhere. --- ## OBJ Viewer URL: https://www.character.xyz/3d-viewer/obj The Character XYZ OBJ Viewer opens Wavefront .obj files in a web browser, loading the .mtl material library beside them when it is present, and reports the object groups, materials, triangle counts and bounding dimensions. The file is parsed on your own device and is never uploaded. **Why is my OBJ plain grey?** Because an OBJ carries no materials of its own — they live in a .mtl file referenced beside it, and the texture images beside that. Drop the .obj together with its .mtl (and the images) and the materials load. On its own, the geometry is all the file contains. **Does an OBJ contain a rig or animation?** No. Wavefront OBJ is a geometry format only: vertices, normals, UVs, groups and material assignments. There is no skeleton and no animation in the format at all, so the skeleton and animation tabs will correctly report none. Use FBX or glTF for rigged or animated assets. **How large an OBJ can this open?** As large as your device's memory allows. OBJ is a text format, so files are several times bigger on disk than the equivalent binary — a few hundred thousand triangles is comfortable in a modern browser. --- ## PLY Viewer URL: https://www.character.xyz/3d-viewer/ply The Character XYZ PLY Viewer opens Stanford .ply files in a web browser and reports their vertex and triangle counts, bounding dimensions and per-vertex colour when the file carries it. PLY is the usual output of photogrammetry and 3D scanning, and the file is read on your own device rather than uploaded. **Why is my PLY scan grey instead of coloured?** Because not every PLY carries colour. The format stores it as per-vertex red, green and blue properties, which scanners write and mesh exporters often do not. When those properties are present this viewer renders them; when they are absent there is no colour in the file to show. **Can this open a PLY point cloud?** It opens PLY meshes, which is what most photogrammetry pipelines export once the cloud has been reconstructed. A pure point cloud with no faces will report its vertex count but has no surface to shade. **Is ASCII or binary PLY supported?** Both. The header declares which one it is and the loader follows it, so a file from any scanner or reconstruction tool opens the same way. --- ## STL Viewer URL: https://www.character.xyz/3d-viewer/stl The Character XYZ STL Viewer opens .stl files in a web browser and reports their triangle count and bounding dimensions in the file's own units, with wireframe and X-ray views for checking the surface. STL is the standard 3D-printing format, and the file is read on your own device rather than uploaded. **Why is my STL a single colour?** Because STL has no colour, no materials and no UVs. The format stores nothing but triangles and their normals, which is why it is used for printing and why every STL viewer shows a single shaded material. Anything coloured came from the viewer, not the file. **How do I check the size of an STL before printing?** Open the file and read the bounding dimensions in the inspector. They are the model's own numbers in the file's units, so you can compare them against your printer's build volume before slicing. **Does this open both ASCII and binary STL?** Yes. Binary is what almost every tool writes because it is far smaller; ASCII STL is human-readable and much larger. The loader detects which it is and opens either. --- ## VRM Viewer URL: https://www.character.xyz/3d-viewer/vrm The Character XYZ VRM Viewer opens .vrm avatars in a web browser and reports what is inside them — the humanoid bone map, the expression set, the spring-bone chains and the first-person flags — with the spring bones simulated live so hair and clothing move as you orbit. The avatar is read on your own device and is never uploaded, which matters for a model you have not published yet. **What is a VRM file?** A VRM is a glTF binary carrying an extra set of extensions that describe an avatar rather than just a model: a standard humanoid bone map so any VRM animates on any VRM-aware app, an expression set for the face, spring bones for hair and clothing, and flags saying which meshes the wearer should see from first person. It is the format VTuber and social-VR tools have standardised on. **Does this render MToon toon shading?** No, and it says so rather than letting you discover it. VRM materials use MToon, a toon shading model, and this viewer renders each MToon surface through its base colour, textures, normal map and emissive instead — which is the fallback the glTF specification itself defines for MToon, plus a little more. Shade colour, the shading shift, the toon ramp, rim light, matcap and outlines are not applied, so an avatar looks smoothly lit here rather than cel-shaded. Everything the inspector reports — bones, expressions, spring bones, textures, materials — is unaffected. **Can I see an avatar's spring bones and expressions?** Yes. The spring chains are simulated every frame, so hair and clothing settle and swing rather than staying welded to the head. The expressions appear as morph targets in the inspector with a slider each, so you can drive one and watch the face, and the ARKit-52 tab reports how the expression set lines up with the 52 shapes a phone capture sends. **Is my avatar uploaded anywhere?** No. The file is parsed and rendered entirely by your own browser, so an unreleased commission or a client's avatar can be checked without it leaving your machine. --- ## Rig Checker URL: https://www.character.xyz/3d-viewer/rig-checker The Character XYZ Rig Checker opens a rigged character in a web browser and reports its skeleton: every bone by name, the total bone count, and an overlay drawn over the model so a bone can be found on the mesh. It also lists the animation clips in the file with their real durations and plays them. GLB, glTF and FBX are read on your own device and are never uploaded. Works with: GLB, glTF and FBX — the three formats that carry a skeleton. ### What it checks - Every bone, by name and in order: The full list as the file stores it, with the total count at the top. That count is usually the whole diagnosis: a production character is tens of joints, and a export that brought a control rig along is hundreds. A 92-bone Rigify hierarchy and a 9-joint production rig do not look different in a render and are impossible to confuse here. - The skeleton drawn over the model: Switch the bone overlay on to see where the joints actually sit, and hover a row in the list to mark that bone on the mesh. Combined with X-ray — which stops the surface occluding itself — this is how you find a joint that ended up in the wrong place rather than merely misnamed. - Whether the mesh is skinned at all: A file can carry a full skeleton and no binding, which renders identically and animates not at all. When nothing in the file is skinned the skeleton tab says so in as many words instead of showing an empty list you have to interpret. - Every animation clip, played: Each clip with its real duration, playable with speed and looping, including takes that ship as separate GLBs beside the mesh. An empty list tells you the exporter dropped the animation rather than the player failing to run it. Clip changes are blended with inertialization, so a limb's motion carries through the cut. **How do I check a character rig without opening Blender?** Drag the GLB, glTF or FBX onto character.xyz/3d-viewer and open the skeleton tab. It lists every bone by name with the total count and can draw the skeleton over the model. Nothing is installed and nothing is uploaded — the file is parsed by your own browser. **Why does my character have hundreds of bones after exporting?** Almost always because the exporter included the control rig as well as the deform skeleton. Rigify in particular produces a hierarchy in the nineties once the widgets, mechanism and organic layers come along, where the character only needs the deform bones. The bone list here shows exactly which ones arrived, and the names usually make the origin obvious. **Why is my rig broken after a glTF export?** The three common causes are a mesh that lost its binding and is no longer skinned to the skeleton, an animation that targets bones under different names than the ones exported, and a skeleton exported with no mesh bound to it at all. The skeleton tab distinguishes the first — it reports when nothing in the file is skinned — and the animation tab distinguishes the second, because a clip that targets missing bones plays with nothing moving. **Does this show skin weights?** No. It reports the skeleton — bone names, the bone count, where the joints sit, and whether a mesh is skinned to them — and it plays the animation. It does not display per-vertex weights or grade the skinning, so a weight-painting problem is not something this tool can currently show you. **Can I check an FBX rig from Mixamo or a client delivery?** Yes. FBX is read in the browser along with its animation takes, so a Mixamo download or a delivery from an outsourcer can be checked before it goes anywhere near a scene. FBX usually stores centimetres where glTF assumes metres, which makes the model measure around a hundred times larger — the camera frames from the model's own bounds, so it opens correctly framed regardless. --- ## ARKit Blendshape Checker URL: https://www.character.xyz/3d-viewer/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 with: GLB, glTF and FBX — any format that carries morph targets. ### 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. **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. --- ## glTF Validator URL: https://www.character.xyz/3d-viewer/gltf-validator The Character XYZ glTF Validator runs the official KhronosGroup glTF-Validator over a .gltf or .glb file in a web browser and reports every error, warning, info and hint it finds, each with its severity and the JSON pointer to the part of the file it came from. It also reports which tool generated the file and which glTF extensions it uses and requires. The file is validated on your own device and is never uploaded. Works with: glTF and GLB. The glTF specification is what the validator checks, so there is nothing for it to say about an FBX, OBJ, PLY or STL. ### What it checks - The official validator, not an imitation: The same KhronosGroup/glTF-Validator engine the specification's own tooling runs, executed over the original bytes you dropped in. A file that passes here passes wherever else that engine is run. - Severity, so you know what to fix: Errors, warnings, infos and hints are counted separately and shown apart. That distinction is the useful part: an error means the file violates the specification and a strict loader may refuse it, while a hint is usually an efficiency note such as an accessor nothing references. - A JSON pointer to the actual problem: Each message carries the pointer into the glTF document it came from, so a complaint about an accessor names which accessor. That is the difference between knowing a file is invalid and knowing what to change. - The generator that wrote the file: The exporter's own signature, straight out of the asset. When a problem turns out to be systematic rather than one-off, this is the field that tells you which tool in the pipeline to go and fix. - Extensions used and required: Both lists, kept apart. A required extension a target engine does not implement will refuse the file outright, where a merely used one degrades — so which list an extension is in decides whether it is a blocker. **How do I validate a glTF file online?** Drag the .gltf or .glb onto character.xyz/3d-viewer and press Validate. The official Khronos validator runs in your browser over the file's original bytes and lists every issue with its severity and JSON pointer. There is no upload and no account, so a confidential or unreleased asset can be checked safely. **What is the difference between an error and a warning?** An error means the file breaks the glTF 2.0 specification and a strict loader is entitled to refuse it. A warning means it is valid but doing something the specification advises against, which usually still loads. Infos and hints are neither — they are observations, most often about data nothing in the file references, and they are worth reading when a file is unexpectedly large. **My GLB opens in one viewer and not another. Why?** Usually either a spec violation that one loader tolerates and another does not, or a required extension the strict one does not implement. The validation report separates those two: the errors list covers the first, and the required-extensions list covers the second. **Can I validate an FBX or an OBJ?** No, and no tool can — the Khronos validator checks files against the glTF specification, and there is no equivalent specification conformance check for those formats. This viewer still opens FBX, OBJ, PLY and STL and reports what is inside them; it simply does not offer a validation report for files the validator has nothing to say about. **Is my file uploaded to validate it?** No. The validator is a WebAssembly build that runs inside your own browser tab, on bytes that never leave your device. Nothing is transmitted, stored or logged.