Posted on Nov. 2, 2021, 11:48 a.m. by lootz • Last updated on Nov. 6, 2021, 10:02 p.m.
Greetings,
This is an overview guide to porting from Koikatsu to SFM. It's similar to MMD port workflow, but with more tinkering.
Reference used: https://www.youtube.com/playlist?list=PLhiuav2SCuvfIJ20QrEzkoFl__F9VaRk2
Image editing program (Photoshop, Gimp, Clipstudio, etc.)
Koikatsu 3.x+ with HF patch
addon: pmxexporter (included in the guide)
Blender 2.8x+
addons: CATs tools, Abnormal [vertex normal editing], Blender Source Tools
1.Install the pmxexporter into the addons directory
2.Launch Koikatsu and Setup your waifu/cards. Any invisible part of the mesh will be rendered, be sure to use masks or remove them. when using "Push up bra" option and export the model, it will give you the edited size of breasts.
3.The model will keep looking into the camera, besure to change the "target" to look up and reduce the bar to straight to look forward.
4.Disable eye blinking and T-pose.
5.Export when ready.
1.All face flexes are broken into parts. (Example - eyesClosing flexes needs to use 3~4 flexes for eyelid/eyelash/scerla/brow) this can be fixed using the tutorial script to create new merged shape keys.
2.Private parts need some extra work, it comes with no flexes, and no nipples. [If you are making a NSFW model]
3.PMXExporter will give you only diffuse textures. normal maps/phong/masks are extractable in the material editor or ripping them.
(You may find here the stuff mentioned above here, same can be said for the outfit menu)
4.Hair's textures needs work as they use vertex paint?/shaders instead of uvs.
5.Textures are less saturated/pale, but they are fixable via editing.
1.Be sure that models with multiple accessory of the same type will break the rig, the bones will be present, but they all will use the first accessory bones. Manually fixing is required.
2.Face bones are to change the structure and not 100% posing friendly.
3.Pupil plane are touching the scerla and hard to pose, you may:
A)Push the scerla back
B)Edit the eye bones to have better manipulation
C)Change the Scerla to be a seperate plane.
3a.fixing may not work properly, so creating QC eyes is also an option.
4.You'll need to restructure the pelvis bone and shoulder bones for the IK to work in SFM.
5.Translation can be done using CATS tools, and using the tools to fix the model's skeleton is also possible, be sure to keep a backup of that skeleton if the model have multiple accessory of the same type, as the zero weighted bones will be removed.
6.About 60% of the bones are zero-weighted, you may delete them, they're usually named as "cf_j_xxxx" and "cf_d_xxxx".
1.As mentioned above, they are fixed via a script. 1st script will merge the cooresponing flexes together, the 2nd is to rename them to be used on .DMX format. {QC bone renaming is included}
2.if you are exporting as .DMX be sure to seperate the body, remove the "mmd_vertex_order" / "mmd_edge_scale" from the vertex groups before limiting the weights to 3 vertices.
3.you might need to reweight some custom clothes/ or mask parts of the body via transparent material.
4.If the 1st script failed to work, it's either there is no "Model_Mesh" named mesh or some accessory for some reason; breaks the script. which can be bypassed via removing all accessories.
5.The lower eyelash my not be exported properly to SFM, and does not behave properly. (Merge both lashes textures to top lash. May to some extend fix the issue)
6.You might need to break the model into parts, for better manupilation and be exported to SFM due to bone limit.
############################################
# GENERATE KK SHAPEKEY SCRIPT
##########################################
#Translate shapekeys to english
import bpy
def tidyUp(keyName):
if (keyName.find("eye_face.f00") != -1):
keyName = keyName.replace("eye_face.f00", "Eyes")
if (keyName.find("kuti_face.f00") != -1):
keyName = keyName.replace("kuti_face.f00", "Lips")
if (keyName.find("eye_siroL.sL00") != -1):
keyName = keyName.replace("eye_siroL.sL00", "EyeWhitesL")
if (keyName.find("eye_siroR.sR00") != -1):
keyName = keyName.replace("eye_siroR.sR00", "EyeWhitesR")
if (keyName.find("eye_line_u.elu00") != -1):
keyName = keyName.replace("eye_line_u.elu00", "Eyelashes1")
if (keyName.find("eye_line_l.ell00") != -1):
keyName = keyName.replace("eye_line_l.ell00", "Eyelashes2")
if (keyName.find("eye_naM.naM00") != -1):
keyName = keyName.replace("eye_naM.naM00", "EyelashesPos")
if (keyName.find("eye_nose.nl00") != -1):
keyName = keyName.replace("eye_nose.nl00", "NoseTop")
if (keyName.find("kuti_nose.nl00") != -1):
keyName = keyName.replace("kuti_nose.nl00", "NoseBot")
if (keyName.find("kuti_ha.ha00") != -1):
keyName = keyName.replace("kuti_ha.ha00", "Teeth")
if (keyName.find("kuti_yaeba.y00") != -1):
keyName = keyName.replace("kuti_yaeba.y00", "Fangs")
if (keyName.find("kuti_sita.t00") != -1):
keyName = keyName.replace("kuti_sita.t00", "Tongue")
if (keyName.find("mayuge.mayu00") != -1):
keyName = keyName.replace("mayuge.mayu00", "Eyebrows")
print(keyName)
return keyName
for shapekey in bpy.data.shape_keys:
for keyblock in shapekey.key_blocks:
#print(keyblock.name)
keyblock.name = tidyUp(keyblock.name)
######################################################## and then...
#Combine the shapekeys with this code:
def whatCat(keyName):
#EyeWhites are unused because the shape keys for left and right eyes both affect the left eye for some reason
#Eyelashes1 is used because I couldn't see a difference between the other one and they overlap if both are used
#EyelashPos is unused because Eyelashes work better and it overlaps with Eyelashes
#eye_nal is unused because I have no idea what it does
eyes = [keyName.find("Eyes"), keyName.find("NoseT"), keyName.find("Eyelashes1")]
if not all(v == -1 for v in eyes):
return 'Eyes'
mouth = [keyName.find("NoseB"), keyName.find("Lips"), keyName.find("Tongue"), keyName.find("Teeth"), keyName.find("Fangs")]
if not all(v==-1 for v in mouth):
return 'Mouth'
#else
return 'None'
#setup two arrays for later
used = []
inUse = []
#These shapekeys have a common dependancy on other shapekeys
correctionList = ['Lips_u_s_op', 'Lips_u_l_op', 'Lips_e_l_op', 'Lips_o_s_op', 'Lips_o_l_op', 'Lips_neko_op', 'Lips_san_op']
resetList = ['Fangs_def_op', 'Teeth_def_op', 'Tongue_def_op', 'Teeth_bisyou_op1', 'Tongue_egao_op', 'Teeth_i_l_cl', 'Fangs_i_l_cl', 'Teeth_i_s_cl', 'Fangs_i_s_cl']
fanglessResetList = ['Teeth_def_op', 'Tongue_def_op', 'Teeth_bisyou_op1', 'Tongue_egao_op', 'Teeth_i_l_cl', 'Teeth_i_s_cl']
counter = len(bpy.data.shape_keys[0].key_blocks)
ACTIVE = .9
#print('-------------------')
for shapekey in bpy.data.shape_keys:
for keyblock in shapekey.key_blocks:
counter = counter - 1
print(counter)
if (counter == 0):
break
#What category is this shapekey (mouth, eyes or neither)?
cat = whatCat(keyblock.name)
#get the emotion for mouth or eyes from the shapekey name
if not (cat.find('None') == 0):
emotion = keyblock.name[keyblock.name.find("_"):]
#assign each keyblock a category and emotion combo
for keyblockCheck in shapekey.key_blocks:
#does this key match my current emotion?
if (keyblockCheck.name.find(emotion) != -1):
#does this key match my current category?
if whatCat(keyblock.name) == whatCat(keyblockCheck.name):
#I haven't already used this key right?
if (keyblockCheck.name not in used):
keyblockCheck.value = ACTIVE
inUse.append(keyblockCheck.name)
#print('Using ' + keyblockCheck.name)
#Manual corrections
if (keyblock.name in correctionList):
try:
shapekey.key_blocks['Fangs_def_op'].value = ACTIVE
except:
#this character doesn't have fangs
pass
shapekey.key_blocks['Teeth_def_op'].value = ACTIVE
shapekey.key_blocks['Tongue_def_op'].value = ACTIVE
if (keyblock.name == 'Lips_e_s_op'):
try:
shapekey.key_blocks['Fangs_def_op'].value = ACTIVE
except:
#this character doesn't have fangs
pass
if (keyblock.name == 'Lips_bisyou_op'):
shapekey.key_blocks['Teeth_bisyou_op1'].value = 0
if (keyblock.name == 'Lips_tabe_op'):
try:
shapekey.key_blocks['Fangs_def_op'].value = ACTIVE
except:
#this character doesn't have fangs
pass
shapekey.key_blocks['Teeth_def_op'].value = ACTIVE
shapekey.key_blocks['Tongue_egao_op'].value = ACTIVE
if (keyblock.name == 'Lips_i_l_op'):
shapekey.key_blocks['Teeth_i_l_cl'].value = ACTIVE
try:
shapekey.key_blocks['Fangs_def_op'].value = ACTIVE
except:
#this character doesn't have fangs
pass
if (keyblock.name == 'Lips_i_s_op'):
shapekey.key_blocks['Teeth_i_s_cl'].value = ACTIVE
try:
shapekey.key_blocks['Fangs_def_op'].value = ACTIVE
except:
#this character doesn't have fangs
pass
if (keyblock.name not in used):
#print('Creating combined shapekey')
bpy.data.objects['Model_mesh'].shape_key_add(name=('KK ' +cat+emotion))
#print('appended this to used ' + keyblock.name)
for thing in inUse:
used.append(thing)
#reset used values
for thing in used:
shapekey.key_blocks[thing].value=0
#reset values for shapekeys that were used to correct another shapekey
try:
for thing in resetList:
shapekey.key_blocks[thing].value=0
#print('')
except:
for thing in fanglessResetList:
shapekey.key_blocks[thing].value=0
inUse =[]
print('end')
#########################################
import bpy
# get the selected object
selected_object = bpy.context.object
# get its shapekeys
shape_keys = selected_object.data.shape_keys.key_blocks
# loop through shapekeys and replace the names
#for key in shape_keys:
# key.name = key.name.replace("_", " ")
###########EYEBROW
for key in shape_keys:
key.name = key.name.replace("Eyebrows_oko_op", "Eyebrows angry")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_koma_op", "Eyebrows sad")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_tmara_op", "Eyebrows raise")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_gimoL_op", "Eyebrows raise L")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_gimoR_op", "Eyebrows raise R")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_sianL_op", "Eyebrows skeptical L")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_sianR_op", "Eyebrows skeptical R")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_oko2L_op", "Eyebrows skeptical 2 L")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_oko2R_op", "Eyebrows skeptical 2 R")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_sinken_op", "Eyebrows angry 2")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_huan_op", "Eyebrows neutral")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_odoro_op", "Eyebrows happy")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_rakutan_op", "Eyebrows nervous")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_doya_op", "Eyebrows focus")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_winkl_op", "Eyebrows Wink L")
for key in shape_keys:
key.name = key.name.replace("Eyebrows_winkr_op", "Eyebrows Wink R")
###########EYES
for key in shape_keys:
key.name = key.name.replace("KK Eyes_def_cl", " blink")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_egao_cl", " blink happy")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_egao_op", "eyes open")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_bisyou_op", "eyes focus")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_winkl_op", "blink L")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_winkr_op", "blink R")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_setunai_op", "eyes squint")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_tere_op", "half close 2")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_ikari_op", "half close angry")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_sinken_op", "halfclose focus")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_tumara_op", "hard squint close")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_kurusi_op", "Hardest squint close")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_keno_op", "eyes threat")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_sian_op", "eyes stare")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_kanasi_op", "eyes sad")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gag", "no eyes")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gyul_op", "wink L")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gyur_op", "wink R")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gyu_cl", "wink both")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gyul02_op", "wink 2 L")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gyur02_op", "wink 2 R")
for key in shape_keys:
key.name = key.name.replace("KK Eyes_gyu02_cl", "wink 2 both")
##################### MOUTH
for key in shape_keys:
key.name = key.name.replace("KK Mouth_def_op", "ah 1")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_egao_op", "ah 2")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_bisyou_op", "smile 1")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_uresi_cl", "smile 2")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_uresi_op", "open wide")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_uresi_s_op", "open small")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_ikari_cl", "mouth angry")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_ikari_op", "mouth angry open")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_ikari02_op", "mouth angry open wide")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_sinken02_op", "ouh")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_sinken03_cl", "disgusted")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_sinken03_op", "disgusted open")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_keno_op", "EEE")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_sabisi_op", "EU")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_aseri_op", "AEEH")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_human_cl", "puff")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_odoro_op", "OOH")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_doya_cl", "smug")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_doya_op", "smug open")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_pero_cl", "tongue out")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_name_op", "suck")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_kuwae_op", "big suck")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_kisu_op", "small suck")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_name02_op", "disgusted tongue out")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_a_s_op", "AA")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_a_l_op", "AI")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_i_s_op", "SS")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_i_l_op", "SS 2")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_u_s_op", "YUU")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_e_l_op", "EEEE")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_o_s_op", "Oh")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_n_s_cl", "NN")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_neko_cl", "cat")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_neko_op", "cat open")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_san_op", "triangle")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_niko_cl", "smile 3")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_niko_op", "WIDE OPEN SMILE 3")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_mogu_op", "smile puffer")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_mogu_cl", "smille small")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_tabe_op", "medium suck")
for key in shape_keys:
key.name = key.name.replace("KK Mouth_i_s_cl", "teeth big")
//BONES $renamebone " " "bip_"
$renamebone "LowerBody" "bip_pelvis"
$renamebone "UpperBody" "bip_spine_0"
$renamebone "UpperBody2" "bip_spine_1"
$renamebone "cf_j_spine03" "bip_spine_2"
$renamebone "Neck" "bip_neck"
$renamebone "Head" "bip_head"
$renamebone "Eyex_L" "bip_Eye_L"
$renamebone "Eyex_R" "bip_Eye_R"
//Right arm
$renamebone "cf_j_shoulder_R" "bip_collar_R"
$renamebone "Arm_R" "bip_upperArm_R"
$renamebone "ArmTwist_R" "bip_Arm_R"
$renamebone "ArmTwist1_R" "bip_ArmTwist1_R"
$renamebone "ArmTwist2_R" "bip_ArmTwist2_R"
$renamebone "ArmTwist3_R" "bip_ArmTwist3_R"
$renamebone "Elbow_R" "bip_lowerArm_R"
$renamebone "HandTwist_R" "bip_HandTwist_R"
$renamebone "HandTwist1_R" "bip_HandTwist1_R"
$renamebone "HandTwist2_R" "bip_HandTwist2_R"
$renamebone "HandTwist3_R" "bip_HandTwist3_R"
$renamebone "Wrist_R" "bip_hand_R"
$renamebone "Thumb0_R" "ValveBiped.Bip01_R_Finger0"
$renamebone "Thumb1_R" "ValveBiped.Bip01_R_Finger01"
$renamebone "Thumb2_R" "ValveBiped.Bip01_R_Finger02"
$renamebone "IndexFinger1_R" "ValveBiped.Bip01_R_Finger1"
$renamebone "IndexFinger2_R" "ValveBiped.Bip01_R_Finger11"
$renamebone "IndexFinger3_R" "ValveBiped.Bip01_R_Finger12"
$renamebone "MiddleFinger1_R" "ValveBiped.Bip01_R_Finger2"
$renamebone "MiddleFinger2_R" "ValveBiped.Bip01_R_Finger21"
$renamebone "MiddleFinger3_R" "ValveBiped.Bip01_R_Finger22"
$renamebone "RingFinger1_R" "ValveBiped.Bip01_R_Finger3"
$renamebone "RingFinger2_R" "ValveBiped.Bip01_R_Finger31"
$renamebone "RingFinger3_R" "ValveBiped.Bip01_R_Finger32"
$renamebone "LittleFinger1_R" "ValveBiped.Bip01_R_Finger4"
$renamebone "LittleFinger2_R" "ValveBiped.Bip01_R_Finger41"
$renamebone "LittleFinger3_R" "ValveBiped.Bip01_R_Finger42"
//Left arm
$renamebone "cf_j_shoulder_L" "bip_collar_L"
$renamebone "Arm_L" "bip_upperArm_L"
$renamebone "ArmTwist_L" "bip_ArmTwist_L"
$renamebone "ArmTwist1_L" "bip_ArmTwist1_L"
$renamebone "ArmTwist2_L" "bip_ArmTwist2_L"
$renamebone "ArmTwist3_L" "bip_ArmTwist3_L"
$renamebone "Elbow_L" "bip_lowerArm_L"
$renamebone "HandTwist_L" "bip_HandTwist_L"
$renamebone "HandTwist1_L" "bip_HandTwist1_l"
$renamebone "HandTwist2_L" "bip_HandTwist2_l"
$renamebone "HandTwist3_L" "bip_HandTwist3_L"
//$renamebone "cf_s_hand_L" "bip_wristParent_L"
$renamebone "Wrist_L" "bip_hand_L"
$renamebone "Thumb0_L" "ValveBiped.Bip01_L_Finger0"
$renamebone "Thumb1_L" "ValveBiped.Bip01_L_Finger01"
$renamebone "Thumb2_L" "ValveBiped.Bip01_L_Finger02"
$renamebone "IndexFinger1_L" "ValveBiped.Bip01_L_Finger1"
$renamebone "IndexFinger2_L" "ValveBiped.Bip01_L_Finger11"
$renamebone "IndexFinger3_L" "ValveBiped.Bip01_L_Finger12"
$renamebone "MiddleFinger1_L" "ValveBiped.Bip01_L_Finger2"
$renamebone "MiddleFinger2_L" "ValveBiped.Bip01_L_Finger21"
$renamebone "MiddleFinger3_L" "ValveBiped.Bip01_L_Finger22"
$renamebone "RingFinger1_L" "ValveBiped.Bip01_L_Finger3"
$renamebone "RingFinger2_L" "ValveBiped.Bip01_L_Finger31"
$renamebone "RingFinger3_L" "ValveBiped.Bip01_L_Finger32"
$renamebone "LittleFinger1_L" "ValveBiped.Bip01_L_Finger4"
$renamebone "LittleFinger2_L" "ValveBiped.Bip01_L_Finger41"
$renamebone "LittleFinger3_L" "ValveBiped.Bip01_L_Finger42"
//LEGS
$renamebone "Leg_R" "bip_hip_R"
$renamebone "Leg_L" "bip_hip_L"
$renamebone "Knee_R" "bip_knee_R"
$renamebone "Knee_L" "bip_knee_L"
$renamebone "Ankle_R" "bip_foot_R"
$renamebone "Ankle_L" "bip_foot_L"
//Breast
$renamebone "AH1_L" "bip_breast_L"
$renamebone "AH1_R" "bip_breast_R"
//butt
$renamebone "cf_j_siri_L" "bip_butt_L"
$renamebone "cf_j_siri_R" "bip_butt_R"
$renamebone "cf_j_kokan" "bip_privates"
/////////////////////////////// Twist
$renamebone "cf_j_toes_L" "bip_toe_L"
$renamebone "cf_j_toes_R" "bip_toe_R"
$renamebone "cf_s_leg03_L" "bip_leg_twist_3_L"
$renamebone "cf_s_leg02_L" "bip_leg_twist_2_L"
$renamebone "cf_s_leg01_L" "bip_leg_twist_1_L"
$renamebone "cf_s_leg03_R" "bip_leg_twist_3_R"
$renamebone "cf_s_leg02_R" "bip_leg_twist_2_R"
$renamebone "cf_s_leg01_R" "bip_leg_twist_1_R"
$renamebone "cf_d_kneeF_L" "bip_knee_twist_1_L"
$renamebone "cf_d_kneeF_R" "bip_knee_twist_1_R"
$renamebone "cf_s_thigh03_L" "bip_thigh_twist_3_L"
$renamebone "cf_s_thigh02_L" "bip_thigh_twist_2_L"
$renamebone "cf_s_thigh01_L" "bip_thigh_twist_1_L"
$renamebone "cf_s_thigh03_R" "bip_thigh_twist_3_R"
$renamebone "cf_s_thigh02_R" "bip_thigh_twist_2_R"
$renamebone "cf_s_thigh01_R" "bip_thigh_twist_1_R"
/////
$renamebone "cf_s_shoulder02_L" "bip_shoulder_twist_L"
$renamebone "cf_s_arm01_L" "bip_arm_twist_1_L"
$renamebone "cf_s_arm02_L" "bip_arm_twist_2_L"
$renamebone "cf_s_arm03_L" "bip_arm_twist_3_L"
$renamebone "cf_s_elboback_L" "bip_elbow_twist_2_L"
$renamebone "cf_s_elbo_L" "bip_elbow_twist_1_L"
$renamebone "cf_s_forearm02_L" "bip_forarm_twist_1_L"
$renamebone "cf_d_wrist_L" "bip_wrist_twist_1_L"
$renamebone "cf_s_wrist_L" "bip_wrist_twist_2_L"
$renamebone "cf_d_hand_L" "bip_hand_twist_L"
$renamebone "cf_s_shoulder02_R" "bip_shoulder_twist_R"
$renamebone "cf_s_arm01_R" "bip_arm_twist_1_R"
$renamebone "cf_s_arm02_R" "bip_arm_twist_2_R"
$renamebone "cf_s_arm03_R" "bip_arm_twist_3_R"
$renamebone "cf_s_elboback_R" "bip_elbow_twist_2_R"
$renamebone "cf_s_elbo_R" "bip_elbow_twist_1_R"
$renamebone "cf_s_forearm02_R" "bip_forarm_twist_1_R"
$renamebone "cf_d_wrist_R" "bip_wrist_twist_1_R"
$renamebone "cf_s_wrist_R" "bip_wrist_twist_2_R"
$renamebone "cf_d_hand_R" "bip_hand_twist_R"
////
$renamebone "cf_j_waist02" "bip_pelvis_twist"
$renamebone "cf_s_waist01" "bip_waist_twist"
$renamebone "cf_s_waist02" "bip_waist2_twist"
$renamebone "cf_s_spine01" "bip_spine1_twist"
$renamebone "cf_s_spine02" "bip_spine2_twist"
$renamebone "cf_s_spine03" "bip_spine3_twist"