Forum: Poser - OFFICIAL


Subject: Questions for clothing designers for weight mapped figures

an0malaus opened this issue on Jul 01, 2019 ยท 42 posts


an0malaus posted Mon, 01 July 2019 at 6:11 AM

@Glitterati3D can you please explain how the weight maps are applied in the conformed clothing? I see in the base figure that its ghost bone rotations, which are derived from physical joint rotations (i.e. they act as intermediaries to apply possibly non-linear scaling to the weight map strength). Can the base figure's ghost bones also drive weight mapping on the conformed clothing? To do so, they would need to have a specific channel in the clothing body part which refers to the ghost bone on the base figure and drives the clothing weight map. Such channels are always paired with a reciprocal joint channel on the primary, in this case the ghost bone on the base figure then needs to have a channel added which refers to the joint channel on the clothing to drive its weight map. I may be wrong, but I don't believe I have ever seen such a thing.

What I do see (and I'll admit to limited experience) is paired channels like this:

actor chest:27 # Physical actor on conformer. Weight maps referred to by channels driven by parameters on ghost bone
    {
    parent abdomen:27
    conformingTarget chest:1
    weightMap   lBreast_jointx
        { 
            numbVerts 16320
        } 
    weightMap   lBreast_jointz
        { 
            numbVerts 16320
            v 8160 0.046575
            v 8161 0.030631
            ...
            v 16295 0.301515
            v 16296 0.273200
        } 
    weightMap   lBreast_twisty
        { 
            numbVerts 16320
            v 8160 0.881436
            v 8161 0.884573
            ...
            v 16318 1.000000
            v 16319 1.000000
        } 
        ...
    channels
        {
        twistY lBreast_twisty
            {
            name lBreast_twisty
            initValue 0
            hidden 1
            enabled 1
            forceLimits 0
            min -100000
            max 100000
            trackingScale 1
            masterSynched 0
            keys
                {
                static  0
                k  0  0
                sl  1
                spl
                sm
                catid 0
                }
            interpStyleLocked 0
            otherActor lBreast:27
            flipped
            primaryParm twisty # Refers to ghost bone channel driving this weight map
            zones
                {
                weightmapzone
                    {
                    active 1
                    math 2
                    mapname lBreast_twisty
                    }
                }
            calcWeights
            }
        jointZ lBreast_jointz
            {
            name lBreast_jointz
            initValue 0
            hidden 1
            enabled 1
            forceLimits 0
            min -100000
            max 100000
            trackingScale 1
            masterSynched 0
            keys
                {
                static  0
                k  0  0
                sl  1
                spl
                sm
                catid 0
                }
            interpStyleLocked 0
            otherActor lBreast:27
            flipped
            primaryParm jointz # Refers to ghost bone channel driving this weight map
            zones
                {
                weightmapzone
                    {
                    active 1
                    math 2
                    mapname lBreast_jointz
                    }
                }
            doBulge 0
            posBulgeLeft 0
            posBulgeRight 0
            negBulgeLeft 0
            negBulgeRight 0
            jointMult 1
            useBulgeMapLeft 0
            useBulgeMapRight 0
            calcWeights
            }
        jointX lBreast_jointx
            {
            name lBreast_jointx
            initValue 0
            hidden 1
            enabled 1
            forceLimits 0
            min -100000
            max 100000
            trackingScale 1
            masterSynched 0
            keys
                {
                static  0
                k  0  0
                sl  1
                spl
                sm
                catid 0
                }
            interpStyleLocked 0
            otherActor lBreast:27
            flipped
            primaryParm jointx # Refers to ghost bone channel driving this weight map
            zones
                {
                weightmapzone
                    {
                    active 1
                    math 2
                    mapname lBreast_jointx
                    }
                }
            doBulge 1
            posBulgeLeft 0
            posBulgeRight 0.00999998
            negBulgeLeft 0
            negBulgeRight 0.13
            jointMult 1
            useBulgeMapLeft 0
            useBulgeMapRight 1
            calcWeights
            }
        }
    }

actor lBreast:27 # Ghost bone on conformer - no vertices, so empty weight maps
    {
    parent chest:27
    conformingTarget lBreast:1
    channels
        {
        jointX jointx
            {
            name jointx
            initValue 0
            hidden 1
            enabled 1
            forceLimits 0
            min -100000
            max 100000
            trackingScale 1
            masterSynched 0
            keys
                {
                static  0
                k  0  0
                sl  1
                spl
                sm
                catid 0
                }
            interpStyleLocked 0
            ,,,
            otherActor chest:27 # Indicates another actor affected by this channel
            ...
            zones
                {
                weightmapzone
                    {
                    active 1
                    math 2
                    mapname lBreast_jointx # Refers to local (empty) weight map on ghost bone
                    }
                }
            ...
            }
        jointZ jointz
            {
            name jointz
            initValue 0
            hidden 1
            enabled 1
            forceLimits 0
            min -100000
            max 100000
            trackingScale 1
            masterSynched 0
            keys
                {
                static  0
                k  0  0
                sl  1
                spl
                sm
                catid 0
                k  1  0
                sl  1
                spl
                sm
                catid 0
                }
            interpStyleLocked 0
            otherActor chest:27 # Indicates another actor affected by this channel
            zones
                {
                weightmapzone
                    {
                    active 1
                    math 2
                    mapname lBreast_jointz # Refers to local (empty) weight map on ghost bone
                    }
                }
            doBulge 0
            posBulgeLeft 0
            posBulgeRight 0
            negBulgeLeft 0
            negBulgeRight 0
            jointMult 1
            useBulgeMapLeft 0
            useBulgeMapRight 0
            calcWeights
            }
        twistY twisty
            {
            name twisty
            initValue 0
            hidden 1
            enabled 1
            forceLimits 0
            min -100000
            max 100000
            trackingScale 1
            masterSynched 0
            keys
                {
                static  0
                k  0  0
                sl  1
                spl
                sm
                catid 0
                }
            interpStyleLocked 0
            otherActor chest:27 # Indicates another actor affected by this channel
            zones
                {
                weightmapzone
                    {
                    active 1
                    math 2
                    mapname lBreast_twisty # Refers to local (empty) weight map on ghost bone
                    }
                }
            calcWeights
            }
        }
    }

Where a clothing chest actor has some weight maps that are driven by joint channels which refer to channels on a clothing ghost bone. The ghost bone's channels are conformed to a ghost bone on the base figure, which applies the original weight maps to the base figure's chest actor in the same way as the clothing.

The only visible link between the two figures are the conformingTarget lines on the clothing, transferring joint rotations and translations from the base figure to the clothing actors.

I will certainly admit to moderate uncertainty (ha ha) when it comes to understanding the conforming process, as it's gone through many changes over the years, with the addition of figure-level options to copy scales, morphs, origins, endpoints and joint translations. I'm even finding valueOperations which I've added to joint rotations on ghost bones of conforming clothing, which logic tells me should be entirely unnecessary, as conforming should transfer those rotations. Yet I put those valueOperations in because I wasn't seeing the effect I expected on clothing. I'm still feeling my way to the proper solution to this, hence this query.

I can't afford to get into discussions about the quality of weight mapping and figure creation techniques. What I have is what I have, and weight painting is among the least developed of my skills (if only there were sufficient python hooks in the Poser API that I could script all of the fitting or setup room functions, or even create weight maps based on mathematical formulae, I'd be much happier - and I don't mean having to create a pose file and apply it to add weight maps - how crude!)

Loose clothing can afford to take liberties with the accuracy of following a figure's exact shape. Close, tight clothing cannot. The extreme example that I'm dealing with here is Exnem's Body Hair for V4. It cannot afford to float away from the skin surface because it's weight mapping (it currently has none, hence this exercise) doesn't match the V4WM I'm using as a base figure.



My ShareCG Stuff

Verbosity: Profusely promulgating Graham's number epics of complete and utter verbiage by the metric monkey barrel.