I tried my best to achive a solution for this problem.
So what have i done?
First i have to say that I am a total noob in modding games. So i had to learn several different things before.
Tools that i had do use are Blender and Nifskope and Wrye Bash.
After some tries with different body replacers i choosed the one from which i believe would be the best for my mod.
So i haven chosen the DMRA body. It is easier to make a "big" body smaller than a small body big.
I loaded the femaleupperbody.nif and added two bones ""Bip01 briastTransform" and "Bip01 briastSideTransform", i also added "Bip01 ButtTransform". I also wanted to add a bone to transform the belly but that wasn′t looking good until now. Maybe i could add it later.
Than i had to learn how to weightpaint the body to the bones. After some days i think i got it
I also added those three bones to "Coronerras Maximum Compatibility Skeleton" which is my base for animation with moving briasts and back. I had to rotate the bones a bit to get things looking good.
Than i calculated the transform an rotation data of the 3 new bones for 49 different bodie types. Here is the list i made:
Skelett trans Scale scale trans Rot2 scaleskeleton_001_veryold_veryslim.nif -10 0.6 0.6 -6 6 -15 0.50skeleton_002_old_veryslim.nif -8 0.54 0.6 -5 5 -10 0.40skeleton_003_older_veryslim.nif -6 0.44 0.6 -4 4 10 0.30skeleton_004_normal_veryslim.nif -4 0.35 0.6 -3 3 30 0.26skeleton_005_younger_veryslim.nif -1.4 0.28 0.6 -2 2 50 0.20skeleton_006_young_veryslim.nif -1 0.23 0.6 -1 1 55 0.17skeleton_007_veryyoung_veryslim.nif 0 0.2 0.6 0 0 60 0.15 Skeleton_008_veryold_slim.nif -13 0.8 0.8 -6 7 -15 0.60Skeleton_009_old_slim.nif -10 0.78 0.8 -5 5 -10 0.48Skeleton_010_older_slim.nif -7.5 0.68 0.8 -4 4.5 10 0.40Skeleton_011_normal_slim.nif -6 0.6 0.8 -3 3 30 0.36Skeleton_012_younger_slim.nif -1.5 0.53 0.8 -2 2 50 0.30Skeleton_013_young_slim.nif -1.2 0.39 0.8 -1 1 55 0.27Skeleton_014_veryyoung_slim.nif 0 0.35 0.8 0 0 60 0.25 Skeleton_015_veryold_slimmer.nif -16 1.0 1.1 -6 8 -15 0.7Skeleton_016_old_slimmer.nif -12 0.9 1.1 -5 6.5 -10 0.6Skeleton_017_older_slimmer.nif -9 0.8 1.1 -4 5 10 0.55Skeleton_018_normal_slimmer.nif -6 0.7 1.1 -3 3 30 0.49Skeleton_019_younger_slimmer.nif -3 0.6 1.1 -2 2 50 0.44Skeleton_020_young_slimmer.nif -1.5 0.55 1.1 -1 1 55 0.42Skeleton_021_veryyoung_slimmer.nif 0 0.5 1.1 0 0 60 0.4 Skeleton_022_veryold_normal.nif -19 1.1 1.4 -6 9 -15 0.8Skeleton_023_old_normal.nif -15 1.0 1.4 -5 7 -10 0.7Skeleton_024_older_normal.nif -9 0.9 1.4 -4 5 10 0.65Skeleton_025_normal_normal.nif -7 0.8 1.4 -3 3 30 0.6Skeleton_026_younger_normal.nif -3.5 0.7 1.4 -2 2 50 0.55Skeleton_027_young_normal.nif -1.7 0.65 1.4 -1 1 55 0.52Skeleton_028_veryyoung_normal.nif 0 0.6 1.4 0 0 60 0.5 Skeleton_029_veryold_rounder.nif -22 1.3 1.7 -6 9 -15 0.9Skeleton_030_old_rounder.nif -17 1.2 1.7 -5 7 -10 0.8Skeleton_031_older_rounder.nif -10 1.1 1.7 -4 5 10 0.75Skeleton_032_normal_rounder.nif -6 1 1.7 -3 3 30 0.7Skeleton_033_younger_rounder.nif -4 0.9 1.7 -2 2 50 0.67Skeleton_034_young_rounder.nif -2 0.85 1.7 -1 1 55 0.63Skeleton_035_veryyoung_rounder.nif 0 0.8 1.7 0 0 60 0.6 Skeleton_036_veryold_round.nif -25 1.65 2 -6 10 -15 1.1Skeleton_037_old_round.nif -18 1.4 2 -5 8 -10 1Skeleton_038_older_round.nif -12 1.3 2 -4 5 10 0.9Skeleton_039_normal_round.nif -8 1.2 2 -3 3 30 0.84Skeleton_040_younger_round.nif -4 1.1 2 -2 2 50 0.8Skeleton_041_young_round.nif -2 1.05 2 -1 1 55 0.77Skeleton_042_veryyoung_round.nif 0 1 2 0 0 60 0.75 Skeleton_043_veryold_veryround.nif -25 1.9 2.5 -6 12 -15 1.4Skeleton_044_old_veryround.nif -18 1.7 2.5 -5 10 -10 1.25Skeleton_045_older_veryround.nif -12 1.55 2.5 -4 6 10 1.15Skeleton_046_normal_veryround.nif -8 1.5 2.5 -3 4 30 1Skeleton_047_younger_veryround.nif -4 1.4 2.5 -2 2 50 0.98Skeleton_048_young_veryround.nif -2 1.35 2.5 -1 1 55 0.95Skeleton_049_veryyoung_veryround.nif 0 1.3 2.5 0 0 60 0.9
I used nifskope to type in those numbers.
I also weightpainted some clothes that could be used with the scaleable bodies. The weightpaint copy script works great So its very easy to convert clothes for the body.
Now i had to get 49 new skeletons atached to the npcs. The best solution i found was using wrye bashs "MAONPCSkeletonPatcher" and mod it a bit:
class DiverseSkeletonPatcher(BasalNPCTweaker): """Changes all NPCs to use the diversive Skeleton for different look .""" #--Config Phase ----------------------------------------------------------- def __init__(self): MultiTweakItem.__init__(self,False,_("VadersApp′s diverse NPCs"), _('Changes all (modded and vanilla) NPCs to use diverse Skeletons for different look.'), 'VadersApp Skeleton', (_('All NPCs'), 0), (_('Only Female NPCs'), 1), (_('Only Male NPCs'), 2), ) def buildPatch(self,log,progress,patchFile): """Edits patch file as desired. Will write to log.""" count = {} keep = patchFile.getKeeper() for record in patchFile.NPC_.records: if self.choiceValues[self.chosen][0] == 1 and not record.flags.female: continue elif self.choiceValues[self.chosen][0] == 2 and record.flags.female: continue if record.fid == (GPath('Oblivion.esm'),0x000007): continue #skip player record try: oldModPath = record.model.modPath except AttributeError: #for freaking weird esps with NPC's with no skeleton assigned to them(!) continue random.seed(record.fid) randomNumber = random.randint(1, 49) if randomNumber == 1: newModPath = r"characters\_male\skeleton_001_veryold_veryslim.nif" if randomNumber == 2: newModPath = r"characters\_male\skeleton_002_old_veryslim.nif" if randomNumber == 3: newModPath = r"characters\_male\skeleton_003_older_veryslim.nif" if randomNumber == 4: newModPath = r"characters\_male\skeleton_004_normal_veryslim.nif" if randomNumber == 5: newModPath = r"characters\_male\skeleton_005_younger_veryslim.nif" if randomNumber == 6: newModPath = r"characters\_male\skeleton_006_young_veryslim.nif" if randomNumber == 7: newModPath = r"characters\_male\skeleton_007_veryyoung_veryslim.nif" if randomNumber == 8: newModPath = r"characters\_male\skeleton_008_veryold_slim.nif" if randomNumber == 9: newModPath = r"characters\_male\skeleton_009_old_slim.nif" if randomNumber == 10: newModPath = r"characters\_male\skeleton_010_older_slim.nif" if randomNumber == 11: newModPath = r"characters\_male\skeleton_011_normal_slim.nif" if randomNumber == 12: newModPath = r"characters\_male\skeleton_012_younger_slim.nif" if randomNumber == 13: newModPath = r"characters\_male\skeleton_013_young_slim.nif" if randomNumber == 14: newModPath = r"characters\_male\skeleton_014_veryyoung_slim.nif" if randomNumber == 15: newModPath = r"characters\_male\skeleton_015_veryold_slimmer.nif" if randomNumber == 16: newModPath = r"characters\_male\skeleton_016_old_slimmer.nif" if randomNumber == 17: newModPath = r"characters\_male\skeleton_017_older_slimmer.nif" if randomNumber == 18: newModPath = r"characters\_male\skeleton_018_normal_slimmer.nif" if randomNumber == 19: newModPath = r"characters\_male\skeleton_019_younger_slimmer.nif" if randomNumber == 20: newModPath = r"characters\_male\skeleton_020_young_slimmer.nif" if randomNumber == 21: newModPath = r"characters\_male\skeleton_021_veryyoung_slimmer.nif" if randomNumber == 22: newModPath = r"characters\_male\skeleton_022_veryold_normal.nif" if randomNumber == 23: newModPath = r"characters\_male\skeleton_023_old_normal.nif" if randomNumber == 24: newModPath = r"characters\_male\skeleton_024_older_normal.nif" if randomNumber == 25: newModPath = r"characters\_male\skeleton_025_normal_normal.nif" if randomNumber == 26: newModPath = r"characters\_male\skeleton_026_younger_normal.nif" if randomNumber == 27: newModPath = r"characters\_male\skeleton_027_young_normal.nif" if randomNumber == 28: newModPath = r"characters\_male\skeleton_028_veryyoung_normal.nif" if randomNumber == 29: newModPath = r"characters\_male\skeleton_029_veryold_rounder.nif" if randomNumber == 30: newModPath = r"characters\_male\skeleton_030_old_rounder.nif" if randomNumber == 31: newModPath = r"characters\_male\skeleton_031_older_rounder.nif" if randomNumber == 32: newModPath = r"characters\_male\skeleton_032_normal_rounder.nif" if randomNumber == 33: newModPath = r"characters\_male\skeleton_033_younger_rounder.nif" if randomNumber == 34: newModPath = r"characters\_male\skeleton_034_young_rounder.nif" if randomNumber == 35: newModPath = r"characters\_male\skeleton_035_veryyoung_rounder.nif" if randomNumber == 36: newModPath = r"characters\_male\skeleton_036_veryold_round.nif" if randomNumber == 37: newModPath = r"characters\_male\skeleton_037_old_round.nif" if randomNumber == 38: newModPath = r"characters\_male\skeleton_038_older_round.nif" if randomNumber == 39: newModPath = r"characters\_male\skeleton_039_normal_round.nif" if randomNumber == 40: newModPath = r"characters\_male\skeleton_040_younger_round.nif" if randomNumber == 41: newModPath = r"characters\_male\skeleton_041_young_round.nif" if randomNumber == 42: newModPath = r"characters\_male\skeleton_042_veryyoung_round.nif" if randomNumber == 43: newModPath = r"characters\_male\skeleton_043_veryold_veryround.nif" if randomNumber == 44: newModPath = r"characters\_male\skeleton_044_old_veryround.nif" if randomNumber == 45: newModPath = r"characters\_male\skeleton_045_older_veryround.nif" if randomNumber == 46: newModPath = r"characters\_male\skeleton_046_normal_veryround.nif" if randomNumber == 47: newModPath = r"characters\_male\skeleton_047_younger_veryround.nif" if randomNumber == 48: newModPath = r"characters\_male\skeleton_048_young_veryround.nif" if randomNumber == 49: newModPath = r"characters\_male\skeleton_049_veryyoung_veryround.nif" try: if oldModPath.lower() == r'characters\_male\skeletonsesheogorath.nif': newModPath = r"Mayu's Projects[M]\Animation Overhaul\Vanilla\SkeletonSESheogorath.nif" except AttributeError: #in case modPath was None. Try/Except has no overhead if exception isn't thrown. pass if newModPath != oldModPath: record.model.modPath = newModPath keep(record.fid) srcMod = record.fid[0] count[srcMod] = count.get(srcMod,0) + 1 #--Log log.setHeader(_('===VadersApp′s diverse NPCs')) log(_('* %d Skeletons Tweaked') % (sum(count.values()),)) for srcMod in modInfos.getOrdered(count.keys()): log(' * %s: %d' % (srcMod.s,count[srcMod]))
I made a batched patch. And voila all NPCs and also the ones from other mods got the new skeletons.
here is the result :
http://www.youtube.com/watch?v=zDo4iSFDlmw
The spell i used is to take npcs clothes away. I changed upper and lower body with a mesh with clothes to avoid nudity. For all NPCs it′s the same mesh with different skeletons.
What i want to achive before release is:
1. get facegen data for age and face heavy/light to atach the right bodies to the right face.
I tried my best but the data is encrypted
Maybe one of you could help me out with this problem?
My second attempt was to create a macro that reads the data out of the construction set. The macro is working fine, but cs doesn′t. It crashs after reading the data of 20-25 npcs
2. maybe adding other bones to achive even better quality
3. if everything is complete i have to weightpaint stock clothes and armor for the body.