githubEdit

NPV - Fixing Eye Clipping in NPVs

The subtle art of stuffing bones into meat

Created: August 11, 2025 by saltypigloaf Last documented update: January 10, 2026


Overview

In vanilla Cyberpunk 2077, V’s face only ever uses Rig 000 and it's associated bone structure, no matter what facial sliders you pick in Character Creation. This is a known bug and it causes serious visual problems.

Why it matters:

  • There are 22 female / 21 man facial rigs in the game.

  • Each rig corresponds to a set of morph slider values: for example, Rig 000 = “all sliders at 1,” Rig 001 = “all sliders at 2,” etc.

  • These rigs exist so that every facial feature aligns correctly to your custom CC choices.

  • Using the wrong rig leads to eyeballs clipping through eyelids or cheeks when looking sideways in Photo Mode.

  • For V, this can be corrected using mods like Facial Customisation[sic] Rig Fixarrow-up-right & Facial Customization Fix - ArchiveXLarrow-up-right but does not apply to NPVs.


Before You Start

This guide assumes you have already followed this guide: NPV: Preparing the head in Blender


Fixing the bones with a script

The same way we apply character creator morph targets to meshes with a script in blender, we need to get the correct bones for our rig.

In your NPV WolvenKit project:

  • Find your NPV's head folder. (that contains all the head meshes)

  • (the folder should have files like: h0_000_pwa_c__basehead.mesh, he_000_pwa_c__basehead.mesh, heb_000_pwa_c__basehead.mesh, or h0_000_pma_c__basehead.mesh, he_000_pma_c__basehead.mesh, hx_000_pma_c__basehead_cyberware_01.mesh, etc...)

  • Make sure you didn't rename these files.

  • We are going to re-import these meshes later, so export them if you don't have them exported already.

  • Go to: Tools > Script Manager and add a new script:

  • Copy this script into the editor, you just opened:

  • At the top of the script:

    • Set the npv_head variable to the path of your npv's head folder.

    • Set the cc_params_input to your character creator parameters (the same way you did in blender)

Make sure to replace \ backslashes with \\ double backslashes when pasting any paths into scripts.

  • Save & Run the script. (Make sure you have log opened to see when its done.)

If there are no errors in the logs:

  • Move everything out the #script_output folder. (backup your files, replace them with the new ones)

  • Re-import the meshes using the Import Tool.

Re-importing is crucial for allowing WolvenKit to correctly calculate the new bone values.

After replacing the skeleton in the mesh, you need to update the face_rig component:

  • Open the .app or .ent file that contains your NPV’s head setup.

  • Locate the face_rig component.

    • Set rig to the new _skeleton.rig file

  • Done.

circle-info

If the script didn't work correctly, don't be scared to figure out what the logs are saying.

This code is not complicated and should be easy enough to edit.


Fixing the bones manually:

The Trade-Off

Heads up: This changes the entire head skeleton, not just the eyes.

  • Pro: Eyes track correctly; no clipping.

  • Con: The rest of the head inherits slight positional changes from the donor rig.

  • For most NPVs this is worth it.

If you want to avoid this - use the script. Fixing the rig properly manually is too much work.

Workflow Overview

  1. Identify donor rig for your NPV’s face/eye shape.

  2. Export target mesh to GLB.

  3. Copy skeleton data from donor to target in WolvenKit.

  4. Re-import target mesh into WolvenKit.

  5. Update the face_rig component


Step-by-Step Guide

1. Prepare Files

  • Identify your donor mesh, based on the Character Creation chosen for the Eye

    • Navigate to base\characters\head\player_base_heads\player_{body}_average\

    • Find the subfolder with the numeric value of your Eye choice. The number will be offset by 1 because the rig 000 is associated with Character Creation choice of 01.

📄 Example:

If your eye selection was 12, your rig/bones will be found in the 011 folder, either:

  • h0_011_pwa_c__young_714

  • h0_011_pma_c__middle_763

  • Import the necessary files into WolvenKit:

    • Source mesh (donor head with correct rig, identified above)

    • New facialsetup and rig files

    • Target mesh (NPV head you want to fix)

  • Duplicate the target mesh to keep an untouched backup.

Warning: Never work directly on your final NPV mesh! Always duplicate for edits.


2. Export target mesh to GLB

  • Export your target mesh using the Export Tool in WolvenKit.

Note: You won't need to edit this GLB directly, but the step of exporting and importing is absolutely necessary.


3. Copy Skeleton Data

  • Open both both the target and donor meshes in WolvenKit.

  • Change the Editor Mode to Advanced in both

  • In the target mesh, delete the following arrays:

    • "boneNames".

    • "boneRigMatrices".

    • "boneVertexEpsilons"

    • "renderResourceBlob/header/bonePositions"

  • In donor mesh, copy each of these arrays, one at a time, and paste them into the target mesh:


4. Re-import target mesh into WolvenKit

  • Save your changes.

  • Using the Import Tool, import your target mesh from GLB.

Important: This step is crucial for allowing WolvenKit to correctly calculate the new bone values. Without it, your NPVs face will droop and sag.


5. Update the face_rig Component

After replacing the skeleton in the mesh, you need to update the face_rig component so the game points to the correct donor rig and facial setup.

  1. In WolvenKit, open the .app or .ent file that contains your NPV’s head setup.

  2. Locate the face_rig component.

  3. Update:

    • rig → point this to the donor .rig file you imported in Step 1.

    • facialSetup → point this to the donor .facialsetup file you imported in Step 1.

  4. Leave the animGraph value unchanged — this stays as it is.

Important: If you don’t update both .rig and .facialsetup to match the donor, the facial bones will not behave correctly in-game.

Credits

Last updated