Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
How to replace an in-game item with your custom mesh
Published: Oct. 14 2023 by Last documented Update: Mar. 20 2024 by
This page will give you information on how to get a 3d object into Cyberpunk.
You can find other relevant guides scattered across this wiki, for example
AMM: Textured items and Cyberpunk Materials using Custom Props
Wolvenkit Blender IO Suite(>= 1.5.5.2 for Wolvenkit 8.14)
Blender (>= 4.1 for Wolvenkit 8.14)
A , so that you can pack your mod
For the purpose of this guide, it doesn't matter if you are trying toReplace a player item with an NPC item, creating AMM: Custom Props or Adding new items. You will overwrite an existing in-game mesh, the file path doesn't matter.
If you are creating props, you use a mesh from the template project or grab any static mesh from the game.
Do not take equipment item or weapon meshes — those include a bunch of extra data that you don't need (the armature). You don't need it, and it can have side effects.
As this guide will focus on equipment items, you can skip Step 3 and 4 completely.
If you want V to wear the item that you're currently porting, it needs to move with the player. For that, you need an armature. This guide will show you how to acquire one.
You will delete fewer meshes if you read all of the sections below before starting.
Begin by picking a game mash from the right slot. If you're porting shoes, pick a shoe mesh, if you're porting glasses, pick a glasses mesh – you get it.
For the sake of future you, pick an in-game item that is as close to your new garment as possible. If you're porting boots, take boots and not slippers. If you're using a baggy sweater, pick one of those or a jacket rather than a skin-tight t-shirt.
Make sure to use an item with the correct armature. You can identify them by prefix in the path:
Search for something like this:
For torso items, you can add t1
for inner torso items (tight-fitting) or t2
for outer torso items (worn above t1).
For how to export a mesh, see WKit Blender Plugin: Import/Export -> #meshes -> #export-from-wolvenkit
If your mesh won't export from Wolvenkit, try unchecking the following box(es) in the export settings (by unchecking the boxes):
For how to import a mesh into Blender see WKit Blender Plugin: Import/Export -> #meshes -> #importing-into-blender
The mesh count in Blender corresponds to the submesh/chunk count in Wolvenkit. In Cyberpunk, we have one submesh per material that we want to use.
If you don't know what that means, ignore the information for now - but few meshes use more than five. The current maximum is the player base body with a total count of ten submeshes per , so to be on the safe side, we need to stay below that.
If you want to get fancy, check out Step 2 in the guide about ported items and Cyberpunk materials. Otherwise:
Select all meshes but one by shift-clicking them in the Outliner at the topright of your viewport
Select the last mesh
Join the meshes together (Shortcut: Ctrl+J
)
This section will show you how to get the following end result:
one or more mesh(es) with names from submesh_00_LOD_1
, consecutively numbered
parented to the right armature
There are two strategies that you can use. Personally, I use #strategy-1-replacing-the-3d-data, since it will retain most of the original mesh's properties.
By the end of this section, you should have something like this:
No matter which strategy you use, we need to get the prerequisites done first. We need an original Cyberpunk armature.
Import the result of Step 1 into Blender (see the Wolvenkit Blender IO Suite's documentation about #importing-into-blender)
Clean up any residual modifiers and transforms (we don't want them):
If your mesh has an armature modifier with a non-Cyberpunk armature, delete it
(click on the x
in the modifier panel)
If your mesh is parented to anything that is not a Cyberpunk armature, unparent it:
Select the mesh(es)
Select Unparent (Hotkey: Alt+P
)
Select the second option "Clear Parent and Keep Transforms"
If you are doing this, you can skip#strategy-2-parenting-the-meshes.
We start by deleting the original's vertex data.
In , select all of the original meshes.
Switch to Edit Mode (Hotkey: Tab
)
Make sure that all vertices are selected (Hotkey: A
)
Delete all vertices (Hotkey: x
, option: Vertices)
Switch back to Object Mode (Hotkey: Tab
)
We'll merge our new meshes into the empty containers now:
Click on your new mesh
Click on the empty original mesh in the Outliner (yes, order matters)
Join them (Hotkey: Ctrl+J
)
Repeat the same for all meshes that you want to import to Cyberpunk.
If you need more submeshes, simply duplicate an existing one (Hotkey: Ctrl+D
, ESC
) and change its name by incrementing the number. Make sure it still ends in LOD_1
, not in LOD_2
— that will tell the game it's low-poly, and cause it to be hidden until you're further away.
That's it. All your meshes are parented to the armature now.
If you are doing this, you can skip #strategy-1-replacing-the-3d-data.
We can simply parent the meshes to our existing armature:
Click on your mesh
Click on the Armature object in the Outliner
Select Parent (Hotkey: Ctrl+P
)
Select "Armature Deform"
Make sure to rename your mesh: Wolvenkit doesn't know what to do with meshes that aren't part of the sequence starting at submesh_00_LOD_1
. (Blender's .000 suffixes will be ignored)
You can delete the original meshes, or you keep them for Step 4.
Start by deleting all vertex groups from your new mesh, as we will now replace these and don't want anything funky to stick around to destroy our re-import:
You now need to transfer the weights from your original game mesh. If you deleted or overwrote the armature's original meshes during #step-3-parenting-the-mesh-es, you can simply import it again for a second copy.
The Wolvenkit Blender IO Suite has a function to do this for you. For the sake of completeness, the box below contains the full manual process, but we recommend using the plugin's Mesh Tool panel to do this.
Nobody likes weight painting.
This is what you need to do if your mesh moves unevenly or if parts of it are clipping through the body although things are fitting correctly. Pray that you don't have to do it, because it sucks.
If you're unfortunate, you can find a guide on Weight Painting for Gonks!
See the Wolvenkit Blender IO Suite's documentation about #exporting-from-blender
… or maybe not. Maybe you should try Troubleshooting your mesh edits now.
If everything worked, here are a few more guides that you might want to look into:
R&R: Refitting (step by step) will teach you how to refit for a certain body mod
Adding new items will walk you through the steps of adding your mesh as a new piece of equipment
AMM: Textured items and Cyberpunk Materials using Custom Props will tell you how materials work, and how you can use them to texture your item
How to create a new head (or alter the basic head shape)
Summary
Published: Oct 20 2024 by @manavortex Last documented edit: Oct 20 2024 by
Things I wish I had known before I jumped into Blender
Published: May 11 2024 by Last documented update: May 20 2024 by
TL;DR: Blender hard, but Blender free and Thog will make 3d object.
Do yourself a favour and read at least !
The open source software is huge and intimidating — it is a tool for professionals, and many people consider it as good or even better than paid alternatives.
While it has a steep learning curve, everyone can dabble in Blender (even you! Even your mom!). This page will give you tips that'll make it easier for you.
Blender is not intuitive to use (perhaps if your knees bend backwards). Our guides usually tell you what to click and teach you keyboard shortcuts. On top of that, is easy and you should definitely do it!
This is Blender's interface. The main action happens in the Viewport. In the default perspective (Layout), it is on the left — you can switch perspectives (workspace layouts) by using the perspective selector (purple) on the file bar.
Read for how to move around in it.
Use keyboard shortcuts - they will speed things up by at least 70%. Put a post-it on your monitor and only remove it when you know them by heart.
The main action happens in your Viewport
(the big one on the left).
You can use the Perspective Selector (pink) to swap around custom-defined workspaces.
You can switch between Edit Mode and Object Mode with Tab
(turquoise dropdown on screenshot 1)
You can switch the current selection tool with a long click on the tool's surface (shortcut to cycle: W
)
You can (de)select multiple things by ctrl-clicking on them.
The most recently selected thing is called Active
(this shows up in many context menus)
The Select Circle tool does not set an Active selection.
You can toggle X-Ray mode (Shortcut: Alt+Z
) by clicking the purple icon in the screenshot above
You can hide things (Shortcut: H
), Unhide them (Shortcut: Alt+H
), or hide everything else (Shortcut: Shift+H
)
You can undo your last action (Shortcut: Ctrl+Z
), and redo an action (Shortcut: Ctrl+Shift+Z
)
Spin the viewport by pressing the middle mouse button
and moving the mouse
Zoom with the mouse wheel
With /
(Numpad Divide), you activate Local Mode
, which will show you only your selection
Press Numpad 5
to toggle between perspective
and orthographic
mode. Try around with them
Don't be shy to do this! If you fuck up, you can always restore the default settings!
You can easily customize the interface — for example, you can set custom keyboard shortcuts by simply right-clicking on something!
To make your changes persistent, save your current .blend under File -> Defaults -> Save Startup File
.
You switch the View Mode in the dropdown on the topleft. Depending on your perspective, there are multiple options:
You can switch between the most commonly used modes, Object and Edit, with Tab
.
Here's what they do:
The shortcuts below are shared between Object and Edit mode:
This is especially handy in combination with Snap Selection:
Object mode is where you select stuff that you want to edit.
If you move anything in Object Mode, you need to Apply Transforms (Object -> Apply -> All Transforms), or Cyberpunk will ignore your changes.
Edit mode is where you actually edit the mesh.
You can only edit things that are selected in Object Mode.
With any active selection, you can toggle the following actions by hotkey, and then move the mouse:
Scale (Hotkey: S
): Grow or shrink something
Rotate (Hotkey: R
) What it says
Move (Hotkey: G
) Reposition something
You can lock each of those operations on an axis!
For example, press G
-> Z
to move your selection up and down. Press Z again to remove the lock.
By pressing .
, you can change the current Pivot Point:
This is the origin for your transforms:
With the shortcut Ctrl+L
, Blender will select everything up to a certain boundary. By default, this boundary is the same piece of 3d geometry, but in the bottom left corner of the viewport, you can pick the delimiter:
Hold Alt
and left click to instantly select an entire loop of vertices, edges, or faces.
Select all or part of a mesh then navigate to :
this will instantly select all boundary loops for the given selection, great for marking seams
Works in Edge, Vertex, or Face Selection Mode. Select at least one element, then Ctrl+click
on any other element to select the shortest path of edges, vertices, or faces between them.
Double-check that the shortest path is actually the path you want. If it's not, un-do (Hotkey: Ctrl+Z
) and shift-click on an edge closer to your selection.
In Edge Selection Mode (Hotkey: 2
), you can (un)mark edges as seams or sharps via context menu:
A seam (orange line in the viewport) is where the UV map will be split.
Unless you're UV unwrapping, those won't do anything, and you can use them as selection delimiters to your heart's content!
A sharp (blue line in the viewport) will cause a sharp crease/fold in the material. This translates to Cyberpunk, so it's neat to highlight your edges!
"I'm moving a single vertex, but my entire mesh is affected!"
Sounds familiar? You've run into Proportional Editing.
Click the button or press O
to turn it off and on
When it's active, moving, scaling or rotating will have an effect on anything close to your selection. This makes refitting super easy! No more jagged edges!
When you move (G
) or scale (S
) your selection, you will see a circle for the area of its effect.
You can change the circle's size with your mouse wheel
How to run scripts in Python (and merge AMM deco presets)
Published: Dec 14 2023 by Last documented update: Mar 18 2024 by
This guide will teach you how to execute Python scripts under Windows.
This guide is for running files outside of Blender.
If you want to run a Python script in Blender, you need to switch your viewport to the scripting perspective and click "play".
You can find a dedicated guide on in the 3d editing section.
We start by checking if you have Python installed already.
Open a Windows command prompt (Hotkeys: Windows+R
, type cmd
, press enter)
In the window that now opens, type the following:
Otherwise, please keep reading.
Close the command window - after installing Python, you need to open a new one.
The link in this guide is an example script in case you don't have one. If you do, use that one instead.
Download the file by clicking the corresponding button. Save it somewhere where you can find it easily.
Check the top of the file for anything that needs to be adjusted:
Ignore the lines starting with import
Read the lines starting with #
. They are comments and will tell you what to put.
Once you have everything set up, save the script.
Now it is time to run it. Keep reading!
Open a command window again (Hotkey: Windows+R, type cmd
, press enter)
Type python "
(python
, space, quotation mark)
Drag-and-drop the script you downloaded on the console window
Type another quotation mark and hit enter
The quotation marks will prevent error with spaces in path names. Leave them away at own risk :)
That's it - the script will now run and do things
If that isn't it, you made a mistake while editing the script file. Make sure that you don't have single backslashes in strings:
If you are running into this error in Blender, it should be enough to run the program as admin.
Otherwise, you are missing a Python module, and need to install it. You can do that by running the following code from your Windows cmd:
If that does not work, google for something like pip install module your_module_name windows
.
Find knowledge on editing 3d models here
Check the sub-pages for more detes, or check the section's sub-pages.
Due to its complexity, we don't have a dedicated guide on Blender. However, if you have no idea how to start, various other guides cover part of the process:
and
or
For more hands-on advice, see the guide section, for example
: Importing/exporting
or
A mesh defines the shape and surface of any in-game object.
Morphtargets are a special kind of mesh used for alternate and additional shapes beyond the static shape a .mesh
can define. If your source is a .morphtarget
, you need to primarily work with that rather than the .mesh
.
To bring 3d data into Cyberpunk, Wolvenkit needs a .mesh file to import into. .
You can use the in the to find meshes.
body gender | Player | NPC |
---|---|---|
For where to export a mesh, see
Once you are done, you can find the exported glb in your project's raw folder (see or for details).
See the wiki about
See below for a list
See for how to create custom shortcuts (it's easy and you should do it)
That being said, use the (Hotkey: F3
or Space
, depending on your settings) .
It gives you access to all of Blender's functions! Click on the link to see it in action
Check for more detes.
Understand when to use Object Mode and when to use Edit or Pose Mode. Read for more detes.
In Object, Edit and Pose Mode, you can use the 3d cursor (Shift-Click
or Shift-right click
, depending on your settings). You can use it as a or just as an orientation mark.
Read on how to make your way around this!
You only edit the current selection (read on how to get one).
Check to change your operation's origin.
Read on how to make use of the little dude.
With the shortcuts 1
, 2
and 3
, you can switch the Selection Mode between , , and :
See how to make use of this!
This doesn't work well with geometries that are complex or triangulated (Cyberpunk meshes are usually at least one of these things). You can a mesh for easier loop selection (hotkey: Alt+J
), then re-triangulate it again before exporting (Hotkey: Ctrl+T
)
A blows the scope of this guide, but you can read on if you're curious.
You can find a detailed guide on this under ->
By default, that circle might be huge and outside your screen. You might wanna change this and then .
Blender offers a fully-fledged Python environment, which is used by Netrunners to develop plugins like the .
Since you are reading this, you're probably not one of those. Don't worry! Some of our guides tell you to run Python scripts, but we have a dedicated guide for that:
If you have Python installed, it will now say something like "Python 3.11.3
" . In that case, you can go directly to .
Go to and download the correct installer package for your system - that will usually be Windows installer (64-bit). Take the latest stable release, it will be at the very top of the page.
Now, follow until you have installed Python, or google something like install python on windows for dummies
and follow that guide until you have installed Python.
Proceed to
Go to mana's github repo and grab the :
Open the script with a text editor of your choice (we recommend under Windows)
Step the Python version (, item 1 and 2). As of 2023, the version should start with a 3.
If it's not that, you can use a , or ask ChatGPT (I'm not kidding). Good luck!
For more information on .mesh files and how they work, see
For more informations on materials and mesh appearances, see
Read more on the page
male rigged
_pma_
_ma_
female rigged
_pwa_
_wa_
| Hide selected elements |
| Hide everything except for the selected elements |
| Un-hide everything |
| Delete selection |
| Invert selection |
| Duplicate selection |
Overview of working with morphtargets
COMPATIBILITY WARNING
Full .morphtarget
editing is enabled in Wolvenkit >= 8.9.1.
.morphtarget
Morphtargets are a special kind of a mesh, or more accurately a .mesh
is a more limited version of a mesh without the ability to define targets by itself (with a few exceptions.) A full model can consist of multiple .mesh
es and .morphtarget
s.
Morphtargets (or more generally just 'targets') are used for additional deformation beyond what rigging can do, as well as for creating alternative and/or additional shapes for a mesh. Blender calls targets shapekeys.
To be exact, cp2077 has three kinds of targets:
.morphtarget
is a separate type, and has an associated .mesh
(baseMesh
) because redengine splits the full data needed for the model into these two separate types. The .morphtarget
always defines the shape, overriding the .mesh
. The .mesh
stores the other information as usual. .morphtarget
s are used for, for example, body and head customization.
GarmentSupport is a property of a .mesh
. It is also a target and this is a more common way to define targets than the separate type. GarmentSupports are used, for example, to slightly shrink a t-shirt so that it doesn't clip when you put a jacket over it.
Vehicle damage submeshes. This is a static end state of a target, inserted directly as an extra submesh rather than a target.
A simple and perhaps familiar.morphtarget
example is chest size for FemV. There are three states: default, small, big. The default corresponds to the base mesh shape, and is the Basis shapekey in Blender.
The two other states are defined as targets. Each target defines a 'delta', a set of offsets for base mesh vertices from their positions in the default shape - including any other active deform, like a pose in photomode. If you fully enable one of these targets, you effectively have a mesh with the chest area reduced or enlarged.
Targets can be also enabled partially, with the states between off and fully on (the 'end state') interpolated by the engine or 3D software. This can be used for animations, but in the cp2077 context generally is not.
Targets can be blended together. If two targets are enabled fully or partially, their combined state is blended into one shape. In cp2077 some targets are mutually exclusive (like the chest size), and others are inclusive (your V's face is a combination of the selected eyes, nose, mouth, jaw, and ear target states all blended together.)
Exclusive/inclusive is not a limitation of the targets themselves, but of how cp2077 activates them..
The game engine activates targets by name (and region) in specific conditions.
Character customization targets are activated when the character is loaded (and dynamically in the CC view.)
GarmentSupports are activated when equipping a garment that goes "on top of" the garment with GarmentSupport.
So, some uses are probably already obvious. But targets enable quite a bit of exciting modding:
Modding anything with a .morphtarget
without breaking the targets like before
You can for example mod the CC tattoos, or piercings...
...Or any aspect of character face customization. Vampire catboy Legolas here we come!
TBA
The main limitation currently is that we do not have a way to add activations, at least generally. You need to hook into a target name that the engine already uses.
This Section is Incomplete
For best results, export an original game file and start from there, as exports from older Wolvenkit versions may not work.
For a collection of morphtarget resources for eye overlays, find NoraLee's Nexus resource.
One thing deserves highlighting right up front: whenever you are doing 3D work on a model that has a .morphtarget
, you work with the .morphtarget
, not the.mesh
. The .mesh
is only used for things the target doesn't include, like appearance definitions.
Fundamentally the 3D workflow goes like this in Blender (use the blender cp2077 plugin import/export):
WkitExport the .morphtarget
BlenderImport it
Make your edits to base shape and/or shapekeys (if you need to - the base shape edits are automatically propagated to shapekeys.) You can edit just like you would a .mesh
, because it is a mesh.
BlenderExport to a file named after the .mesh
BlenderExport to a file named after the .morphtarget
WkitImport the .mesh.gltf
first. Wkit will treat it just like it would a 'real' .mesh
WkitImport the .morphtarget.gltf
...And that's it. You can pack the mod.
Make sure to test your targets work blended with other targets, not just by themselves
You can create targets from scratch, all that matters is that the name matches the original. This is handy for zeroing out targets you don't need or want, for example.
I prefer to use either of the .gltf
formats over .glb
. They're all GLTF but .gltf
is slightly more widely supported, plus you can open it up in a json editor. -- Auska
See the GarmentSupport section for more info.
TBA
Object Mode |
Edit Mode |
Pose Mode |
Sculpt Mode |
Vertex Paint |
Weight Paint |
Texture Paint |
Best Practices for actually changing meshes
Published January 29 2023 by @manavortex | Edited by Na Last documented edit: January 09 2024 by manavortex
This guide will give you a number of mesh sculpting techniques when it comes to editing meshes in Blender.
Do not use mesh sculpting if you can get away with proportional editing! You can find the step-by-step documentation about this under R&R: Refitting (step by step) -> #step-4-refitting.
If this is your first time in Blender and you are lost, check Blender: Getting Started
Before doing this by hand, check the WKit Blender Plugin: AKL Autofitter
For information on weight painting, check Meshes and Armatures: Rigging
This guide is aimed at more intermediate refitting needs. For a step-by-step refitting guide, check here.
Prerequisites: - You have exported a mesh and imported it into Blender - You are able to read and comprehend instructions.
You can find the step-by-step documentation about this under R&R: Refitting (step by step) -> #step-4-refitting.
This is the recommended method, as it is easiest, fastest, and has the least chance of wreaking havoc with things that you don't want to fix.
This page documents other techniques so you've heard about them. If you're new about this, do not read on here.
Before you start editing your mesh, you should delete its shapekeys. This is necessary for the Sculpt Mode to show your changes in real time, and you don't need them anymore after editing your mesh.
Some people have been told to delete the Armature modifier before sculpting. That's not necessary!
The obvious approach is to change your mesh by moving vertices. This process is covered in the r&r refitting guide.
The downside of the sculpt mode is that it can edit only the selected mesh. For a workaround, see here.
The Sculpt Mode is pretty much What You See Is What You Get.
The easiest tools for beginners are Grab, Elastic Deform, and Smooth
In the "Tool" panel (Toggle shortcut: N), you can optionally enable symmetry (blue on the picture below).
A useful shortcut to keep in mind is F, which will let you change the cursor size.
You can import a body mesh as a reference.
You will find the player's body under
base\characters\common\player_base_bodies\player_female_average\
base\characters\common\player_base_bodies\player_male_average\
You can hide those parts that you don't want to sculpt.
Use the Edit Mode (Shortcut: Tab) to make a selection. Then, leave only those parts visible that you want to affect before switching back to Sculpt Mode.
Useful hotkeys:
H: Hide selection
Shift+H: Hide everything but selected
Alt+H: Unhide everything
You can also use the Lattice Deform Method below to selectively edit only part of the mesh.
You can use Blender's mask brush and function in Sculpt Mode to mask the parts that you do not want to sculpt.
This method is a workaround that you can use when you have only 2-3 meshes. You can fuse all meshes together, then split them apart after you're done.
Pros:
Relatively simple, and good to make small, simple changes to 2-3 meshes.
Allows symmetrical sculpting.
Cons:
Destructive editing
Can be a little time-consuming because you have to join, separate, and rename meshes every time you want to import it back to WolvenKit.
Let's assume that we're sculpting Rogue's pants. For surface material assignment, the seams are an own submesh — the pants (submesh_00) are coloured via multilayered
material, while the seams have a variation of metal_base
with coloured stitches.
We don't want to edit those separately, so we'll fuse them into one mesh, sculpt everything in one go, and then split them apart again.
To allow splitting, we need to make sure that every submesh has its own unique material. Select the mesh, switch to the "Material Properties tab on the right", and duplicate the assigned material:
Before the next step, make sure to remember the submesh numbers, because you need to restore them later. Changes in the submesh order will mess up material assignment in WolvenKit.
You can create a copy by duplicating the meshes (shortcut: Shift+D)
Now, join the meshes together — hold CTRL, select the main mesh, and join the meshes together (shortcut: Ctrl+J)
You now have a single mesh which you can sculpt to your heart's content.
Once you're done, you can separate the meshes again. Switch to Edit Mode, then select something that belongs to the former submesh. From the menu, pick the following entry:
Select -> Select Similar (Hotkey: Shift+G) -> Material
Then, split off the selection into its own submesh again:
Right-Click -> Separate (Hotkey: P) -> Selection
Make sure to restore the original mesh names before exporting your mesh from Blender.
After importing back into WolvenKit, remember to delete the GarmentSupport parameters from your mesh, as they will now produce string cheese.
The Lattice modifier deforms the base object according to the shape of a Lattice object.
Pros:
Can edit as many meshes at once as you want, no matter what armature they are parented to.
100% Non-destructive sculpting.
No need to separate, rejoin, and rename meshes after sculpting is done.
Good for making small, local changes to multiple meshes.
Edits can be stacked on top of each other by stacking modifiers.
Does not have to go through all the steps like Material Separation Method each time you want to import to WolvenKit.
Cons:
Trying to select desired vertices of the lattice can be difficult.
Can be hard to restrict edits to areas not covered by the lattice, thus possibly making unwanted edits.
Does not allow symmetrical sculpting.
Begins by adding a Lattice to the scene. In Object mode, go to the menu Add > Lattice
. Reshape the lattice so that it covers the part of the base meshes that you want to edit or all the meshes that you want to edit.
Go to the Object Data Properties panel, and increase the resolution as you wish. for most edits, 6-10 levels are fine.
Now select your base mesh(es). Add the Lattice modifier to the mesh then choose your Lattice in the Object option.
To apply this modifier to all base meshes, while still selecting this mesh, hold Ctrl
then select all the meshes that you want to edit, or hold Shift
then drag to select all the meshes that you want to edit. Click the drop-down menu arrow in the modifier, then click Copy to Selected
.
Go to edit mode, select vertices and start moving them around to edit your base mesh(es).
When you are done, you do not have to apply this modifier. As long as your export settings are correct, and you remember to delete all Shape keys, the changes will be applied automatically upon export. That's why this method will make all the changes non-destructive and you can revert to vanilla by toggling the modifier.
You can stack modifiers to make desired changes to your mesh(es).
The Mesh Deform modifier allows an arbitrary mesh (of any closed shape) to act as a deformation cage around another mesh. This method resolves many problems of the previous methods.
Pros:
Can edit as many meshes at once as you want, no matter what armature they are parented to.
100% Non-destructive sculpting.
No need to separate, rejoin, and rename meshes after sculpting is done.
Easier control than editing vertices of a lattice.
Allow symmetrical sculpting.
Edits can be stacked on top of each other by stacking modifiers.
Cons:
If you have a lot of meshes and the vertex count is relatively high, the waiting time to bind can be just a little long.
In this example, I will work with the head mesh (1 submesh) and the body mesh (10 submeshes).
In Object Mode, duplicate everything by right-clicking on the collections and hit Duplicate Collection
.
Still in Object Mode, select all the newly duplicated meshes and join them together by using hotkey Ctrl + J
or navigate to the menu > Object > Join
.
This mesh will be our cage mesh, we will use it as a proxy to make edits to the main meshes. Now we have to prepare it so that it works well as a cage.
Add a Remesh modifier to this mesh, use Voxel setting. Decrease the Voxel Size until the human shape is fairly recognizable but the mesh is not too high poly. Also, enable the Smooth Shading option. Below is my setting for this model.
Now, apply the modifier by hovering the mouse above it and using the hotkey Ctrl + A
, or click on the drop-down menu arrow and hit Apply.
Now we need to "bloat" the cage mesh so that it covers the whole base meshes. We will make use of the Shrink/Fatten function. You should toggle visible the base meshes along with this cage so it's easier to see. Switch to Edit Mode, and select all vertices by using the hotkey Ctrl + A
. Hold Alt + S
, then drag Left Mouse button
to fatten the whole mesh. For finer control, also hold Shift
while dragging it. Make sure that it completely engulfs the base meshes.
Switch back to Object Mode, select all the base meshes instead. Add a Mesh Deform modifier, then select the cage mesh in the Object option. Then select the drop-down menu arrow, click Copy to Selected to apply the same modifier to all base meshes. Then go to each meshes and click the button Bind to bind them to the cage. Depending on the complexity and vertices count, it can take anywhere from 1 to 30 seconds to finish binding.
You have finished binding all meshes to the base meshes. Now, all the editing you made to the cage mesh in Sculpting and Editing Mode will be reflected on the base meshes.
To see the edits easier, select the cage mesh, then go to Object properties. Scroll down to the Viewport Display setting menu, in the Display As option, chose Wire. This will render the cage as wire and you can see the vanilla meshes below as you edit.
Hint: to make symmetrical changes, enable the symmetrical editing in Sculpt Mode. If your cage doesn't cover the whole base meshes, you can add a Mirror Modifier to the cage mesh. It will be reflected on your base meshes as well.
After finishing sculpting, you don't have to apply the modifier to the base meshes. As long as your export settings are correct, and you remember to delete all Shape keys, the changes will be applied automatically upon export. That's why this method will make all the changes non-destructive and you can revert to vanilla by toggling the modifier.
You can cleverly combine these methods to make changes to your mesh as you desire.
If your problem isn't listed here, check Troubleshooting your mesh edits.
You need to delete the shapekeys.
How to run scripts in Blender
Published: Feb 08 2024 by manavortex Last documented edit: Feb 08 2024 by manavortex
This page will show you how to run Python scripts in Blender. It's not strictly speaking part of the Blender plugin, but I had to put this somewhere, and it's least out of place here.
To run scripts, you need to switch to the scripting perspective. Click the corresponding entry on the perspective toolbar at the very top:
The script panel looks like this:
Click into the Text Editor
panel directly below it
Paste the contents of whatever script you want to run (Hotkey: Ctrl+V
)
Hit the Play button above the editor panel to run the script (Hotkey: Alt+P
)
Optional: Look at the Python Console below the 3d viewport to see feedback
If your script doesn't work, Blender will have generated an . To look at it, toggle Blender's System Console:
Copy the contents of the console window, or pull it as big as your screen allows and take a screenshot. Give this information to the Netrunner who told you to run the script and watch as they fix it.
If you don't have a Netrunner (or if you are that person), this is where you hit up Google or ChatGPT (you can skip the steps 1-5 in the linked guide).
While you have text selected in the Blender System console, your Blender will be completely unresponsive.
How everything is connected, or: why your edited mesh moves weirdly
This page will give you a short explanation on why 3d objects are moving.
To learn what a rig even is, check Armatures: .rig files
Maybe you want the Weight Painting for Gonks guide?
For a documentation of the import/export options in Wolvenkit, check here.
Guides on how to transfer weights between rigs: blender plugin, youtube video, wiki page
The connection between a mesh and a rig is made via vertex groups. Any number of vertices can be assigned to a group, which is then matched to a rig's bone via name.
How much every bone influences the vertices is determined by vertex weight, which can be altered in Blender's Weight Paint perspective:
Vertex weights are assigned for every vertex group, and each vertex will move on the basis of the sum of all its weights.
To preview the deform in Blender, you can select the mesh's parent armature and enter the "Pose Mode". There, you can either apply an exported animation, or select individual bones and rotate/move them. The Armature modifier will morph your mesh according to the pose, letting you spot errors much faster than trying to debug them in-game.
You can see a video of the process here (courtesy of Vesna).
This page contains a theory part and a guide.
The guide section of this page has been created in the context of First Person Perspective Fixes: #editing-the-.mesh. It will show you how to split a mesh into submeshes (or how to alternatively delete these parts of the mesh).
If you run into problems, check Troubleshooting your mesh edits, or consult the .
For more information about this see Submeshes, Materials and Chunks and the section #submeshes-in-blender
To learn how you can use them for appearance management, check #chunkmasks-partially-hiding-meshes
For more information on splitting meshes, you can check this guide.
You have the Wolvenkit Blender IO Suite and a compatible version of Blender installed.
Open Blender and create a new General file.
Optional, but recommended: delete everything in the file. In the scene collection in the top right, right click on “Collection” and click “Delete Hierarchy,” as we don't need these.
Press File → Import → Cyberpunk GLTF and browse to your .glb file.
Import the file (default settings).
Directly after importing the mesh, Blender will be in Object Mode.
Your item should appear in the 3D viewport now. Use the camera controls to the left of the scene collection (or mouse/keyboard shortcuts if you're familiar with them) to get a better view of the item.
In the scene collection, find the newly-added collection and expand the armature
You will see the item's meshes (which correspond to Wolvenkit's submeshes as defined by name).
My jacket only has one submesh. Your item might have more.
In the scene collection, select all the submeshes of your item
click on the first, then shift-click on the last
Now, select the parts of your mesh that you want to split off (or delete). If you have never done that, read the section below before starting, as it can save you a lot of time.
Selecting with the shift
key held down will let you add to a selection. Holding the ctrl
key will let you subtract from it.
There are four select tools (hotkey to cycle them: w
), which you can select in the toolbar on the left by holding the first panel.
You can turn on x-ray mode (hotkey: alt+z
) to select things on both sides of the mesh
Keys on your numpad will set the cameera to e.g. profile or top view. Try around!
Switch to Edit Mode (keyboard shortcut: Tab
)
Click in the 3D viewport next to your mesh to deselect everything. Use the camera controls to get close to what you want to select. In my example, it's going to be the entire collar.
Start by selecting a single vertex on the part that you want to get rid of.
Press Ctrl + L (select linked)
If you're lucky, it will select what you want. If not, undo (shortcut: Ctrl+Z
) and select things by hand.
Once you have made your selection, decide how to proceed: either by #splitting-off-submeshes or by #deleting-vertices.
TODO: This needs a screenshot or two
Split
your selection (shortcut: P
)
You will now have (a) new mesh(es) in Blender. Those are your future new submeshes
Each will be named original_mesh_name.001
Rename each of them, following the naming schema from the original meshes:
The value for index corresponds to your submesh index in Wolvenkit, so this is how you can re-order them.
The number after LOD determines the level of detail of your mesh. By default, you will want to stick to 0.
After you have renamed all meshes, proceed to #exporting-from-blender.
This will irreversibly remove the corresponding geometry from the mesh. If you don't want that, see #splitting-off-submeshes instead.
At any point, you can press x
and select delete vertices
to remove parts of your mesh. In this example, we will delete the entire collar:
After your mesh is edited to your satisfaction:
If you're still in Edit mode: change back to object mode (shortcut: tab
)
The meshes should still be selected.
Hit File → Export → Cyberpunk GLB
Now, you can import your mesh into Wolvenkit.
A full walkthrough/tutorial of creating a simple bob hairstyle, completely from scratch, using the Hair Tool blender addon.
Created: July 21 2024 by @eagul
This guide will show you how to create your own hair in Blender from scratch.
Some familiarity with Blender and basic modeling skills. If you don't know how to Use Blender yet, check out and complete at least the donut tutorial!
The paid Blender AddOn Hair Tool (purchase it on )
Usefull links: Hair Tool discord server: Hair Tool official documentation:
You can download the example project !
Don't blindly copy the exact values I used, play around with them and see what works best for your hairstyle!
Using any modeling method you like, create a so called grid surface. This should have the topology of a plane (no holes, loops, etc). Mark the root edge sharp. Core concept: Keep the poly count low. The less 'control points' you have, the easier it is to control the object.
Open the HT panel (N), expand the Hair System, Sub-Systems and Deformers menus.
Press CTRL + Shift + H, then Transfer Hair system to Empty Curve. The hair object will now be a curves object parented to the grid surface.
Add the following deformers: - Align tilt to source surface - Mirror
Additionally, set the desired profile width in the Profile tab.
Add a 'Filter' Subsystem below the Grid Generator Subsystem. This subsystem allows you to add deformers to any curve object. It does not matter if curves are virtual or real.
A separate filter subsystem is created for the upcoming deformers. This is done so the first subsystem can be later baked separately from these deformers. It will facilitate manual edits, because there will be far less control points.
Add the following deformers: - Duplicate strands - Attach to surface - Mirror (hide it in the first subsystem)
In order to create a convincing mesh, you need to introduce some imperfections. In procedural HT, this is mostly accomplished by using randomizing input masks, and the noise deformer.
Add the following deformers: - Add Tilt - Noise Deform
It's a good practice to check the shaded look of the hair during modeling. This can for example help you spot clipping or thin areas, while also providing a more accurate visual representation of the final result.
Navigate to Render settings, select EEVEE, and enable Ambient Occlusion!
And now, you should have a decent preview of what you have created already :D Here, I added a Lenghten deformer to re-gain some of the length lost to UV transparency (which i forgot to account for before).
Duplicate the curve object you used for layer 1. Press the [2] indicated with the red circle. Do this for both subsystems! If you don't want profile data to remain linked, make profile data unique too. I will not be making profile data unique for this hair.
Hide the filter subsystem of the second layer.
Add the following deformers: - Slide Points - Push Out - Attach to Surface
Unhide the filter subsystem. Hide the mirror deformer in the first subsystem.
At this point, you are free to customize this layer however you like. These are the changes I made: - Increase the amount of strands generated from the grid - Randomize spacing of said strands to some degree - Increased random tilt to 15 degrees - Increased Noise Deform amplitude a bit - Slightly increased Lenghten, and added a random Trim deformer. Average length slightly increased. - Selected lower density UV boxes for this layer.
Optional, but if your poly limit allows for it, you can include additional layers for even more detail. Use similar techniques as described above to create those layers. I am adding 2 more layers, low density, with large push out values.
To create a fringe, you can simply repeat the same steps as for the main body of the hair, so create a grid surface and generate layers from it. However, for the purpose of showcasing HT's features, I will demonstrate a more manual approach to modeling hair.
Select the scalp mesh. Press Shift + A, add Curve > Empty Hair. Then, select Sculpt mode. In the top bar menu, change settings for Curve Shape. I used 0.05m and 5 points for this. Both can be changed easily later in edit mode. Place down a couple curves. Comb them into position using the appropriate brushes, using edit mode, or Hair Tool's modeling workspace.
Add the following deformers: - Align Tilt - Mirror - Radius set, and taper the roots (flip influence range arrow) - Optionally other procedural deformers, I added a Lenghten, but you can just as well simply edit the curves directly.
Then, duplicate the object, make subsystems unique, push it out using the deformer or manually do it, in order to create the next layer. It is inefficient to model every curve manually, so make use of the duplicate strands deformer, as showcased earlier in the procedural section.
Again, if your poly count allows, it's good to add some thin coverling layers on top, they will aid with realism and blend the fringe a bit better into the main part of the hair.
Any hairstyle will have some strands that cannot be tamed. Sometimes they are referred to as flyaways. When making the fringe, you can simply model them while making the final layers, because you are using real curves anyway. See image above.
After baking your subsystems, you can use any curve modeling tools to edit them further. HT's Hair Modeling is very well suited for this.
Add a couple extra strands to break up the flow, if desired.
Add some deformers to the strands, be creative!
What are Dangle Bones, and how do they work?
Created by @eagul Published March 20 2023
This guide will teach you everything you need to know about dangle bones, focussing mostly on hair meshes. However, dangle bones can also be applied to any other mesh
Assumed skill level: - You are familiar with Wolvenkit and Blender. - You know what bones and weights are. - You are able to read and comprehend instructions.
Dangle bones are a 'chain' of linked bones which are used by the game engine to simulate physics (dangle). They're found mostly in hairs, but also in certain clothing items. For a mesh to have working dangle physics, corresponding .rig and .animgraph files are also needed The image below depicts how a dangle skeleton looks. The .animgraph will move the dangle bone chains, which are connected to the mesh using weights, which will then in turn animate the mesh.
The easiest way to add physics to a mesh that does not have them, is to transfer them from another mesh. If you are doing a hair port, prepare the (static) .mesh and textures first. 1) Locate a 'donor' mesh. It should have a similar mesh, and physics that you could also see working on your 'new' mesh. 2) Add both the donor mesh, together with it's .rig and .animgraph pair, and your new mesh to the project in wolvenkit. 3) Import both meshes to blender. 4) Using alt+P, clear the parent of the new mesh. Now select the new mesh, and then the armature of the donor mesh, and press ctrl+P, followed by Armature Deform with Empty Groups. 5) Select the donor mesh, and secondly the new mesh. Swap to weight paint mode. In the top-left cornet, press 'weights' and then 'transfer weights'. In the bottom-left corner, a small black window will appear. Click it. Set Vertex Mapping to nearest face interpolated, and source layers to 'by name' 6) Go into weight paint mode and manually clean up the weights, using the weight transfer as a reference. Optionally duplicate the mesh and move the copy to the side, so you keep an untouched reference. 7) Import it back into wolvenkit, and you're done!
1) Oftentimes, you can get away with editing a hair mesh, and not having to touch the physics at all, especially if the changes you are making are fairly small. 2) If you move the mesh away from the bones, it might move in unexpected ways. The further the mesh is from the bone, the more of a 'lever' effect will happen. This is particularly noticable when bones are rotating around an axis perpendicular to the one you moved the mesh away on. Usually small movements are fine and will not affect the dangles in a noticably bad way. If you do find yourself in a situation where you need to move the skeleton as well, check the 'Moving a Dangle Chain' section. 3) Check out UUH4V. It's an amazing resource that will allow you to load multiple hair meshes with each their own rig/anim pair simultanously. Keep in mind that you cannot have 2 of the same rig/anim pair loaded in the same hair slot simultanously, as this will cause unacceptable deforms. You need to merge any 2 meshes that use the same rig/anim pair in blender and import them as one .mesh.
Included is an image of what i mean by the leverage effect. I used a handy little trick here to make bones visible in-game. Overlay a simple mesh over each of the bones in blender and weight paint it completely red. Load the boxes instead of a hair mesh. Edit the material used by the mesh to make it better visible. I used plastic_red here. Congratulations, you can now clearly see what bones are doing in-game. Hiding the body mesh helps with visibility. Green circle includes the true location of the dangle bone chain. Meshes in the yellow circle are rigged to the same bones as those in the green circle. Bone 3 is invisible. Upon moving bone 3 to the right (by editing the .rig), bone/mesh 1 rotated slightly, making mesh 2 do a huge leap. If you were to load a hair mesh in the same location as indicated by the yellow circle, you would end up with horrible stretching and deformations, even without exxagerating the effect by moving bone 3.
Created by @eagul Published March 20 2023
This guide will go deep into detail about moving dangle bones. Still unknown: changing bone parenting, rotating bones, editing the animgraph physics, adding new mirrored dangle chains for better coverage. If anyone has done tests on any of these topics, please contact me.
Assumed skill level: - You understand what you are doing, and know why you need to move dangle bones - You are able to read and comprehend instructions.
Okay.... Let's get started. If you are doing physics stuff, and need to move the dangle bones to fix the leverage effect, or for any other reason, you are in the right place. I will be using my long hair dangles project for examples here. Read 'Leverage effect' section in 'Dangle Bones' page for the reasoning behind why this process is necessary. (Using a normal hair dangle skeleton is not an option because it is parented to the 'head' bone, which causes horrible clipping and unnatural movements when the head turns. It might be possible to change the parenting to spine3 bone, but i have yet to test. Even if it is possible, the process described below would still be usefull to move the chains into the right positions) You will need to do a couple things: 1) Get everything into blender. 2) Isolate the bones you need to move. Hide other bones in armature edit mode. 3) Duplicate the bones and move them to the desired position. 4) Edit the bone positions in both the .mesh and .rig, sometimes editing the collision hitboxes in the .animgraph will also be required. I would also recommend having a rigged and weight painted mesh ready, for testing purposes. I will explain each step of the process more in-detail below.
Usually, you can get the skeleton in it's real form into blender by using WithRig export on the mesh. However, if the .mesh contains bones that are not present in the .rig, you will need to use MultiMesh Export. You need to find a second (or even more) .rig file, so all the bones that are present in the mesh have a counterpart in the .rig. You then need to also add the meshes that correspond to the new .rigs and then export. Attached images show settings i used to export base\characters\garment\citizen_formal\torso\t1_072_shirt__netwatch\t1_072_ma_shirt__netwatch_dangle.mesh with rig, which i used for long hair dangles.
Open the .rig file in Wolvenkit. Under boneNames you can find which index corresponds to which bone. Expand boneTransforms. Locate the bones you want to move. Moving a bone in a chain will also move every bone that's parented to it (located lower than it in the chain). In the case of the image above, moving the bone selected in yellow, also moved the entire chain. In this case i moved bone 8 (selected in yellow) by 0.283076668 on the Y axis.
As you can see, the skeleton exploded. This is (to my understanding) caused by collision hitboxes on the spine bones. It will only happen if you have moved the dangle chain inside of those hitboxes. If this happens to your skeleton/mesh, follow these steps to fix it: 1) Open the .animgraph file in Wolvenkit. Expand the 'rootNode' array, and keep expanding untill you see collisionRoundedShape and then lower the roundedCornerRadius for each of the bones untill your skeleton no longer explodes. Here i set the value to 0, the animations work fine, but a correctly set value might reduce clipping in some poses.
Notice how editing the bone positions in the .rig also deformed/moved the mesh in-game. At least it's dangling nicely now, and it no longer explodes :copium:
The .mesh also contains bone matrices. To my understanding, these are used to map the bones from the .rig to the vertices. You will need to move the bones in the .mesh to match the changes You did to the .rig skeleton, and this will fix the mesh deform. In this case, I'm editing bones 79-83. The goal is to move each of them by -0.283076668 on the Y axis. Open the .mesh in Wolvenkit and navigate to boneRigMatrices.
Notice how the bottom row of the inverse matrix corresponds to the coordinates of the bone, which you can see in Blender.
Next, copy the new Y coordinate from the bone you duplicated and moved.
After that, return to the calculator, and press 'Insert in B', and then replace the matrix entry corresponding to the Y position of the bone with the new coordinate.
Then, press 'inverse'
Next, press the 3 small lines below the output, click on Show LaTeX, and copy the top row entries back into wolvenkit.
And now repeat all of those steps for each of your bones... enjoy... After that, you should be finished!
When you can't import, or your imported mesh looks weird
For a guide on exporting and importing meshes, check
If you don't know how to begin editing, check or
We need to troubleshoot your import.
Yes: The problem is somewhere else, the mesh import works fine.
No:
Yes: Here's where your problem is. Make the error message go away by checking the rest of this guide.
No:
In Blender, check your shapekey section. It should look like the green box (or be empty).
You get an error message like this:
Message: One or more Geometry in provided GLTF doesn't contain Tangents data. Tangents must be included within glTF files.
Alternatively, you can check by hand:
The neutral bone is created by the glb export plugin when there are vertex groups without a parent bone. WolvenKit will not let you import if there is a mismatch.
Your armature in Blender needs to have a bone for every vertex group in the submesh, and there must not be vertices with no vertex group assigned.
The following two scripts help you finding and/or fixing the problem. Switch to the Blender Scripting perspective and create a new, blank text file. Then, toggle the Blender system console to see their output (Blender: Window -> Toggle System Console)
Missing bones
Vertices without weights
Since noesis expects differently-named submeshes under the root armature, you'll want to export the mesh via noesis, join your changed meshes on those under Noesis_Root, and import it again. Caution: You'll have to rotate your armature in this case.
While this will get your mesh into the game, the missing bones mean that parts of it won't move the way you expect it!
The armature from the following mesh has a lot of bones and will often resolve most of your issues:
To create more submeshes, you can either
create more submeshes with the correct naming in Blender, e.g. submesh_01_LOD_1
, submesh_02_LOD_1
If you end up with missing bones,
It's time to play 3d puzzle and assemble bones from multiple sources. Unfortunately, there is no simple solution for this yet. You need to
find the bones that your armature is missing in other meshes
export all the extra meshes into Blender
and finally reimport everything back into Cyberpunk.
WolvenKit will not import a mesh that has any kind of issues. Those include, but are not limited to:
non-flat faces
zero faces/edges
loose vertices/edges
There is no guarantee that any of the steps below will actually solve your problem.
In Edit Mode, you can find a few commands in the Mesh -> Clean Up menu:
Delete Loose
Split Non-Planar Faces
Split Concave Faces
Merge By Distance
If you select your whole mesh, Merge By Distance will merge the individual parts, obliterating the seams. To avoid that, make sure to do them one after another: - Select a vertex/edge/face in Edit Mode - hold down Ctrl Num+ to select everything connected - use Merge By Distance before proceeding to the next part of your mesh
Fortunately, the tool is free, easy-to-use and already included in your Blender.
If you don't have a 3d print entry in the tools of your 3d viewport, you might need to enable the plugin in Blender's settings first.
Zero Edges: Those are bad, fix them (click on them, then press X and just delete them)
Non-Flat Faces: Those are even worse, as they can make the game crash. You need to split them up until they are flat, or investigate the surrounding edges/vertices to see what's going wrong here.
Zero Faces: Only fix if you have <100 of them — the tool doesn't always identify them correctly (the mesh analyzed above was h0_000_pwa_c__basehead
, which is absolutely fine).
make sure that you have exactly one UV map
check Face Orientation — most materials won't show backfaces (red). You can import submeshes with the suffix _doubled
to make WolvenKit generate them for you, like it does with hair.
When saving your mesh, check the console for errors. In version >= 8.9.0, a basic material validation is taking place. If you don't see any warnings, make sure that the resource paths in your mesh are correct and that you aren't loading invisible textures.
Do they show up in the Wolvenkit preview?
For example, you have moved something, but the change doesn't show in the game: this most often happens when you change things around in edit mode, since they are stored as object properties rather than applied immediately.
Select the object in edit mode
Press Ctrl+A
Select "All Transforms" to apply all transformations.
E.g. you've changed a shape, but now everything moves at an offset.
Check the renderMask
attribute inside heder / renderChunkInfos / index
. For shadow meshes, there shouldn't be anything but MCF_RenderInShadows
.
The textures are most likely embedded. Here's how you can force your material to pull in external textures instead:
This section will tell you how to delete garment support. If you don't want that (you shouldn't! It's cool!), check the next section.
Check the component's id in the mesh .ent
or .app
appearance's components
array:
If any given ID is equipped twice, it can break garment support in the way you're observing.
As of January 03 2023, we don't know how these are generated and can't tech the problem away in Wolvenkit. Your only choice here is to manually randomize your ID in a text editor by switching out single digits. Remember that the resulting ID needs to be an even number!
How to export and import meshes (WolvenKit <=> Blender)
Created by @manavortex Published November 05 2022
This guide will show you how to - export meshes from the game for use in other projects - import those meshes back into WolvenKit
Assumed skill level: You are able to read ;)
Would you rather…
This page is archived. Please scroll to the top for links to more recent information.
Before you start editing, a warning:
If the export fails, try unchecking the following properties in the export settings (you have to do this for each individual mesh)
Export Materials
Export Garment Support
Assuming you are exporting t2_002_pwa_vest__puffy.mesh
, WolvenKit will do the following:
Path of mesh: <yourModDir>\source\
archive
\base\characters\garment\player_equipment\torso\t2_002_vest__puffy\t2_002_pwa_vest__puffy.mesh
Path of glb: <yourModDir>\source\
raw
\base\characters\garment\player_equipment\torso\t2_002_vest__puffy\t2_002_pwa_vest__puffy.glb
For historical reasons, the box below holds the minimum steps to export via the vanilla Blender plugin. You shouldn't want to do that.
This page is archived. Please scroll to the top for links to more recent information.
WolvenKit will map any *.glb file under raw
to the mesh with the same name under source
.
Example:
<yourModDir>\archive\raw\base\characters\garment\player_equipment\torso\t2_002_vest__puffy\t2_002_pwa_vest__puffy.glb
will be imported over
<yourModDir>\archive\source\base\characters\garment\player_equipment\torso\t2_002_vest__puffy\t2_002_pwa_vest__puffy.mesh
Normally, a mesh's backfaces are invisible/transparent - you aren't supposed to see a mesh from below, so it doesn't matter. But some, like hair and eyelashes, are different, and need to be doubled.
When importing via Noesis, you need to do this by hand: duplicate all the vertices in the mesh, and flip the normals. When importing via WolvenKit, it will automagically do that for you if a mesh name ends with _doubled.
The suffix also indicates that Wolvenkit de-duplicated a mesh on export!
Guide to creating neon signs from 2d textures
Published August 2023 by Last documented update: March 18 2024 by
This guide will take you through the steps of replacing one of Cyberpunk's neon signs with a custom mesh.
If you want, you can then turn your replacers into new for AMM!
To learn how material assignment works, check and its sub-page
To learn more on how materials in general work, read
For a guide on changing an existing mesh, read
You need the following software:
Software | What's it for? |
---|
Start with an image. We're aiming for our own neon sign here, and we'll aassign the colours later in Wolvenkit, so make sure that it is something with clean lines and good contrasts. I'll use this:
Make sure that your image is as clean as possible. I can't stress this enough – any rough or fuzzy edges will result in extra geometry, making the cleanup in Blender much harder.
Open Inkscape and create a new document
Select File -> Import and import your .png from step 0
Make sure that your image is selected (click on it if you're not sure, it will have that resizing handle)
From the menu, select Path -> Trace Bitmap (it doesn't have to be a bitmap)
Press the Apply button at the bottom
Your new traced path will be auto-selected for you.
Select File -> Save As and save it as an *.svg file.
Time to switch to Blender to turn it into a mesh!
In Blender, select File -> Import -> Scalable Vector Graphic (SVG)
Import your SVG. It will show up as solid black:
With an active selection, find the curve properties panel in the bottom right (the green icon).
In the "Geometry" section and find "Extrude".
Set it to something like 0.001 — play around with it until your mesh is appropriately extruded.
Do not bevel it! We want the corners nice and sharp, we can always make it round l,ater.
Once you're satisfied, transform the curve into a mesh: Object -> Convert -> Mesh
We're now leaving the previous guide.
Scale, rotate, and move your curve to the centre of the viewport
Fix rotation: Press R
-> X
-> 90
Fix scale: Press S
and move the mouse
Fix position:
Press G
-> Z
to move the mesh up and down
Press G
-> X
to move the mesh left and right
You don't need to move it on the y axis
Apply transformations: Press Ctrl+A
-> T
Switch to the "Modifiers" tab in the sidebar panel on the right (the wrench, below the one highlighted in the screenshot above)
From the dropdown, select Generate -> Remesh
Your mesh will be a black box now. Don't panic, we'll fix this by setting the modifier proprerties:
Switch back to Object Mode (press Tab) and apply the modifier. The result should be something like this:
Now, triangulate: switch to edit mode, select everything, and press Ctrl+T. It's necessary for the Cyberpunk reimport.
For better results, I cheated: I split off the ghosts' eyes, the ghosts themselves and Pacman, and used Quad Remesher on each of them. This guide will show you the basics, you can make prettier meshes on your own later once you got it to work.
Switch to the Object Data Properties in the right sidebar, fold out "UV Maps" and click the + button. This is necessary for material projection, and Wolvenkit won't let you import if you didn't do it.
Rename your original mesh to submesh_00_LOD_1
— we need that for the import in Wolvenkit.
You can assign one material per submesh. To split off a part of the mesh,
Change back to Edit Mode
Turn on X-Ray (Alt+Z) and select the shape that you want to split off
Press P
-> S
(Split -> Selection)
Rinse and repeat until you have all the submeshes split off
Time to pull up Wolvenkit.
You can obviously use any kind of mesh or material here!
I'll be replacing base\environment\decoration\advertising\signage\sex_shop_neon_sign\sex_shop_neon_sign_b.mesh
, the heart-shaped ad banner.
Decide on a mesh and add it to your project.
In the project explorer, right-click on the exported file (sex_shop_neon_sign_b.glb
) and select Show in Windows Explorer, because we will now overwrite this file in Blender.
In Blender,
select all the meshes that you want included (in Object Mode)
Open sex_shop_neon_sign_b.mesh
in Wolvenkit and open the appearance on
(as this is the one they're using on Jig Jig Street).
At the very top of the mesh, we'll need to change the chunkMaterials
as follows:
Now, we define the materials:
Find the array materialEntries
Add four new entries (or duplicate one four times, or…)
Name each item according to the entries in the previous step
Make sure that their index
property is unique and corresponds to their array position.
… and finally, we actually add the materials.
Find and expand the array localMaterialBuffer
and its child materials
Copy the second entry, sex_shop_neon_sign_emissive_red_on
via right-click menu
paste it into materials
Duplicate it three more times
In the new material entries, find the property ColorOneStart
and change it in the side panel.
Repeat for each material, then save the mesh.
Let's hit up Jig Jig Street to look at our sign…
Congratulations! If everything works, you just made a mod!
There is really very little that can go wrong here if you closely follow this guide.
Adding garment support to a mesh that doesn't have it
Created on: 29. 12. 2023 by Last documented update: Nov 10 by and
This guide will teach you how to add garment support to a mesh that doesn't have any.
To learn what garment support is, check
For general Blender editing tips, check
You should know what , because it won't be explained here.
This guide assumes that you know your way around in WolvenKit. If you don't and you want to mess with this, kudos — I salute your frustration tolerance. In this case, the wiki's search function will be your new best friend.
As a preparation for our garment support, we need a base that we'll shrinkwrap to. For this guide, we'll be using the full player body in a single mesh.
You need the following files:
In the viewport, click anywhere to deselect everything
Press A
to select everything visible again
Shift-click on something (e.g. the head) to deselect it
Shift-click again to re-select it (you need a most recent selection)
Press Ctrl+J
to join all those meshes together
Optional: Clean up
In the outliner on the right, delete all empty collections
Double-click on your mesh and rename it to something, e.g. body
You should be looking at something like this:
This is the base that your items will shrink to, thus not-clipping. Neat, isn't it?
You only need this if you're layering garment support — for example, shrinking a custom-made decal under a jacket. Don't do this with the base body, it will shrink on its own to stay underneath the clothes!
If you're using a custom mesh as the base, you need two prerequisites:
Join everything, so that you have only one mesh. This mesh must cover everything that yours can potentially shrink to - if you fit the Netrunnner suit without the head mesh as part of the body, the collar will clip into the neck when you're wearing a coat
You need to activate garment support on the mesh. You do this by switching to the Data tab and setting its Value
to 1:
Import a mesh that needs garment support. In Object mode, select it by clicking on it so that it has a yellow outline like the body in the picture above, and switch to the Data
tab on the right:
The Shape Keys
dropdown should be empty. (Otherwise, hit the -
button until it is).
Click on the +
button to create a shape key with the name Basis
. This is the garment's original shape and will tell Cyberpunk how it looks when it's not squished.
Repeat this process for every submesh (submesh_01_LOD_1
and submesh_02_LOD_1
on the screenshot above)
Switch to the Modifiers
tab (the blue wrench icon, it's active in the first screenshot)
Add a shrinkwrap
modifier
Target it to the mesh from the previous step (e.g. body
):
optional: Add a small offset
(e.g. 0.001
) to make it not-clip. If the mesh you're shrinking to has garment support and you haven't enabled it, this isn't necessary.
You will now see that the garment has shrunk down to the body's dimensions — this is how the game avoids clipping.
Apply the modifier as shapekey:
You will now see that the garment un-shrinks itself: that is because the shapekey isn't active.
Switch to the Data
tab again (the green triangle). There is a new shapekey now; it's called Shrinkwrap
.
If you want to see it in action, set its Value
to 1.
Rename it to GarmentSupport
(capital G and S, no spaces — double-click on the name):
That's it, your mesh has now garment support. Rinse and repeat the process with the other submeshes, then export everything back.
Try re-doing the shrinkwrap, but with a higher offset instead. Try something like 0.002 or so, whatever works for you.
What is Garment Support and how does it work?
This page will teach you how garmentSupport works – the system that Cyberpunk2077 uses to tuck pants into boots and shirts under jackets. It contains theory, which you don't need to understand to use the system.
Credit goes to psiberx ( with initial explanation of the algorithm), island dancer for providing screenshots and know-how, and Auska for making morphtarget/garmentSupport import able in Wolvenkit.
If you want to create garment support, check
If you want to use garment support in an existing mod, you only need to use
If your garment support is shrinking too far, check the section for
If you have other problems, see at the end of the page.
The engine morphs garments to avoid clipping — for example, if you equip a pair of boots and V's jeans no longer cover the shoes, but get tucked under.
This process is accomplished via 'parameters' on the mesh:
GarmentSupport only works on actual garment items that have been equipped using the game's transaction system. As of October 2024, that's not the case for NPCs. You'll have to go refitting!
Garment support will be applied based on garmentScore. For this, the prefix of the component name will be considered (components are named in your .app or .ent file's component array).
The prefixes are as follows:
TL;DR: High garment score means "on top", items below will get squished.
Components with the same prefix in the same .ent file will not squish each other, e.g. l1_stockings
and l1_pants will not deform each other, but they will deform s1_socks
The game calculates the garment score by checking the prefix of component names, where the one with the lowest prefix is the innermost:
After considering the component name, the game will consider the tags in the .ent's visualTagSchema
:
An example for t0_000_pma_base__full
(the default body component, torso+legs):
based on experimental research by revenantFun
Make sure that you have the parameters _GarmentSupportWeight
, _GarmentSupportCap
and Col
, and that all of them are in the format Face Corner > Byte Color
_GarmentSupportWeight
: Vertex paint it red (RGB 1, 0, 0)
_GarmentSupportCap
: Vertex paint it black (RGB 0, 0, 0) if it isn't
Col
: Vertex paint it black (RGB 0, 0, 0) if it isn't
You're done!
In a given mesh, garment support is handled by two color attributes: _GarmentSupportWeight and
_GarmentSupportCap
. In Blender, these are found in the Data
panel under Color Attributes
, together with the third attribute, Col
.
For exporting, all three of these must be in the format Face Corner > Byte Color
Here's how it looks like:
If you are editing vanilla items, you may find parameters of the type Vertex -> Byte Color
with their names in ALL CAPS, such as _GARMENTSUPPORTWEIGHT
and _GARMENTSUPPORTCAP
. Delete them by selecting them and clicking the minus icon:
It's crucial to repeat this process for every submesh in your garment, or your attributes will not get written correctly on export.
If all you're doing is trying to preserve existing garment support before doing some light editing or refits on vanilla garments, you can stop right here!
If you're making a brand new item and making your garment support from scratch, however, you'll need to keep reading to find out how these parameters should look.
Garment support color attributes are edited in Vertex Paint
mode in the viewport:
_GarmentSupportWeight
This attribute affects how the mesh behaves when layered with other garments:
Simple base game clothing will have a flat red layer. If you have a flat black layer, you may want to paint it red, as this will deform more than you might want.
_GarmentSupportCap
_GarmentSupportCap
determines stopping points for the deformation effects of garment support. Like _GarmentSupportWeight
, it is painted only with red and black.
With vanilla items, you will see red GarmentSupportCap on areas that will either
directly intersect with the body (the ends of sleeves and legs, the bottom of a shirt, the opening of a turtleneck...)
sit right above something that shouldn't be deformed (the player body, or a tight-fitting shirt, or the lapels of an open jacket)
The cap provides a shrinking limit, so without GarmentSupportCap, every part of your mesh will apply shrinking/tucking on the meshes layered "below".
Often, this is completely okay and your _GarmentSupportCap
layer can be flat black. Otherwise, you need to paint red those parts which either cut straight through the body or butt right up against other items.
If this step is skipped, you can have unexpected clipping, but nothing will break. If your mesh seems like it's being too aggressive when you layer it over other things, and leaving holes in whatever you're trying to layer under it, try painting more of the inside faces red.
The simplest way to add functioning garment support to your custom item is to have a flat red _GarmentSupportWeight
attribute, a flat black _GarmentSupportCap
attribute, and a flat black Col
attribute. Your mesh will export and, assuming you have the proper shapekeys, will morph in (more or less) the way you'd expect! The next page will outline this process step-by-step.
Every submesh of your garment must have these three attributes in order for garment support to function correctly - even submeshes that contain non-deformable things like accessories, buckles, chains, belts, etc.
It's not doing that to spite you. Most likely, you have a non-unique component ID, and the game can't tell the two items apart. Here's how to resolve that:
This wil prevent your garment from shrinking under other, "larger" garments, and practically guarantee that it clips.
This is where you switch the active 3d object. The other modes only work on the current selection. Read below for more detes.
Lets you alter the objects 3d data by moving pixels around. Read below for more detes.
Only available when you have an armature (rig, skeleton) selected. This is where you .
You usually don't need this! Sculpt the mesh as if it's clay. Requires you to delete shapekeys, and leads to bad topologies. Proportional Editing is much better. See => .
Lets you create Vertex Paint Data. You only need this for (so as a beginner, stay away from it)
Weights determine how an object moves with the armature. Everyone hates it, but you can usually get around weight painting by simply from an in-game item.
"We have at home!" It's free, it's 3d, but using it sucks. Before switching to Substance Painter, I painted in photoshop and used it just for positioning/rough guidelines.
Click on the "New Text" button to create a new document:
Overwrite the .glb file that you imported, so that you can import it with Wolvenkit. If you are considering to do something else instead:
Shrinkwrap the sharp edge to the scalp mesh. Use a Mirror Modifier. Hair Tool has ways to break up the symmetry. It is best to only have a single grid surface per hair system. One half of a grid can still affect curves which are not generated from it, and this can cause issues. Subdivision surface modifier can be used. I model by simply extruding edges, and some sculpt mode mixed in. Loop Tools addon is good for cleanup ('relax'). Set Viewport display to 'Wire'. You can change the opacity in viewport overlays menu, and assign random colors in shading menu.
You can set 'Mean Vertex Crease to 1 on specific edge loops, if you want them to remain sharp while using a subdiv modifier.
When building hair card meshes, you want bottom layers to be opaque, and surface layers to be progressively more transparent. The bottom layers will prevent the scalp from shining through, while the covering layers will provide a volumetric effect, and hide the sharp contours of high-alpha bottom layers. Here is an example of a hair texture. Notice multiple strands, which become more and more transparent the further to the right they are.
The Add Tilt deformer with a randomize input mask is capable of... you guessed it... adding... a random tilt... to individual strands... Press the downward arrow right of the tilt value to randomize said value.
For this hair, I will be using a fairly low random tilt, to have a straight, and neat hair look. For messier hairstyles, or more outside layers, a higher tilt value can be beneficial.
Slide points will give you more curve resolution towards eighter end of the strands. Here we need a bit more points at the roots.
Hair Tool introduces a whole curve modeling workspace, with a couple unique tools, which greatly facilitate manually editing curves. Documentation:
Next, open and copy paste each of the entries of the bone matrix into the calculator. Then press inverse.
If it does not, you need to apply any extra shapekeys, because Wolvenkit will ignore them on reimport. Expand the box below, or check to find out how.
Quick, easy, recommended: the plugin will tell you exactly what's broken and how to fix it. Download it .
Check your export settings and make sure that you have the correct box checked upon export:
If the error persists, check that each of your submeshes has an UV map: If not, you have to create one (and probably UV unwrap your mesh).
You then need to import over an which supports all those bones.
Optional: To find which bones you're missing, you can use , which will print their names to console. You can also skip this step and try the troubleshooting below.
You can use the 's to Group Ungroup Verts
— if you're lucky, that will solve the problem.
You can find a that will drop unused bones and vertex groups. Run it in Blender's Scripting Perspective with your armature
You can , which will not do any of these checks. For that, you need to import/export via .fbx.
Try using the Netrunner body as a base for import. You can use Wolvenkit's feature for this.
Try the import setting
transfer them into your import target mesh (guide on )
, which you should do with the linked Python script
Your last option is the to (hopefully) find out what is wrong with your mesh.
No: you probably forgot to select them when . Make sure that you get them all into Wolvenkit.
Yes: There's either an issue with your or with your . Refer to the corresponding guides to learn how you can debug this.
Some meshes require an entAnimatedComponent along with the garment's component. Check for details.
As stated in the , it is easy to fuck up the mesh's properties, and this is most likely what happened. The easiest way to "fix" this is to apply your shape deformation to the original object.
Import the original object into Blender, without any of your changes. If you have to, reexport the working file from Wolvenkit.
See on the page
If you have via or with something that belongs in a different slot (e.g. a jacket on the head slot), you might have to fix the corresponding entity file.
To check if it's this, equip only the edited item. If it breaks as soon as you put on another clothing item with , then the solution below applies.
On the .glb import setting, check the box.
Make sure to with garment support enabled. If that doesn't do the trick, you can try the garment support shapekeys in Blender.
As of November 2023, the recommended workflow is using the . Check its import/export documentation under .
It will not show you anything else. For other use cases like exporting characters, please check
Tool | Tool version |
---|
Import/Export to fbx ?
Use the ?
Read more about ?
without editing them?
Export or ?
In the dawn of modding, Wolvenkit just plain couldn't import or export .mesh files and you had to use . In 2023, you won't need that anymore. We're keeping the documentation for the sake of completeness and downward compatibility, but in general, you don't need it anymore.
It is easy to beyond the point of repair. Make frequent back-ups, and continuously test if your altered mesh still imports and displays in WolvenKit, especially when editing vertices!
Select your mesh in Wolvenkit: and click Export/Process Selected
, or simply use Export/Process All.
You should now havemeshName.glb
in your WKit project's
Wolvenkit > 8.8 will by default export with materials for the .
Some meshes (such as eyelashes and hair) are two-sided. See for details on how Wolvenkit handles that.
Please follow the 's instructions for.
If you are following a guide with pre-made resources and it tells you to you'll want to follow the advice, as the elements in the exported structure will have different names.
Alternatively, you can run on your blend file, which will automatically fix that for you.
In Blender, you should have overwritten your previously exported glb. With WKit's , you can now simply Import
it back in.
WolvenKit refuses to import if the target mesh doesn't support all bones in the glb or if your mesh's topology became corrupted. If that's the case, check the .
If your mesh won't export from Wolvenkit, try exporting it by unchecking the box.
For a list of troubleshooting steps, check the .
I started by following , but I'll write you a TL;DR
Pick your options in the right-hand panel. I won't cover them in detail here, check the or noodle around until the result looks OK.
For this, I've originally followed guide, but here's a TL;DR for you again:
You will get much better results with the Blender AddOn QuadRemesher; however, after the first 30 days it costs money. You can download a trial version .
Let's reduce poly count and clean up our mesh. For a detailed guide, see , I'm going to give you a TL;DR again:
Setting | Value | explanation |
---|
Assuming you have Wolvenkit , you can now . Let's find ourselves an in-game neon sign to replace by searching in the Asset Browser for neon > .mesh
and scrolling through the entries until we find one that we like.
use the to the file from the previous step.
In Wolvenkit, use the to import sex_shop_neon_sign_b.glb
. The preview in the File Information
panel should update.
I'll give the TL;DR version, you should be able to follow along. If not, feel free to read up on or find us on !
To learn more about this, check . This is not necessary for completing this guide.
In Wolvenkit's top bar, select and then boot up Cyberpunk.
Please remember that you are currently replacing all heart neon signs in the entire game! Before sharing your custom neon, consider making !
That's A-OK, but exceeds the scope of this guide. Fortunately, you can just head over to and proceed from there.
If you can't export your mesh from Blender or import it into Wolvenkit, make a cube (right-click into the viewport, Add
, select Cube
. Before you get hung up on this step and burn out, let's add a few cubes to the game to give you a success. After that, you can hit us up on in the #textures-and-models
so we can fix your mesh.
Check the pages or find us on . :)
all those meshes to Blender, then join them all into a single mesh:
You still need to use for garmentSupport to become active. If that wasn't it, check your shapekey names for typos or trailing spaces.
A high garment score means that the item is "on top", squishing anything worn "below". (See for details.)
Colour | RGB value | Explanation |
---|
Colour | RGB value | Explanation |
---|
Check — paint it red, baby!
Make sure that your mesh has the property checked (this should be default by now).
If that doesn't work, you still have the option to re-create in Blender
If you're fed up with this shit and just want your item to stop cosplaying as exploding pixel cloud, you can use .
Mode | sharp | Remesh type: preserving sharp edges |
Octree Depth | 8 | Level of detail |
Scale | 0.1 | Size of quads in the remeshed object |
Sharpness | 1 | Preserve sharp edges |
h0_ t0_ s0_ l0_ ... | Any component with a 0 in its prefix will be treated like a body mesh (no deform/squishing of any meshes with x0_ prefixes across .ent files) |
h1_ | Head inner (mask, sunglasses) |
h2_ | Head outer (helmet, bandana) |
t1_ | Torso inner (shirts) |
t2_ | Torso outer (jackets, coats...) |
s1_ | Shoes |
l1_ | legs (pants that aren't leggins) |
Black | 0, 0, 0 | heavy deform, lots of squishing (default behaviour) |
Red | 1, 0, 0 | light deform, no squishing |
Black | 0, 0, 0 | no garment cap |
Red | 1, 0, 0 | limited GS influence on the meshes below (more red = less squishing). The garment itself will serve as a delimiter. |
>= 8.8.0 (8.7.0 works, but has a slightly different UI) |
>= 3.1 stable |
>= 1.1.0 |
Converting your picture into an svg which you can then import into Blender to create a mesh |
converting your mesh to an in-game-item |
Converting your SVG to a 3d object that you can import into Cyberpunk. |
Exporting from Blender to Cyberpunk |
>= 8.15 | You can't make mods without Wolvenkit |
>= 4.2 | 3d editing software |
The Wolvenkit Blender Addon. You can't import/export to Blender without it. |
How to check weights directly in Blender
Created: ??? by PinkyDude 🦝 Last documented edit: Sep 22 2024 by manavortex
This guide will show you Pinky's weight painting workflow, sharing tips and tricks on how to fix weights on garments for both refits and custom ports. You can find the original tutorial on Google Docs.
This guide will use a masc garment, but the process works the same regardless of rig or body type.
For porting objects altogether, see Porting 3d objects to Cyberpunk
For help with refitting, see R&R: Refitting (step by step)
For converting between bodies, see RIG Swapping Garments - other body conversion
For this guide, you need:
Tool | Version |
---|---|
You also need a Wolvenkit project with an item where you want to fix the weights.
For this example, I’ll be starting the weight from scratch for my Tracksuit Jacket:
It's best practice to stealcopy the weights from an existing in-game item.
A good candidate is the tight version of T-Bug's netrunner suit, as it has the required bones for almost everything:
Add the correct version for your body gender to your Wolvenkit project.
Since this is a jacket, using the Netrunner Suit will result in useless leg bones. That's not a problem, but you can use a different mesh, if you want.
If you are changing the weights of an existing or ported item, you might run into export errors in Blender. We'll fix these when we get there.
It is really tight. This has a few nice side effects:
If it clips, it will clip into the body — that is perfect for weights!
It will avoid "bat wings" around the armpits, where parts of the sleeves or sides will stretch next to the chest
Unfortunately, a perfect fit does (usually) not exist. But don't worry, we can fix this!
Export the Netrunner suit to glb
Import it into your Blend file
You'll notice it has 3 submeshes. Merge them into a single submesh:
Click into the viewport to deselect everything
Hold the shift
key and click on each of the three meshes
Press Ctrl+J
If your refitted garment is already broken down into multiple submeshes, you’ll have to do the same thing here. The result will be called "weight container" or "target mesh" in the rest of the guide:
Create a joined duplicate “weight container”:
Even if we merged the submeshes, the actual models themselves are still separated. Editing and smoothing the weights will cause them to detach from each other, creating holes and gaps along the seams.
For that reason, you should now clean up your mesh and merge the vertices by distance:
❓ Edit Mode > Mesh > Clean Up > Merge by Distance
When porting assets from other games, a good habit is to always clean the Vertex Groups before transferring weights :
You can use the Wolvenkit Blender IO Suite's Mesh tools for step 1-5. However, this guide will show you the full manual process.
Click the weight source (the Netrunner suit)
Ctrl+Click on your merged weight container (the target mesh)
Switch Blender to Weight Paint mode:
Select Weights
-> Transfer Weights
A pop up will appear in the bottom left corner of your viewport window. Make the following changes:
Vertex Mapping - Nearest Face Interpolated
Ray Radius - 5m
Source Layers Selection - By Name
You have now successfully transferred the weights from the Netrunner suit to your ported garment. Let's clean this up.
Select Weights -> Limit Total.
In the pop-up at the bottom left, change the limit
from 4 to 8.
Finally, select Weights -> Normalize All
In the pop-up at the bottom left, un-check Lock Active
:
We could now transfer the garment's weight to our submeshes, import the result into the game, notice that something is off with the weights, fix it in Blender, rinse, repeat, and waste a lot of time.
Instead of doing that, we'll simply hook our garment to an animated body.
To learn how to add these things by hand, read 3.1 - 3.3
I took the time to merge and weight-fix two full bodies who are also already hooked to the inventory “Jacket Check” animation
You can download them from my Resources folder, here:
🔻 MA Body - Man Average RIG
🔻 WA Body - Woman Average RIG
To add it to your .blend file, select File -> Append, and select the collection [MA/WA]_weightCheck
:
You can now skip to #id-3.4-connecting-the-meshes-to-the-armature
From the Blender AddOn's Animation Tools Panel, select the correct rig for your mesh. You'll most likely want man_base
or woman_base
:
Change your weight container's armature modifier
to point at the rig you just imported:
You can use the same body that you've already used for refitting. This tutorial won't cover this — look it up in R&R: Refitting (step by step).
Import your body mesh into Blender
Join all the submeshes together
Change the body's armature modifier to point at the rig you added in 3.1
You can see that our added armature already has A-Pose and T-Pose hooked up:
We need a bit more than that, so let's grab ourselves an .anim from the game files.
For fitting clothes, you might want to use the inventory idle animations:
Otherwise, you can get creative with the Wolvenkit Search (something like .anims > !fpp
)
This will populate the Animsets list.
We can use the play button to make everything move. Now, time to hook everything up.
Select your merged weight container and change its Armature modifier:
aMa
/ aWa
if you used the prepared resources, the armature from 3.1.2 otherwise
Rotating your body, you might already notice holes or clipping:
Let’s check the animation by pressing the Play ▶ button on the timeline or in the Animation Tools:
Arms and collar will need some fixing. Let's go and do that.
Use the Play button at the bottom of Blender's viewport or in the Animation Tools
Let the animation play to a point where your issues are clearly visible, then hit the button again to pause it
Hide any armatures and collections, so that only the jacket mesh is visible.
From experience, we know which bones are responsible for the bat wings, but we'll go through the list one by one. If you want the more target-oriented approach, skip ahead through #id-4.1-fixing-the-bat-wings
Enter Weight Paint mode (at the top left of the Blender viewport)
Open and expand the Vertex Group list on the right:
On the right, select the first vertex group (Hips
)
Use the Blur
tool to fix anything that looks janky
Select the next vertex group on the list (Spine
)
This is where you fuck around and find out! You can always use the
Smoothing out the Spine groups helps a bit, but the mesh is still being pulled:
We’ll start tackling the actual Arm bones now:
We’ll need to clean the armpit on the [l/r]_SHL_0_JNT
group. You can do this by using the Brush
tool (with the Weight slider down to 0), or with the Radial Gradient
tool:
Drag the gradient tool near the armpit to remove all the excessive weight, and then use the blur brush to smooth the area:
We’ll do the same with the [l/j]_triceps_mscl_JNT
group:
...and the [l/j]_biceps_A_mscl_JNT
group:
That’s much better!
Scroll down to the [l/r]_latissimusDorsi_mscl_JNT
group and smooth out the area a bit.
You can go back to Object mode and check your weights with the animation at any time!
This isn’t too bad, we removed most of the stretching and the sleeves behave in a natural-ish way, considering this is a large jacket :>
The garment's collar is also a troublesome area; we can see how mine stretches and clips in all kind of weird way.
We'll go over the list in order again, starting from the Spine
bones and adding weights here to harmonize the whole collar:
Select the Sample Weight tool
Click on any light blue area
I’ll once again use the Radial Gradient tool to apply weights in an equal way
Be careful when using the Gradient tool
When weight painting with the gradient tool, the weight will apply on BOTH side of the mesh; front and back! To avoid this, rotate the camera and angle your model so your gradient only affect the desired area
Check the following vertex groups. Smooth out jagged edges, and remove incorrect weights.
Main vertex groups (avoid editing them too much, if you can avoid it):
[Left/Right]Shoulder
Neck
, Neck1
Head
[l/r]_sternocleidomastoid_[top/bot]_mscl_JNT
[l/r]_butterfly_top_CRV_bot_out_JNT
Remove weights from the following arm and torso related groups (depending on the length of your collar):
[l/r]_chest_front_[A/B/C]_[bot/top]_out_JNT
[l/r]_deltoid_[top/front/back]_[top/bot]_out_JNT
After manually fixing weights, always do “Limit All” and “Normalize All” from the Weights tab!
It’s important to aim for Correct over Perfect, otherwise you’ll get stuck and frustrated really fast, trust me 🧡
Don't worry about the clipping, we'll fix that in #id-5.1-fixing-clipping.
Change your weight container’s rig in the Armature modifier back to its original armature :
Hide the MA_weightCheck collection and un-hide your garment’s submeshes
Transfer the weight from your weight container to each of your garment’s submeshes. You can use the Mesh Tools, or do it by hand (one by one).
You can toggle proportional editing on and off by pressing o
. This guide won't cover proportional editing in detail, but you can look it up under#step-4-refitting in the R&R guide.
For each of your (now weighted) submeshes, change the rig in the armature modifier to animate them.
Entering Edit Mode will reset our model back to the default pose. To fix that, we have to check the On Cage
and Edit Mode
buttons on the armature modifier:
Repeat the step for each of your submeshes
Select them all, then enter edit mode by hitting tab
With proportional editing on, simply select the vertex in the area and slightly pull away from the body:
Use the bar at the bottom of the viewport and move the cursor to change the animation. You'll find and fix more clipping here.
Once you're done, change the armature modifier back to the original one.
Delete the weight container mesh (you don't need it anymore)
You can now export your mesh from Blender, then import it back into Wolvenkit.
And that’s about it for this tutorial/workflow on how I handle weight painting!
Don’t let weight painting occupy your entire brain while working on a project; it will never be perfect, a lot of vanilla garments have weight paint problems with stretching crotch and armpits area, it’s not something we can 100% control or avoid
As long as it’s not too visible or mesh breaking, clipping and stretching are easily dealt with in Photoshop or other post-render editing softwares 🤏
Again, I’m no expert, but I hope this tutorial will help you tackle some annoying aspects of Weight painting!
Have fun and happy modding y’all! 💛
Thank you for reading -Pkd
3ds Max Workflow for Cyberpunk 2077
- 3ds Max 2014-2022 - - -
- Unbundle the game files with WolvenKit.CLI (aka CP77Tools) - Install Noesis and rename Noesis64.exe to Noesis.exe (The original noesis.exe is 32-bit and the Noesis Plugin "fmt_CP77mesh.py" needs 64-bit) - Place "fmt_CP77mesh.py" in "noesis\plugins\python" copy "oo2ext_7_win64.dll" from "Cyberpunk 2077\bin\x64" and place it in the same folder as "fmt_CP77mesh.py" The plugin has some customization option if you open it in a text editor. Recommended Settings are:
- Next place "CP77_NOESIS_CMD.ms" in "C:\Program Files\Autodesk\3ds Max 20XX\scripts" - Open "CP77_NOESIS_CMD.ms" in a text editor and set your Noesis.exe path.
Run the MaxScript from Scripting > Run Script...
Click on "Import to Scene" and select the .mesh file you want to edit. Your custom settings in "fmt_CP77mesh.py" will effect the imported mesh. FBX Settings for Import:
MaxScript Settings for Export:
FBX Settings for Export:
How to import/export meshes with Noesis
Noesis is an alternative to exporting with WolvenKit. There are legitimate use cases for why you would want this. If you don't know them, you probably don't.
Noesis is outdated. Go import/export .
5000 years ago on the slopes of Mount Doom, mods were created with nothing but pickaxes, home-spun hemp, and hex editing. Older guides will refer to Noesis as the way to go — but Wolvenkit has come a long way since then. The import/export is reliable and works, and unless you , you will probably want to .
Given that you're still reading this, you probably have a reason to use Noesis, so here we go.
To use Noesis, you need the .
Tool | Tool version |
---|
Navigate the Noesis browser to your file on the disk (you can right-click on the mesh in Wolvenkit and select "Open in File Explorer
")
Right-click it in the Noesis Browser and select "Export"
Export with default settings:
Done. You can now import the fbx to Blender.
Simply export as fbx, Blender's standard settings are fine for Noesis.
Noesis is an alternative to importing with WolvenKit.
Find your fbx in the Noesis browser
Right-click it and select "Export"
Set the Main output type
to .mesh - CyberPunk 2077 mesh [PC]
A dialogue asks you for a file to overwrite. Make sure that it has your mesh!
Noesis-split meshes are essentially how Noesis copes with higher vertex counts. It will automatically divide up your submeshes into smaller parts, which is why Noesis will often display there being more meshes than intended.
This is caused by the vertex count being too high, and will often result in the applicable submeshes not converting with the rest of the mesh, resulting in those submeshes being non-existent in the .mesh file. The solution is to simply reduce the number of vertices in the given submesh with the goal being to get the count lower than 65,000 vertices on the given submesh.
The best way to tell how many vertices a given mesh has is to open the "Viewport Overlays" drop-down menu and select "Statistics". This will allow for data on the meshes within the .blend. To narrow this down to a specific submesh, open edit mode with that submesh as active and "select all" (CTRL + A) and you will see the vertex count for that submesh.
Once you know how many vertices you have, use either "Decimate Geometry" or "Merge By Distance" to simplify the topography of the mesh, or to merge two or more vertices that are a given distance apart from one another into one.
Once this has been done, export from blender and try the conversion again.
If this doesn't quite do the trick, convert the fbx to fbx (just leave the output type set to fbx) and enter "-fbxmeshmerge" in the advanced options text box before clicking export. (It is recommended that you set an output location when doing this so as to avoid accidentally overwriting the original mesh)
This often accompanies the "Noesis-split meshes" warning. A common cause for this is the use of Blender's "duplication" feature. To solve it, follow the steps above for "Noesis-split meshes" then import the resulting mesh back in to blender, and you should see that you have several blank "Objects" that came in along with your mesh. Delete those, export back out of blender, convert the fbx to fbx, then import the result into blender and repeat if needed.
Following the deletion of these Objects, you may notice deformations in the submesh/submeshes, if this is the case, replace the armature (and update the armature modifier) with a new one and export again.
There are a few differences between Noesis and WolvenKit when it comes to exporting your meshes:
1.3
(recent)
3.6
Wolvenkit |
>= 1.6.0 (download tags )
\
**When exporting your mesh the plugin will ask you to select a mesh to export it over, in most cases you should select the original mesh.
Autodesk (fbx) | glTF Binary (glb) |
---|
You can easily convert between the two formats by hand — or use : Switch to Blender's Scripting perspective, create a new file, paste the contents in, and run it.
>= 8.14
>= 1.5.5.2, recommended: 1.6.0 develop
Blender
>= 4.1, recommended: 4.2
Armature | Rotation W: 0 | Rotation W: 1 |
Rotation Z: -1 | Rotation Z: 0 |
Submesh names | submesh0 | submesh_00_LOD_1 |
>= 3.1 stable |
>= 4.459 >= Sep 28, 2021 |