Genesis 3 blendshapes to Unity Visemes
bhoffman67
Posts: 39
I've been able to get a Gen3m from Daz 4.24 into Unity 2022.3 but having trouble trying to match the blendshapes up.
You currently have no notifications.
bhoffman67
Posts: 39
I've been able to get a Gen3m from Daz 4.24 into Unity 2022.3 but having trouble trying to match the blendshapes up.
Licensing Agreement | Terms of Service | Privacy Policy | EULA
© 2025 Daz Productions Inc. All Rights Reserved.
Comments
You need a different mappings for visemes in Unity. For example:
**Step 1: Export Genesis 3 Male from Daz Studio**
1. In **Daz Studio**, select your Genesis 3 Male character.
2. Go to **File → Export** and choose **FBX** format.
3. In the FBX export options:
- **Morphs**: Enable *Export Morphs*.
- Add the **viseme-related morphs** (e.g., `PHMmm`, `PHMaa`, `PHMee`, etc.).
- Set **FBX 2014/2016** for best Unity compatibility.
4. Export the file.
**Step 2: Import into Unity**
1. Drag the exported FBX into Unity.
2. In the **Inspector**, select the FBX → **Rig** tab → set **Animation Type** to *Humanoid*.
3. In the **Model** tab, check **Import BlendShapes**.
4. Apply changes.
**Step 3: Map Daz Morphs to Unity Visemes**
Unity uses **12 visemes** for lip-sync
(e.g., `sil`, `PP`, `FF`, `TH`, `DD`, `kk`, `CH`, `SS`, `nn`, `RR`, `aa`, `E`, `ih`, `oh`, `ou`).
Daz Genesis 3 morphs have names like:
- `PHMaa` → `aa`
- `PHMee` → `E`
- `PHMoo` → `oh`
- `PHMpp` → `PP`
- `PHMff` → `FF`
You need a **mapping dictionary** like this:
private Dictionary<string, string> dazToUnityVisemeMap = new Dictionary<string, string>()
{
{"PHMaa", "aa"},
{"PHMee", "E"},
{"PHMih", "ih"},
{"PHMoo", "oh"},
{"PHMou", "ou"},
{"PHMpp", "PP"},
{"PHMff", "FF"},
{"PHMth", "TH"},
{"PHMdd", "DD"},
{"PHMkk", "kk"},
{"PHMch", "CH"},
{"PHMss", "SS"},
{"PHMnn", "nn"},
{"PHMrr", "RR"}
};
Use at your own risk, if you wish.
To test it in Unity try:
1. Attach the script below to your character GameObject.
2. Assign the **SkinnedMeshRenderer** (usually under the FBX hierarchy).
3. Call `SetViseme("aa", 100f);` to test.
using UnityEngine;
using System.Collections.Generic;
public class DazToUnityVisemeMapper : MonoBehaviour
{
public SkinnedMeshRenderer characterMesh;
private Dictionary<string, string> dazToUnityVisemeMap = new Dictionary<string, string>()
{
{"PHMaa", "aa"},
{"PHMee", "E"},
{"PHMih", "ih"},
{"PHMoo", "oh"},
{"PHMou", "ou"},
{"PHMpp", "PP"},
{"PHMff", "FF"},
{"PHMth", "TH"},
{"PHMdd", "DD"},
{"PHMkk", "kk"},
{"PHMch", "CH"},
{"PHMss", "SS"},
{"PHMnn", "nn"},
{"PHMrr", "RR"}
};
private Dictionary<string, int> blendShapeIndices = new Dictionary<string, int>();
void Start()
{
if (characterMesh == null)
{
Debug.LogError("Assign the SkinnedMeshRenderer in the inspector.");
return;
}
// Cache blendshape indices
for (int i = 0; i < characterMesh.sharedMesh.blendShapeCount; i++)
{
string shapeName = characterMesh.sharedMesh.GetBlendShapeName(i);
if (dazToUnityVisemeMap.ContainsKey(shapeName))
{
blendShapeIndices[dazToUnityVisemeMap[shapeName]] = i;
}
}
}
public void SetViseme(string viseme, float weight)
{
if (blendShapeIndices.ContainsKey(viseme))
{
characterMesh.SetBlendShapeWeight(blendShapeIndices[viseme], weight);
}
else
{
Debug.LogWarning($"Viseme {viseme} not found in blendshapes.");
}
}
}
Please let me know, how it goes for you.