Characters & assets

Bodies

The .ulbody files that describe the base figures, and what they mean for modders.

People are built on the Genesis 8 Female and Male figures. Each figure is described by a .ulbody file in Bodies/:

iniDisplayName: Genesis 8 Female
Gender: Female
MeshId: /Game/Genesis8/Female.Female
AnimationId: Idle_F_Daz.fbx
Genital: Vagina
PenisMeshId: /Game/Heavy/Daz/Bridget/futa/TAB_Gen3F_27097.TAB_Gen3F_27097
Material.Torso: /Game/Heavy/Daz/Bridget/B_Torso.B_Torso
Material.Face: /Game/Heavy/Daz/Bridget/B_Face.B_Face
Key Meaning
Gender The figure's sex
Race Optional. A body that answers only for this race; a mod body with a race of its own is offered on the creator's Body page (see below)
MeshId The body mesh: an engine asset (/Game/...) or a file under the mod's Meshes/ (Bodies/My.glb, .fbx)
Bone.<G8 bone> Only for a body that is not Genesis 8: which of its bones is that G8 bone, when the rig tables do not know its names
AnimationId The idle animation
Genital The genital the mesh itself carries (Penis / Vagina)
PenisMeshId The attachment used when a body of this figure is given a penis
Material.<slot> The skin material per mesh slot, carrying skin tone, tattoos, makeup and tan. Material.* applies to every slot
SkinTile.<slot> Which picture of the person's skin paints this slot: Face, Torso, Arms, Legs, or a genital graft's own tile (GenitalF, GenitalM, Shaft). Slots without one keep their material's own pictures

A body can replace the skin pictures with files, keeping everything the skin material does on top of them: Textures/<name>/<slot>_BC.png (and _N, _M), beside the mesh file when MeshId is a mod file, else beside the .ulbody (Bodies/Textures/G8_Female/Torso_BC.png for Bodies/G8_Female.ulbody). Default_BC.png answers for every slot without its own.

The base game ships three: G8_Female, G8_Male, and G8_Male_FemGen (the male figure with a vagina).

Skins: .ulskin

A skin is the set of pictures a person's body wears: colour, normal, specular, roughness and subsurface, one set per Genesis 8 UV tile. Each person draws one, so two people of the same tone can still look like different people. Skins live in Skins/, one folder each:

ini# Skins/Female/Hannah/Hannah.ulskin
DisplayName: Hannah
Gender: Female
Tone: 0.15
Races: Caucasian

beside its pictures, <Tile>_<map>.png for each tile the body names in its SkinTile. lines:

File Map Colour space
<Tile>_BC.png Colour. Required: a tile without it is not painted sRGB
<Tile>_N.png Normal (DirectX green, as Unreal) linear
<Tile>_S.png Specular strength sRGB (as Daz paints it)
<Tile>_R.png Roughness sRGB (as Daz paints it)
<Tile>_SSS.png Subsurface colour sRGB
<Tile>_Age_N.png Optional: the wrinkles faded in with age linear

A .dds (DXT1/DXT5, with mips) of the same name next to a .png is loaded instead, which is faster. Fill the whole picture, not only the UV islands: past the islands a black background shows up as pale dotted lines along the tile seams once the game samples the smaller mips. The face is drawn by a shader without subsurface scattering that renders the same colour redder than the body (green about ×0.88, blue ×0.82): paint Face_BC correspondingly paler, or the face reads as a red mask on a paler neck. The tiles are the Genesis 8 Female/Male UV layout at 2048×2048; GenitalF is the female graft's layout (GP_* slots, Golden Palace's default UV set: its own pictures use the Golden Palace set and must be re-projected), GenitalM the male genital base (Torso_ncl_1), Shaft the male figure's penis (slot Default), which uses XY's XY3 UV set: the whole penis sits in a small band of the square around u 0.50, v 0.89 (top-down), so paint it at 4096 and keep it matte (a glossy roughness draws a white streak along its sides).

Key Meaning
Gender The body it is painted for (Female / Male): the two figures do not share UVs
Tone Where the pictures sit on the skin-tone slider, 0 palest to 1 deepest. A person of exactly this tone shows the pictures as they are; a paler or deeper one gets them tinted, so one skin serves a range of tones
Races Optional, comma-separated. Preferred for people of these races when tones are close
DefaultMakeup Optional. A Makeup/Face look (file name without extension) the skin was made with: half the made-up women generated on this skin wear it

A person picks the skin of their gender whose Tone is nearest to theirs, preferring their race. Makeup, tattoos, tan lines, body hair and injuries are layered on top of any skin, so they need nothing from it. The base game ships its own skins in ul_Base/Skins/; a mod adds more by shipping its own folders, and a skin with the same file name replaces the earlier one.

Height: .ulheight

A person's height (the creator's Height slider, the SCALE Height line of a preset) shortens or lengthens the skeleton itself, the way Daz's height morphs do, so a short person is a short person and not a shrunk one: the head stays adult-sized, the legs and torso shorten, and clothes, hair and every animation follow. The bone changes come from a .ulheight file in Bodies/:

json{
 "morph": "3FootTall",
 "meshes": ["/Game/Genesis8/Female.Female"],
 "heightCm": { "base": 179.3, "atMin": 179.3, "atMax": 91.9 },
 "bones": {
  "lThighBend": [-0.2, -0.6, -0.137],
  "head": [0.1, 0.1, 0.1]
 }
}
Key Meaning
meshes The body meshes (a .ulbody's MeshId) this rig applies to
heightCm The figure's height without and with the morph at full strength; only their ratio is used, for the height shown in centimetres
bones Per bone, the change of scale at value 1, in Daz axes (X sideways, Y up, Z forward). Value v gives scale 1 + v × delta; a bone's scale shortens the offsets to its children but is not inherited by them, as in Daz

Height value 0 is the figure as modelled, 1 is the morph at 100% (3FootTall: about half height), negative values make the person taller. The feet stay on the floor; in a sex animation the hips stay where the clip puts them instead.

The base game's files (G8_Female.ulheight, G8_Male.ulheight) are made from Daz's 3FootTall morph. To make one from another morph, in the game repository:

  1. In Daz Studio, select the figure with no other shape dialled, set the morph name in Tools/Daz/MeasureHeightMorph.dsa, and run it from the Script IDE. It writes <Figure>_<Morph>.json next to the script.
  2. python Tools/Daz/make_lpheight.py <that json> Bodies/My.ulheight /Game/Genesis8/Female.Female

Do not also export the height morph into the body FBX and dial it: Daz bakes the skinned result of the bone scaling into the exported blendshape, so the morph and the bones together would shrink the body twice. A later mod's file for the same mesh replaces an earlier one.

Penis controls: .ulpenis

The penis graft's pose controls ("Penis bend", "Penis up-down", "Penis side-side"...) are, in Daz, formulas that turn and move the Penis* bones, with no vertex changes: an FBX export cannot carry them. The game applies the same formulas from a .ulpenis file in Bodies/, which also says how an erection is made:

json{
 "bones": { "Penis-root": { "x": [1, 0, 0], "y": [0, 0.17, 0.98], "z": [0, -0.98, 0.17] } },
 "controls": {
  "Penis up-down": { "min": -1, "max": 1, "drives": [ { "bone": "Penis-root", "channel": "rotation/x", "factor": -25 } ] }
 },
 "erection": { "aim_control": "Penis up-down", "aim_degrees_per_unit": -107, "hold": {} }
}
Key Meaning
bones Each bone's own axes in Daz figure space (x to the figure's left, y up, z forward)
controls Per control, what one unit of it does: drives turn (rotation/x|y|z, degrees) or move (translation/..., cm) a bone about or along its own axes. Scale channels are ignored
erection.aim_control The control that raises the shaft when someone is erect and aims (a jet is aimed by raising the shaft, not by bending the stream)
erection.aim_degrees_per_unit How far the tip turns per unit of that control
erection.hold Other controls held at a value while erect, e.g. { "Penis flacid": -0.5 }

ul_Base/Bodies/XY.ulpenis is generated from the XY graft by python Tools/DazMakeup/export_penis_controls.py in the game repository. A later mod's control replaces an earlier one of the same name.

Bodies that are not Genesis 8

A mod can add a whole different figure: a VRoid or VRM avatar, a Mixamo character, a modder's orc, a robot. It needs nothing but a rigged mesh and a short .ulbody:

ini# Bodies/VRoidSample.ulbody
DisplayName: VRoid sample
Gender: Female
Race: VRoidSample
MeshId: Bodies/VRoidSample.glb

with the mesh at Meshes/Bodies/VRoidSample.glb (.glb, .gltf or .fbx; a .vrm is a .glb, rename it). The official Example body mod (ul_ExampleBody) is exactly this, ready to copy.

It plays every animation in the game. Every clip, pose, scene and walk is made for the Genesis 8 skeleton, so a person wearing such a body keeps an unseen Genesis 8 body that plays all of it, and the foreign one copies its pose every frame: each limb points where the Genesis 8 limb points, so a rig modelled in a T-pose and one in an A-pose end up holding the same arms, and the hips travel in proportion to the leg length.

Which bone is which is found by name, from the Rigs/*.ulrig tables of every enabled mod. ul_Base/Rigs/humanoid.ulrig already knows Mixamo (mixamorig:LeftUpLeg), the Unreal mannequin (thigh_l), VRoid/VRM (J_Bip_L_UpperLeg), Character Creator, Rigify and 3ds Max Biped. Names are compared without case, namespace (mixamorig:) or separators. A rig it does not know names its bones in the .ulbody, one line per Genesis 8 bone:

iniBone.hip: Root_Pelvis
Bone.lShldrBend: Arm_L_01
Bone.lThighBend: Leg_L_Upper

The Genesis 8 bones it follows: hip, abdomenLower, abdomenUpper, chestUpper, neckLower, head; per side (l/r) Collar, ShldrBend, ForearmBend, Hand, Thumb1-3, Index1-3, Mid1-3, Ring1-3, Pinky1-3, ThighBend, Shin, Foot, Toe. Hips, head, both thighs and both upper arms are required; anything else missing just keeps its rest pose. The log says what was matched: ForeignBody: VRoidSample - 49 of 52 G8 bones matched ... Unmatched: .... Extra bones (a tail, a cape, a weapon) keep their rest pose, and a sleeve or skirt bone that sits where a limb starts moves with that limb.

To share a table for a whole rig family, ship your own Rigs/<name>.ulrig:

ini# <G8 bone>: <name>, <name>, ...
lShldrBend: arm_l_01, upperarm_left

Textures come with the .glb. Loose pictures replace them per material slot: Meshes/Bodies/Textures/<mesh name>/<slot>_BC.png (colour), _N.png (normal), _MR.png (glTF metallic-roughness); Default_BC.png answers for every slot without its own.

Thumbnail: Bodies/Thumbs/<file name>.png beside the .ulbody (512×512 works well) is the tile on the creator's Body page.

What does not carry over to a foreign body: Genesis 8 clothing and hair (they are hidden while it is worn), the creator's morph sliders, makeup, tattoos and skin tone. It is not offered for a person under 18. A non-humanoid (four legs, wings for arms) cannot play human animations.

What this means for modders

Everything wearable and every animation is authored against the Genesis 8 figures: Genesis 8, with its bone names. Clothing and hair made for another figure will not fit. A body for another figure can be added as above; it plays the game's animations but wears its own clothes.