UE4Joint Auto Set HumanIK ~UE4のジョイントを自動でHumanIKに登録~

maya2016用

GroupNode
・Mesh
・SK_Mannequin/root
にしてから実行

Pythonで書き直した。2021年12月DragonNightにWaterモーション追加時に追記

Daz StudioのジョイントをHumanIKに追加用

# -*- coding: utf-8 -*- 
from maya import cmds 
import maya.mel as mel
import re
import pymel.core as pm 
def makeHumanIkDef_from_selected_groupName():
    selectedGlp=""
    characterName=""
    selectedArr=cmds.ls(sl=1)
    print("selectedArr= "+str(selectedArr))
    if(str(selectedArr)=="[]"):
        print("You Should Select root Group Node!!!")
    else:
        selectedGlp=selectedArr[0]
        characterName=pm.mel.hikCreateCharacter(selectedGlp)
    #evalStr='$characterName = `hikCreateCharacter('+selectedGlp+')`'
    #myPythonVar=mel.eval('$tempMelVar=$gMainWindow')
    #characterName=mel.eval(evalStr)
    print(u"characterName= " + str(characterName))
    return characterName,selectedGlp
def LongNameToShortName(LongName):
    #childfullpath= |group_meshHIK_Tpose_jointUE4name5|SK_Mannequin|root|hip|spine_01
    LongNameArr=LongName.split("|")
    LongNameArrLong=len(LongNameArr)
    shortName=LongNameArr[LongNameArrLong-1]
    return shortName
    
def Group_in_joint(GroupName,jointName):
    print("jointName= "+jointName)
    HitJointFullPath=""
    groupChild=cmds.ls(GroupName,dag=1,long=1)
    for childfullpath in groupChild:
        searchStr=r'.*'+'\|'+jointName+r'$'
        print("searchStr= "+searchStr +"    childfullpath= "+childfullpath)
        MatchObj=re.match(searchStr, childfullpath)
        MatchBool=bool(MatchObj)
        if(MatchBool==True):
            HitJointFullPath=childfullpath
            print("HitJointFullPath !!!!!!!!= "+HitJointFullPath)
            break
        #shortjointNameArr=cmds.ls(childfullpath,shortNames=1)
        #shortjointName=shortjointNameArr[0]
        shortjointName=LongNameToShortName(childfullpath)
        print("searchStr= "+jointName +"    shortjointName= "+shortjointName)
        if(str(shortjointName)==str(jointName)):
            HitJointFullPath=childfullpath
            print("HitJointFullPath !!!!!!!!= "+shortjointName)
            break
    print("HitJointFullPath= "+HitJointFullPath)
    return HitJointFullPath 

def setCharacterObject(GroupName,jointName,characterDefName,RigInt,RigInt2):
    #MEL setCharacterObject("root",$characterDefName,0,0);
    jointFullName=Group_in_joint(GroupName,jointName)
    evalStr='setCharacterObject("'+jointFullName+'","'+characterDefName+'",'+str(RigInt)+','+str(RigInt2)+');'
    print("evalStr= "+ evalStr)
    mel.eval(evalStr)
       
def UE4JointSetToHumanIK():
    characterDefName,GroupName= makeHumanIkDef_from_selected_groupName()
    #print("characterDefName= "+characterDefName)
    setCharacterObject(GroupName,"root",characterDefName,0,0);
    setCharacterObject(GroupName,"hip",characterDefName,1,0);
    setCharacterObject(GroupName,"thigh_l",characterDefName,2,0);
    setCharacterObject(GroupName,"calf_l",characterDefName,3,0);
    setCharacterObject(GroupName,"foot_l",characterDefName,4,0);
    setCharacterObject(GroupName,"thigh_r",characterDefName,5,0);
    setCharacterObject(GroupName,"calf_r",characterDefName,6,0);
    setCharacterObject(GroupName,"foot_r",characterDefName,7,0);
    setCharacterObject(GroupName,"spine_01",characterDefName,8,0);
    setCharacterObject(GroupName,"upperarm_l",characterDefName,9,0);
    setCharacterObject(GroupName,"lowerarm_l",characterDefName,10,0);
    setCharacterObject(GroupName,"hand_l",characterDefName,11,0);
    setCharacterObject(GroupName,"upperarm_r",characterDefName,12,0);
    setCharacterObject(GroupName,"lowerarm_r",characterDefName,13,0);
    setCharacterObject(GroupName,"hand_r",characterDefName,14,0);
    setCharacterObject(GroupName,"head",characterDefName,15,0);
    
    setCharacterObject(GroupName,"thumb_02_l",characterDefName,50,0);
    setCharacterObject(GroupName,"thumb_03_l",characterDefName,51,0);
    setCharacterObject(GroupName,"thumb_04_l",characterDefName,52,0);
    setCharacterObject(GroupName,"index_01_l",characterDefName,54,0);
    setCharacterObject(GroupName,"index_02_l",characterDefName,55,0);
    setCharacterObject(GroupName,"index_03_l",characterDefName,56,0);
    setCharacterObject(GroupName,"middle_01_l",characterDefName,58,0);
    setCharacterObject(GroupName,"middle_02_l",characterDefName,59,0);
    setCharacterObject(GroupName,"middle_03_l",characterDefName,60,0);
    setCharacterObject(GroupName,"ring_01_l",characterDefName,62,0);
    setCharacterObject(GroupName,"ring_02_l",characterDefName,63,0);
    setCharacterObject(GroupName,"ring_03_l",characterDefName,64,0);
    setCharacterObject(GroupName,"pinky_01_l",characterDefName,66,0);
    setCharacterObject(GroupName,"pinky_02_l",characterDefName,67,0);
    setCharacterObject(GroupName,"pinky_03_l",characterDefName,68,0);

    setCharacterObject(GroupName,"thumb_02_r",characterDefName,74,0);
    setCharacterObject(GroupName,"thumb_03_r",characterDefName,75,0);
    setCharacterObject(GroupName,"thumb_04_r",characterDefName,76,0);
    setCharacterObject(GroupName,"index_01_r",characterDefName,78,0);
    setCharacterObject(GroupName,"index_02_r",characterDefName,79,0);
    setCharacterObject(GroupName,"index_03_r",characterDefName,80,0);
    setCharacterObject(GroupName,"middle_01_r",characterDefName,82,0);
    setCharacterObject(GroupName,"middle_02_r",characterDefName,83,0);
    setCharacterObject(GroupName,"middle_03_r",characterDefName,84,0);
    setCharacterObject(GroupName,"ring_01_r",characterDefName,86,0);
    setCharacterObject(GroupName,"ring_02_r",characterDefName,87,0);
    setCharacterObject(GroupName,"ring_03_r",characterDefName,88,0);
    setCharacterObject(GroupName,"pinky_01_r",characterDefName,90,0);
    setCharacterObject(GroupName,"pinky_02_r",characterDefName,91,0);
    setCharacterObject(GroupName,"pinky_03_r",characterDefName,92,0);
    
UE4JointSetToHumanIK()

MEL(UE4グレイマンジョイントをリファレンスしてる場合) Ver.3

//selected_gloup_nodeName_to_HumanIKCharacterName UE4 joint Refferenced. Ver3  
//you shuld Select Root Joint

global proc string makeHumanIkDef_from_selected_groupName()
{
    string $selectedArr[] = `ls -sl`;
    print($selectedArr);
    string $selectedGlp = $selectedArr[0];
    $characterName = `hikCreateCharacter($selectedGlp)`;
    print("characterName= "+$characterName+"\n");
    return $characterName;
};

global proc string Get_RefferenceName_selected_groupName()
{
    string $RefferenceName ="";
    string $selectedArr[] = `ls -sl`;
    print($selectedArr);
    string $selectedGlp = $selectedArr[0];
    string $buffer[];
    $numTokens = `tokenize $selectedGlp ":" $buffer`;
    //print("$buffer= "+$buffer+"\n");
    $RefferenceName=$buffer[0];
    print("$RefferenceName= "+$RefferenceName+"\n");
    return $RefferenceName;
};




global proc UE4JointSetToHumanIK()
{
    string $selectedArr[] = `ls -sl`;
    print($selectedArr);
    if($selectedArr[0]==""){
        print("You Should Select joint And Mesh Group!!!!!!!");
    }else{
        
        $RefferenceName= `Get_RefferenceName_selected_groupName`;
        print("$RefferenceName= "+$RefferenceName+"\n");
        
        $characterDefName= `makeHumanIkDef_from_selected_groupName`;
        print("characterDefName= "+$characterDefName+"\n");
        
        
        
        //setCharacterObject to UnrealEngine4 (UE4)Joint
        setCharacterObject($RefferenceName+":root",$characterDefName,0,0);
        setCharacterObject($RefferenceName+":pelvis",$characterDefName,1,0);
        setCharacterObject($RefferenceName+":thigh_l",$characterDefName,2,0);
        setCharacterObject($RefferenceName+":calf_l",$characterDefName,3,0);
        setCharacterObject($RefferenceName+":foot_l",$characterDefName,4,0);
        setCharacterObject($RefferenceName+":thigh_r",$characterDefName,5,0);
        setCharacterObject($RefferenceName+":calf_r",$characterDefName,6,0);
        setCharacterObject($RefferenceName+":foot_r",$characterDefName,7,0);
        setCharacterObject($RefferenceName+":spine_01 ",$characterDefName,8,0);
        setCharacterObject($RefferenceName+":upperarm_l ",$characterDefName,9,0);
        setCharacterObject($RefferenceName+":lowerarm_l ",$characterDefName,10,0);
        setCharacterObject($RefferenceName+":hand_l ",$characterDefName,11,0);
        setCharacterObject($RefferenceName+":upperarm_r ",$characterDefName,12,0);
        setCharacterObject($RefferenceName+":lowerarm_r ",$characterDefName,13,0);
        setCharacterObject($RefferenceName+":hand_r ",$characterDefName,14,0);
        setCharacterObject($RefferenceName+":head ",$characterDefName,15,0);
        
        setCharacterObject($RefferenceName+":thumb_01_l ",$characterDefName,50,0);
        setCharacterObject($RefferenceName+":thumb_02_l ",$characterDefName,51,0);
        setCharacterObject($RefferenceName+":thumb_03_l ",$characterDefName,52,0);
        setCharacterObject($RefferenceName+":index_01_l ",$characterDefName,54,0);
        setCharacterObject($RefferenceName+":index_02_l ",$characterDefName,55,0);
        setCharacterObject($RefferenceName+":index_03_l ",$characterDefName,56,0);
        setCharacterObject($RefferenceName+":middle_01_l ",$characterDefName,58,0);
        setCharacterObject($RefferenceName+":middle_02_l ",$characterDefName,59,0);
        setCharacterObject($RefferenceName+":middle_03_l ",$characterDefName,60,0);
        setCharacterObject($RefferenceName+":ring_01_l ",$characterDefName,62,0);
        setCharacterObject($RefferenceName+":ring_02_l ",$characterDefName,63,0);
        setCharacterObject($RefferenceName+":ring_03_l ",$characterDefName,64,0);
        setCharacterObject($RefferenceName+":pinky_01_l ",$characterDefName,66,0);
        setCharacterObject($RefferenceName+":pinky_02_l ",$characterDefName,67,0);
        setCharacterObject($RefferenceName+":pinky_03_l ",$characterDefName,68,0);
        
        setCharacterObject($RefferenceName+":thumb_01_r ",$characterDefName,74,0);
        setCharacterObject($RefferenceName+":thumb_02_r ",$characterDefName,75,0);
        setCharacterObject($RefferenceName+":thumb_03_r ",$characterDefName,76,0);
        setCharacterObject($RefferenceName+":index_01_r ",$characterDefName,78,0);
        setCharacterObject($RefferenceName+":index_02_r ",$characterDefName,79,0);
        setCharacterObject($RefferenceName+":index_03_r ",$characterDefName,80,0);
        setCharacterObject($RefferenceName+":middle_01_r ",$characterDefName,82,0);
        setCharacterObject($RefferenceName+":middle_02_r ",$characterDefName,83,0);
        setCharacterObject($RefferenceName+":middle_03_r ",$characterDefName,84,0);
        setCharacterObject($RefferenceName+":ring_01_r ",$characterDefName,86,0);
        setCharacterObject($RefferenceName+":ring_02_r ",$characterDefName,87,0);
        setCharacterObject($RefferenceName+":ring_03_r ",$characterDefName,88,0);
        setCharacterObject($RefferenceName+":pinky_01_r ",$characterDefName,90,0);
        setCharacterObject($RefferenceName+":pinky_02_r ",$characterDefName,91,0);
        setCharacterObject($RefferenceName+":pinky_03_r ",$characterDefName,92,0);
    }
};
UE4JointSetToHumanIK()

MEL(UE4ジョイントがシーンに2つある場合用) hipがないタイプ用

//selected_group_nodeName_to_HumanIKCharacterName
string $selectedArr[] = `ls -sl`;
print($selectedArr);
string $selectedGlp = $selectedArr[0];
global proc string makeHumanIkDef_from_selected_groupName()
{
    string $selectedArr[] = `ls -sl`;
    print($selectedArr);
    string $selectedGlp = $selectedArr[0];
    $characterName = `hikCreateCharacter($selectedGlp)`;
    print("characterName= "+$characterName+"\n");
    return $characterName;
};
global proc UE4_pelvis_JointSetToHumanIK_FullPath(string $selectedGlp)
{
$characterDefName= `makeHumanIkDef_from_selected_groupName`;
print("characterDefName= "+$characterDefName+"\n");

//setCharacterObject to UnrealEngine4 (UE4)Joint
setCharacterObject($selectedGlp+"|SK_Mannequin|root",$characterDefName,0,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis",$characterDefName,1,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|thigh_l",$characterDefName,2,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|thigh_l|calf_l",$characterDefName,3,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|thigh_l|calf_l|foot_l",$characterDefName,4,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|thigh_r",$characterDefName,5,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|thigh_r|calf_r",$characterDefName,6,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|thigh_r|calf_r|foot_r",$characterDefName,7,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01 ",$characterDefName,8,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l",$characterDefName,9,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l",$characterDefName,10,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l",$characterDefName,11,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r",$characterDefName,12,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r",$characterDefName,13,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r",$characterDefName,14,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|neck_01|head",$characterDefName,15,0);

setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|thumb_01_l",$characterDefName,50,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|thumb_01_l|thumb_02_l",$characterDefName,51,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|thumb_01_l|thumb_02_l|thumb_03_l",$characterDefName,52,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|index_01_l",$characterDefName,54,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|index_01_l|index_02_l",$characterDefName,55,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|index_01_l|index_02_l|index_03_l",$characterDefName,56,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|middle_01_l",$characterDefName,58,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|middle_01_l|middle_02_l",$characterDefName,59,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|middle_01_l|middle_02_l|middle_03_l",$characterDefName,60,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|ring_01_l",$characterDefName,62,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|ring_01_l|ring_02_l",$characterDefName,63,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|ring_01_l|ring_02_l|ring_03_l",$characterDefName,64,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|pinky_01_l",$characterDefName,66,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|pinky_01_l|pinky_02_l",$characterDefName,67,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|pinky_01_l|pinky_02_l|pinky_03_l",$characterDefName,68,0);

setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|thumb_01_r",$characterDefName,74,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|thumb_01_r|thumb_02_r",$characterDefName,75,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|thumb_01_r|thumb_02_r|thumb_03_r",$characterDefName,76,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|index_01_r",$characterDefName,78,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|index_01_r|index_02_r",$characterDefName,79,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|index_01_r|index_02_r|index_03_r",$characterDefName,80,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|middle_01_r",$characterDefName,82,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|middle_01_r|middle_02_r",$characterDefName,83,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|middle_01_r|middle_02_r|middle_03_r",$characterDefName,84,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|ring_01_r",$characterDefName,86,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|ring_01_r|ring_02_r",$characterDefName,87,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|ring_01_r|ring_02_r|ring_03_r",$characterDefName,88,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|pinky_01_r",$characterDefName,90,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|pinky_01_r|pinky_02_r",$characterDefName,91,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|pelvis|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|pinky_01_r|pinky_02_r|pinky_03_r",$characterDefName,92,0);
}
UE4_pelvis_JointSetToHumanIK_FullPath($selectedGlp)

MEL (UE4ジョイントがシーンに2つある場合用) hipがあるタイプ用

//selected_gloup_nodeName_to_HumanIKCharacterName
string $selectedArr[] = `ls -sl`;
print($selectedArr);
string $selectedGlp = $selectedArr[0];
global proc string makeHumanIkDef_from_selected_groupName()
{
    string $selectedArr[] = `ls -sl`;
    print($selectedArr);
    string $selectedGlp = $selectedArr[0];
    $characterName = `hikCreateCharacter($selectedGlp)`;
    print("characterName= "+$characterName+"\n");
    return $characterName;
};
global proc UE4JointSetToHumanIK_FullPath(string $selectedGlp)
{
$characterDefName= `makeHumanIkDef_from_selected_groupName`;
print("characterDefName= "+$characterDefName+"\n");

//setCharacterObject to UnrealEngine4 (UE4)Joint
setCharacterObject($selectedGlp+"|SK_Mannequin|root",$characterDefName,0,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip",$characterDefName,1,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|pelvis|thigh_l",$characterDefName,2,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|pelvis|thigh_l|calf_l",$characterDefName,3,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|pelvis|thigh_l|calf_l|foot_l",$characterDefName,4,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|pelvis|thigh_r",$characterDefName,5,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|pelvis|thigh_r|calf_r",$characterDefName,6,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|pelvis|thigh_r|calf_r|foot_r",$characterDefName,7,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01 ",$characterDefName,8,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l",$characterDefName,9,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l",$characterDefName,10,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l",$characterDefName,11,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r",$characterDefName,12,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r",$characterDefName,13,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r",$characterDefName,14,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|neck_01|neckUpper|head",$characterDefName,15,0);

setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|thumb_01_l",$characterDefName,50,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|thumb_01_l|thumb_02_l",$characterDefName,51,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|thumb_01_l|thumb_02_l|thumb_03_l",$characterDefName,52,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|index_01_l",$characterDefName,54,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|index_01_l|index_02_l",$characterDefName,55,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|index_01_l|index_02_l|index_03_l",$characterDefName,56,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|middle_01_l",$characterDefName,58,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|middle_01_l|middle_02_l",$characterDefName,59,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|middle_01_l|middle_02_l|middle_03_l",$characterDefName,60,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|ring_01_l",$characterDefName,62,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|ring_01_l|ring_02_l",$characterDefName,63,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|ring_01_l|ring_02_l|ring_03_l",$characterDefName,64,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|pinky_01_l",$characterDefName,66,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|pinky_01_l|pinky_02_l",$characterDefName,67,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_l|upperarm_l|lowerarm_l|hand_l|pinky_01_l|pinky_02_l|pinky_03_l",$characterDefName,68,0);

setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|thumb_01_r",$characterDefName,74,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|thumb_01_r|thumb_02_r",$characterDefName,75,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|thumb_01_r|thumb_02_r|thumb_03_r",$characterDefName,76,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|index_01_r",$characterDefName,78,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|index_01_r|index_02_r",$characterDefName,79,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|index_01_r|index_02_r|index_03_r",$characterDefName,80,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|middle_01_r",$characterDefName,82,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|middle_01_r|middle_02_r",$characterDefName,83,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|middle_01_r|middle_02_r|middle_03_r",$characterDefName,84,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|ring_01_r",$characterDefName,86,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|ring_01_r|ring_02_r",$characterDefName,87,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|ring_01_r|ring_02_r|ring_03_r",$characterDefName,88,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|pinky_01_r",$characterDefName,90,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|pinky_01_r|pinky_02_r",$characterDefName,91,0);
setCharacterObject($selectedGlp+"|SK_Mannequin|root|hip|spine_01|spine_02|spine_03|clavicle_r|upperarm_r|lowerarm_r|hand_r|pinky_01_r|pinky_02_r|pinky_03_r",$characterDefName,92,0);
}
UE4JointSetToHumanIK_FullPath($selectedGlp)

MEL (UE4 ジョイントはシーンに1つ用)

//selected_gloup_nodeName_to_HumanIKCharacterName
global proc string makeHumanIkDef_from_selected_groupName()
{
    string $selectedArr[] = `ls -sl`;
    print($selectedArr);
    string $selectedGlp = $selectedArr[0];
    $characterName = `hikCreateCharacter($selectedGlp)`;
    print("characterName= "+$characterName+"\n");
    return $characterName;
};
global proc UE4JointSetToHumanIK()
{
$characterDefName= `makeHumanIkDef_from_selected_groupName`;
print("characterDefName= "+$characterDefName+"\n");

//setCharacterObject to UnrealEngine4 (UE4)Joint
setCharacterObject("root",$characterDefName,0,0);
setCharacterObject("root|hip",$characterDefName,1,0);
setCharacterObject("thigh_l",$characterDefName,2,0);
setCharacterObject("calf_l",$characterDefName,3,0);
setCharacterObject("foot_l",$characterDefName,4,0);
setCharacterObject("thigh_r",$characterDefName,5,0);
setCharacterObject("calf_r",$characterDefName,6,0);
setCharacterObject("foot_r",$characterDefName,7,0);
setCharacterObject("spine_01 ",$characterDefName,8,0);
setCharacterObject("upperarm_l ",$characterDefName,9,0);
setCharacterObject("lowerarm_l ",$characterDefName,10,0);
setCharacterObject("hand_l ",$characterDefName,11,0);
setCharacterObject("upperarm_r ",$characterDefName,12,0);
setCharacterObject("lowerarm_r ",$characterDefName,13,0);
setCharacterObject("hand_r ",$characterDefName,14,0);
setCharacterObject("neck_01|neckUpper|head ",$characterDefName,15,0);

setCharacterObject("thumb_01_l ",$characterDefName,50,0);
setCharacterObject("thumb_02_l ",$characterDefName,51,0);
setCharacterObject("thumb_03_l ",$characterDefName,52,0);
setCharacterObject("index_01_l ",$characterDefName,54,0);
setCharacterObject("index_02_l ",$characterDefName,55,0);
setCharacterObject("index_03_l ",$characterDefName,56,0);
setCharacterObject("middle_01_l ",$characterDefName,58,0);
setCharacterObject("middle_02_l ",$characterDefName,59,0);
setCharacterObject("middle_03_l ",$characterDefName,60,0);
setCharacterObject("ring_01_l ",$characterDefName,62,0);
setCharacterObject("ring_02_l ",$characterDefName,63,0);
setCharacterObject("ring_03_l ",$characterDefName,64,0);
setCharacterObject("pinky_01_l ",$characterDefName,66,0);
setCharacterObject("pinky_02_l ",$characterDefName,67,0);
setCharacterObject("pinky_03_l ",$characterDefName,68,0);

setCharacterObject("thumb_01_r ",$characterDefName,74,0);
setCharacterObject("thumb_02_r ",$characterDefName,75,0);
setCharacterObject("thumb_03_r ",$characterDefName,76,0);
setCharacterObject("index_01_r ",$characterDefName,78,0);
setCharacterObject("index_02_r ",$characterDefName,79,0);
setCharacterObject("index_03_r ",$characterDefName,80,0);
setCharacterObject("middle_01_r ",$characterDefName,82,0);
setCharacterObject("middle_02_r ",$characterDefName,83,0);
setCharacterObject("middle_03_r ",$characterDefName,84,0);
setCharacterObject("ring_01_r ",$characterDefName,86,0);
setCharacterObject("ring_02_r ",$characterDefName,87,0);
setCharacterObject("ring_03_r ",$characterDefName,88,0);
setCharacterObject("pinky_01_r ",$characterDefName,90,0);
setCharacterObject("pinky_02_r ",$characterDefName,91,0);
setCharacterObject("pinky_03_r ",$characterDefName,92,0);
}
UE4JointSetToHumanIK()

Python のsetCharacterObjectはないみたい。mel.evalで呼ぶこともできるかなあ。

ちょっとめんどいのでまた今度。

UE4ジョイントが二つあった場合にうまく動かないのでフルパスに更新予定

//以下調べもの用

HumanIKをコマンドで操作する
https://qiita.com/amanatsu-knit/items/8c66297b012d74f7438a

whatIs hikCreateCharacter;
whatIs setCharacterObject;
C:/Program Files/Autodesk/Maya2016/scripts/others/hikGlobalUtils.mel

[MEL] 戻り値を配列で返す
なぜかずっと出来ないと思っていた、
プロシージャの戻り値を配列で返す方法。
以下サンプル。

proc string[] sample(string $param[])
{
string $return[];
for ($i = 0 ; $i < size($param) ; $i++)
{
$return[$i] = “Re_”+$param[$i];
}
return $return;
}

sample({“aaa”,”bbb”,”ccc”});
// Result: Re_aaa Re_bbb Re_ccc //

//HumanIKのコントローラー番号
for($i = 0; $i < 212; $i++)
{
$HIKname = GetHIKNodeName($i);
print ($i + ” :” + $HIKname + “\n”);
};
0 :Reference
1 :Hips
2 :LeftUpLeg
3 :LeftLeg
4 :LeftFoot
5 :RightUpLeg
6 :RightLeg
7 :RightFoot
8 :Spine
9 :LeftArm
10 :LeftForeArm
11 :LeftHand
12 :RightArm
13 :RightForeArm
14 :RightHand
15 :Head
16 :LeftToeBase
17 :RightToeBase
18 :LeftShoulder
19 :RightShoulder
20 :Neck
21 :LeftFingerBase
22 :RightFingerBase
23 :Spine1
24 :Spine2
25 :Spine3
26 :Spine4
27 :Spine5
28 :Spine6
29 :Spine7
30 :Spine8
31 :Spine9
32 :Neck1
33 :Neck2
34 :Neck3
35 :Neck4
36 :Neck5
37 :Neck6
38 :Neck7
39 :Neck8
40 :Neck9
41 :LeftUpLegRoll
42 :LeftLegRoll
43 :RightUpLegRoll
44 :RightLegRoll
45 :LeftArmRoll
46 :LeftForeArmRoll
47 :RightArmRoll
48 :RightForeArmRoll
49 :HipsTranslation
50 :LeftHandThumb1
51 :LeftHandThumb2
52 :LeftHandThumb3
53 :LeftHandThumb4
54 :LeftHandIndex1
55 :LeftHandIndex2
56 :LeftHandIndex3
57 :LeftHandIndex4
58 :LeftHandMiddle1
59 :LeftHandMiddle2
60 :LeftHandMiddle3
61 :LeftHandMiddle4
62 :LeftHandRing1
63 :LeftHandRing2
64 :LeftHandRing3
65 :LeftHandRing4
66 :LeftHandPinky1
67 :LeftHandPinky2
68 :LeftHandPinky3
69 :LeftHandPinky4
70 :LeftHandExtraFinger1
71 :LeftHandExtraFinger2
72 :LeftHandExtraFinger3
73 :LeftHandExtraFinger4
74 :RightHandThumb1
75 :RightHandThumb2
76 :RightHandThumb3
77 :RightHandThumb4
78 :RightHandIndex1
79 :RightHandIndex2
80 :RightHandIndex3
81 :RightHandIndex4
82 :RightHandMiddle1
83 :RightHandMiddle2
84 :RightHandMiddle3
85 :RightHandMiddle4
86 :RightHandRing1
87 :RightHandRing2
88 :RightHandRing3
89 :RightHandRing4
90 :RightHandPinky1
91 :RightHandPinky2
92 :RightHandPinky3
93 :RightHandPinky4
94 :RightHandExtraFinger1
95 :RightHandExtraFinger2
96 :RightHandExtraFinger3
97 :RightHandExtraFinger4
98 :LeftFootThumb1
99 :LeftFootThumb2
100 :LeftFootThumb3
101 :LeftFootThumb4
102 :LeftFootIndex1
103 :LeftFootIndex2
104 :LeftFootIndex3
105 :LeftFootIndex4
106 :LeftFootMiddle1
107 :LeftFootMiddle2
108 :LeftFootMiddle3
109 :LeftFootMiddle4
110 :LeftFootRing1
111 :LeftFootRing2
112 :LeftFootRing3
113 :LeftFootRing4
114 :LeftFootPinky1
115 :LeftFootPinky2
116 :LeftFootPinky3
117 :LeftFootPinky4
118 :LeftFootExtraFinger1
119 :LeftFootExtraFinger2
120 :LeftFootExtraFinger3
121 :LeftFootExtraFinger4
122 :RightFootThumb1
123 :RightFootThumb2
124 :RightFootThumb3
125 :RightFootThumb4
126 :RightFootIndex1
127 :RightFootIndex2
128 :RightFootIndex3
129 :RightFootIndex4
130 :RightFootMiddle1
131 :RightFootMiddle2
132 :RightFootMiddle3
133 :RightFootMiddle4
134 :RightFootRing1
135 :RightFootRing2
136 :RightFootRing3
137 :RightFootRing4
138 :RightFootPinky1
139 :RightFootPinky2
140 :RightFootPinky3
141 :RightFootPinky4
142 :RightFootExtraFinger1
143 :RightFootExtraFinger2
144 :RightFootExtraFinger3
145 :RightFootExtraFinger4
146 :LeftInHandThumb
147 :LeftInHandIndex
148 :LeftInHandMiddle
149 :LeftInHandRing
150 :LeftInHandPinky
151 :LeftInHandExtraFinger
152 :RightInHandThumb
153 :RightInHandIndex
154 :RightInHandMiddle
155 :RightInHandRing
156 :RightInHandPinky
157 :RightInHandExtraFinger
158 :LeftInFootThumb
159 :LeftInFootIndex
160 :LeftInFootMiddle
161 :LeftInFootRing
162 :LeftInFootPinky
163 :LeftInFootExtraFinger
164 :RightInFootThumb
165 :RightInFootIndex
166 :RightInFootMiddle
167 :RightInFootRing
168 :RightInFootPinky
169 :RightInFootExtraFinger
170 :LeftShoulderExtra
171 :RightShoulderExtra
172 :
173 :
174 :
175 :
176 :

UE4でBluePrintでテキストファイルを読み込む方法(UE4.26)

以下のサイトを参考にさせていただきました。
https://horizonglow2.blogspot.com/2019/02/ue4.html

新規C++クラスを作成します。
作成するのは、成果物がBPで扱えるBlueprint Function Libraryになります。

フォルダやクラス名を適当に決めたら、VisualStudioが開きます。
まず.hファイルに定義を書きます。
ここではTextFileToStringというクラスを作成することにします。
書いたコードはこんな感じ。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "TextFileToString.generated.h"

/**
 * 
 */
UCLASS()
class AMBITIONEARLYHOURSKY_API UTextFileToString : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

		UFUNCTION(BlueprintCallable, Category = "MyBPLibrary")
		static void TextFileLoadToString(FString Filename, FString& FileData, bool& Success);
	
};

CPPはこう

// Fill out your copyright notice in the Description page of Project Settings.


#include "TextFileToString.h"

// ScriptLoader.cpp

//#include "FileHelpers.h"
#include "Engine.h"


// ScriptLoader.cpp
void UTextFileToString::TextFileLoadToString(FString Filename, FString& FileData, bool& Success)
{
	if (GEngine)
	{
		FString FilePath = Filename;

		if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*FilePath))
		{
			Success = false;
			return;
		}

		const int64 FileSize = FPlatformFileManager::Get().GetPlatformFile().FileSize(*FilePath);
		FFileHelper::LoadFileToString(FileData, *FilePath);
		Success = true;

	}
	Success = false;
}

こんなノードの使い方します。

UE4でBluePrintの変数の値をテキストファイルとして保存する方法(UE4.26)

以下を参考にさせてもらいました。

https://htsuda.net/archives/1815

プロジェクトファイル(拡張子が .uproject となっているファイル)があるフォルダの中に Source という名前のフォルダをまず作成します。次にC++ プロジェクトを作成します。プロジェクトファイルを右クリックすると、メニューの中に Generate Visual Studio project files というのがあるのでそれをクリックします。

レベルエディタのメニューから「ファイル File」> 「新規C++クラス New C++ Class」を選びます。親クラスは Actor にします。ファイル名は SaveToText とします。公開設定はパブリックを選んでおきます。クラス作成ボタンを押すとしばらくのコンパイル時間の後にヘッダファイルと cpp ファイルが作成され、VS が開きます。

C++ のエディタが開いていない場合はコンテンツブラウザの C++ クラス(C++ Classes)フォルダ内にある SaveToText のファイルをダブルクリックします。そして、SaveToText.hと SaveToText.cpp を下記のように書き換えます。

クラス名の自動生成されている部分class ゲーム名_APIは書き換えずにおきます。
class AMBITIONEARLYHOURSKY_API USaveToText : public UBlueprintFunctionLibrary
あとは
public: の行以下の部分を追加するだけでOKです。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "SaveToText.generated.h"

UCLASS()
class AMBITIONEARLYHOURSKY_API USaveToText : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	
public:	
    UFUNCTION(BlueprintCallable, Category = "save")
        static bool FileSaveString(FString SaveTextB, FString FileNameB);

    UFUNCTION(BlueprintPure, Category = "save")
        static bool FileLoadString(FString FileNameA, FString& SaveTextA);

    UFUNCTION(BlueprintCallable, Category = "save")
        static FString FileLoadAndReturnString(FString FileNameA);

};

cpp ファイルも下記記のように編集します。以下のコードは https://answers.unrealengine.com/questions/174839/loading-text-to-a-string.html で紹介されているものです(保存以外にもテキストファイルの読み込み関数があります)。ちなみに、クラス名は ASaveToText と先頭に A が付いていますが、これが U であったりする場合もあります。その場合は cpp ファイルの中でクラス名が付いている箇所もそれに合わせるようにしてください。コンパイル時にエラーが出た時はヘッダと cpp ファイルでクラス名が一致していないことが原因だと思われます

// Fill out your copyright notice in the Description page of Project Settings.


#include "SaveToText.h"

// Load and save text files
bool USaveToText::FileSaveString(FString SaveTextB, FString FileNameB)
{
    return FFileHelper::SaveStringToFile(SaveTextB, *( FileNameB));
}

bool USaveToText::FileLoadString(FString FileNameA, FString& SaveTextA)
{
    return FFileHelper::LoadFileToString(SaveTextA, *( FileNameA));
}

FString USaveToText::FileLoadAndReturnString(FString FileNameA)
{
    FString myString;
    bool myBool = true;
    myBool = FFileHelper::LoadFileToString(myString, *( FileNameA));
    return myString;
}

h と .cpp ファイルを保存したら、UE4 のエディタ上でコンパイルボタン(ビルドボタンの右にある)を押します。コンパイルが成功したら作ったこの関数をブループリントで使えるようになります。

レベルブループリントなどを開いて記事冒頭のようなノードを組みます。

そして実行すれば、プロジェクトフォルダ内にテキストファイルが保存されています。やりました!

ThirdPerson Idol UE4 upperarm_twist_01_l is Not shoulder Position

ThirdPerson Idol UE4 upperarm_twist_01_l is Not shoulder Position

Steps.
Step01 Make ThirdPerson Project
Step02 Export FBX ThirdPersonIdle
Step03 Checkbox All OFF
Step04 Checkbox Only Export PreviewMesh ON
Step05 Export
Step06 Open FBX
Step07 Check upperarm_twist_01_l is Not shoulder Position
Step08 Check lowerarm_twist_01_l is Not hand_l Position

Step07 Check upperarm_twist_01_l is shoulder Position
Step08 Check lowerarm_twist_01_l is hand_l Position

ThirdPersonIdle.FBX
ThirdPerson_Jump.FBX
ThirdPersonJump_End.FBX
ThirdPersonJump_Loop.FBX
ThirdPersonJump_Start.FBX
ThirdPersonRun.FBX
ThirdPersonWalk.FBX
is All Have this miss takes

nobolu.ootsuka.unrealengine@gmail.com

UE4 でパッケージ化のエラーを特定する方法

UE4 でパッケージ化のエラーを特定する方法
アウトプットログは右クリックして
ログをクリアしてからパッケージ化することで
しっかり
パッケージ化のエラーだけを
表示してくれるようになる。

あたりまえだけどしっかりやらないと他の関係ないエラーを追う結果になる。

プログラムを含んでないコンテンツの場合だいたいが

UATHelper: パッケージ化 (Windows (64-bit)): BUILD COMMAND COMPLETED
UATHelper: パッケージ化 (Windows (64-bit)): COOK COMMAND STARTED

コンテンツのクックが始まり

ここらへんのエラーを治したら直った。
いらないアニメーションブレンド1Dを削除したら解決した。

UATHelper: パッケージ化 (Windows (64-bit)): LogCook: Display: Cooked packages 587 Packages Remain 44 Total 631
UATHelper: パッケージ化 (Windows (64-bit)): LogCook: Display: Cooked packages 588 Packages Remain 16 Total 604
UATHelper: パッケージ化 (Windows (64-bit)): LogCook: Display: Cooked packages 588 Packages Remain 0 Total 588
UATHelper: パッケージ化 (Windows (64-bit)): LogCook: Display: Finishing up…

となるみたい。

AポーズからTポーズにしてモーションの流し込みやすいMaya HumanIKスケルトンにキレイにモデルを合わせる方法1~Duplicateで固まるメッシュ※0 を使う方法~

AポーズからTポーズにしてモーションの流し込みやすいMaya HumanIKスケルトンにキレイにモデルを合わせる方法1~Duplicateで固まるメッシュ※0 を使う方法~

きれいにというのは「もとのAポーズのモデルのスキンウェイトをつかってTポーズにしようとしてる」と「新しいjointはできるだけHumanIKのジョイントで作ることでHumanIKでバグらせないことが目標」

大きな流れは
 ジョイントをHIKに差し替え→AポーズからTポーズ→Tポーズでのバインド

1,AposeモデルにMeshEdit用のApose JointをHumanIKスケルトンを複製して作る
(これでHumanIKのベースのジョイント方向や階層構造をキープすると流し込みが完璧になる)
2,そのMeshEdit用のjointをスケールしないで移動と回転などしてApose Meshに合わせる。
2.5,MayaHumanIKにはない頭のジョイントをコピーして親子付けする※1

3,Apose MeshにあわせたそのMeshEdit用のApose jointとApose meshをスキンのバインドする 
3.5 元のAposeモデルからのAposeのスキンウェイトのコピーをする。

4.1見る用にHumanIKスケルトンデフォルトのTposeを複製して作る
4.2 AposeジョイントをAポーズからTポーズにアニメーション30でTポーズに全部「S」でキーを打つ 必要なのは肩のキーだけだ。他に見る用にHumanIKスケルトンに足幅が合ってなければもも関節もキーを打つ。
5,Tposeへ変形+バインドされたApose MeshグループをTポーズの30フレームで「Mesh+Joint」のグループごと複製したグループC(groupMeshHIK_Tpose)とする

6.Cのスキンバインドを外す、
6a. フレームヘッドを0フレームに移動し、
6b. Tポーズのジャケットなどをインポートして、
6c. 0 frame Tposeでスキンバインドここ重要
6d. 30 frameでスキンウェイトをコピーここが肝
※Genesis8Femaleの場合スキンウェイトのコピーの設定※
7a,CをHumanIKスケルトン(groupMeshHIK_TposeSK)として定義
モーション流し込みなおすならこのファイルから
 Genesis8Skelton_HumanIK_049_group_meshHIK_AposeToTposeFr30humanIKfinger.mb
https://www.mediafire.com/file/n4ekyeubv6c4m96/Genesis8Skelton_HumanIK_049_group_meshHIK_AposeToTposeFr30humanIKfinger.zip/file
 これに下のMotionMergeツールで作成したmbアニメーション全体を読み込む
 >>full_end_python_saved__all_onetimeline.mb 読み込まれるファイル
7b.HumanIkの青のボタン>定義>スケルトン
 HumanIkの青のボタン>編集>定義>名前の変更
 SK_manequinを「Character_SK_Mannequin」としてHumanIKに定義する。
 全身Assainしていくことになるが、アサイン結果が左右ミラーされるのでちょっと楽
 手の指先までやる。
 

8,groupMeshHIK_TposeSKに2段目のソースにアニメーションを指定してモーションを流し込む 詳細は※2
8a, スケルトン定義に移動して青のボタンから編集>定義>プロパティを編集
8b.リターゲット指定からソースの一致をONにすると歩く歩幅が合わせることが可能
8c.達成度の項目の左手首を1に右手首を1に指定すると手の位置が合ってテーブルのコップがつかめます。ここでやっとアニメーションの見た目が完璧近い状態で合う。
8d.HumanIKパネルに戻って、青いボタンからベイク処理>コントロールリグのベイク処理
8f. ソースのモーションスケルトンをアウトライナから削除とソースキャラクタ定義へ移動しをゴミ箱アイコンで削除。

8f2ここまでやったらアニメーションレイヤー使うかどうかはモーション作業内容次第。
  
 8g.アニメーションレイヤーでの調整作業。
  ベイクしたTポーズ定義でなく「コントロール」タブで背景を
  ダブルクリックしてコントロールリグを全選択し
  (とビデオではいっているがアウトライナで選択しないと指が全部にならなかった。)、  
   チャネルボックス・レイヤエディタ・アニメーションタブを開く。
 8h.アニメーションタブで「選択項目からレイヤを作成」でAnimLayer1が
  作成され上乗せでキーをうつことが可能になる。
 8i.二つのアニメーションレイヤーを選択して右クリックから
  レイヤーのマージでアニメーションをベイクします。

  1. コントロールリグアニメーションを直接編集しなおす。
      リグのキーフレームをフレーム間で削除して修正
      前のリグアニメを書き出した
      それはこれを使った
    https://furcraea.verse.jp/wp/2021/03/18/humanik-effector-ctrl-animationexporter-importer/

10a groupMeshHIK_TposeSK にコントローラのアニメーションをベイクします。
ジョイントツリーを全部開いて選択後、タイムレンジを0~1000(最終fr)に設定
 アニメーションタブのアニメーションのベイクボタンを押す。
10b,FBXをエクスポート スムーズメッシュをオン FBX2014/2015 で書き出し。
E:\Download\Game\UE4_SK_Mannequin_Motions\scenes\OneTimeLine\Unity_fbx
motion_000_000_all_unkeyReduction_fbx.fbx
を上書きします。

10c,UE4で編集>プラグイン>プラグインウィンドウで検索pythonと入力し
Python Editor Script Pluginの Enables をチェックを入れONにします。
プラグインウィンドウで検索Editorと入力し
Editor Scripting Utilitiesの Enables をチェックを入れONにします。
UE4を再起動してプラグインをアクティブにします。

10d.UE4で
見た目でいうと
/コンテンツ/UE4_OneTimeLineGenesis8Tpose/
パスでいうと
/Game/UE4_OneTimeLineGenesis8Tpose/
にmotion_000_000_all_unkeyReduction_fbx.fbxを
インポートウィンドウでスケルトン設定を「なし」で
スケルタルメッシュとしてインポートします。
スケルタルメッシュmotion_000_000_all_unkeyReduction_fbxと
ひとつなぎのアニメーション motion_000_000_all_unkeyReduction_fbx_Anim
ができていたら
/Game/UE4_OneTimeLineGenesis8Tpose/motion/ フォルダを作成しておきます
command + shift + s またはファイル>すべて保存します。

10d.アニメーションスプリットツールでインポートします。

UE4_SK_Mannequin_Motions\script\
UE4_chara_anim_split_importer.py
をテキストエディタで開き
E:\Download\Game\UE4_SK_Mannequin_Motions\
を自分のパスに検索置換します。

それをすべて選択して
UE4 >ウィンドウ>デベロッパーツール>アウトプットログの一番下のCmdのプルダウンをPython(無印)を選択して
Enter Python script…の部分に
さきほどのコピーしたものをペーストし+Enterを押します。
8~10分で読み込まれます。
~やっと終わり~

モーションを修正する場合には

  1. コントロールリグアニメーションを直接編集しなおす。
    からやりなおせばOK

と思ったが
Paragliderのプロジェクトに入れたら問題が出てきた。
UE4のジョイント名でないとr_handからik_handが探せないエラー
できあがったモーションセットをソースとしてSK_mannequinに戻す作業が必要そうだ。
motion_000_000_all_unkeyReduction_fbx.fbxを
つづく。。。

※0 Duplicateで固まるメッシュ というのは スキンバインドしてアニメーションさせたMeshをモーション後のフレームでDuplicate するとその複製されたメッシュがその形状のまま固まる現象をいう。ちょっとしたバグなのか仕様なのかわからない。都合がいい。

※1 MayaHumanIKにはない頭のジョイントをコピーして親子付けすると変なtransformができるが、全ジョイントのスケールをフリーズして、ヒストリ削除したら親子付けできる。
https://www.deathponta.com/entry/190724_parentingAjointProduceMysteriousTransformNode

※2 HumanIKモーションの流し込みのビデオ
https://area.autodesk.jp/movie/start-at-maya/24.html
https://www.youtube.com/watch?v=S214-96uXqc

使用+橋渡しができたプラットフォームのデータ
ここでは DAZ 3D Studio のGenesis8FemaleはAposeなのでHumanIKのTposeにする。
モーションはUnrealEngine4のデフォルトSK_Mannequinのモーションを
書き出して使った。

UE4 FBX Export Options 設定は
▼Exporter
 Fbx Export Compatibility > FBX2013
▼Mesh
 Vertex Color OFF
 Level Of Detail OFF
▼Static Mesh
 コリジョン OFF
▼Skeletal Mesh
 Export Morph Targets OFF
▼Animation
 Export Preview Mesh ON
 Map Skeletal Motion to Root OFF

全モーションのマージにはこれを作った (書き直したが疲れた。)
https://www.mediafire.com/file/x9tdw9jtrl0t2p2/MotionMerge_p030motionbuilder_chimera_0_Start2.zip/file
インストール方法
C:\Users\whaison\Documents\maya\2016\ja_JP\scripts
にpythonフォルダごと突っ込む。

Maya起動後
プロジェクト設定で指定するワークスペースのディレクトリ構造はこう。
scenes\motion\motionbuilder_fbx\ にUE4SK_mannequinのモーションfbxを全部突っ込む
ファイル名は名前順で並ぶようにちゃんとリネームしておくこと。

C:\Users\whaison\Documents\maya\2016\ja_JP\scripts\python\MotionMerge\p030motionbuilder_chimera_0_Start
Motionbuilder_chimera_0_Start_______Maya_____Starter.py
の内容をスクリプトエディタで実行する。と30分後?ぐらいに
scenes\OneTimeLine\
full_end_python_saved__all_onetimeline.mb
ができあがる。

フレームのどこの部分に該当のモーションが入ってるかは下に出力した。
scenes\motion に
frameCSV.txt
motion_[C0000]_000_Tstance,0,0,OnMotionStart,0.0,OnMotionEnd,1.0,
motion_0000_00_000_Tstance_manual,10,10,OnMotionStart,0.0,OnMotionEnd,1.0,
motion_0000_00_000_Tstance,20,20,OnMotionStart,0.0,OnMotionEnd,1.0,
motion_ZZZZ_ZZ_999_TposeEnd,30,30,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPersonIdle,40,103,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPersonJump_Loop_previewMesh2,113,130,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPersonJump_Start,140,151,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPersonRun,161,175,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPersonSwordAttack2,185,206,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPersonWalk,216,240,OnMotionStart,0.0,OnMotionEnd,1.0,
ThirdPerson_Jump,250,254,OnMotionStart,0.0,OnMotionEnd,1.0,
TJ_Paraglider_Deploy_Additive,264,356,OnMotionStart,0.0,OnMotionEnd,1.0,
TJ_Paraglider_Idle,366,606,OnMotionStart,0.0,OnMotionEnd,1.0,
TJ_Paraglider_Idle_AdditiveBase,616,616,OnMotionStart,0.0,OnMotionEnd,1.0,
TJ_Paraglider_Moving_Additive,626,650,OnMotionStart,0.0,OnMotionEnd,1.0,
TJ_Paraglider_Turning_Additive,660,684,OnMotionStart,0.0,OnMotionEnd,1.0,
TK_0-26_A_LedgeClimb,694,720,OnMotionStart,0.0,OnMotionEnd,1.0,
TK_30-102_A_LedgeHold,730,802,OnMotionStart,0.0,OnMotionEnd,1.0,
TK_120-144_A_wallclimb,812,836,OnMotionStart,0.0,OnMotionEnd,1.0,
TK_160-184_A_wallclimbDown,846,870,OnMotionStart,0.0,OnMotionEnd,1.0,
TK_200-249_A_wallCling_01,880,929,OnMotionStart,0.0,OnMotionEnd,1.0,

これをUE4読み込み時にUE4Pythonスクリプトで使う
同じZIPの
https://www.mediafire.com/file/d82x4dd6o1a4k28/MotionMerge_p030motionbuilder_chimera_0_Start4.zip/file
UE4_chara_anim_split_importer.py
E:\Download\Game\UE4_SK_Mannequin_Motions\script\UE4_chara_anim_split_importer.py
に移動して使う
E:/Download/Game/UE4_SK_Mannequin_Motions/scenes/OneTimeLine/
Unity_fbx/motion_000_000_all_unkeyReduction_fbx.fbxが入ってる前提で動く
必要な場合はパスを検索置換したらうごく。


※Genesis8Femaleの場合スキンウェイトのコピーの設定※は
サーフェースの関連付け:UV空間 or レイキャスト
インフルエンスの関連付け1:名前
インフルエンスの関連付け2:なし
インフルエンスの関連付け3:なし
にしたら顔のウェイトが比較的良く転送できた。目の周りのジョイントは位置が同じでUVは違うのでこうなったようだ。
といってもこんなもん
コピー元


コピー先

ほかの設定だと全くコピーされないか、完全におかしいコピーだった。

キーワード
Daz3D,DazStudio
UE4,UnrealEngine4,UnrealEngine
HumanIK
Apose,Tpose,AposeからTposeへの変換
スキニング,スキンウェイト

UE4 IK Two Bone IKノード Paraglider アセットで手をグライダーにかける方法

UE4 IK Two Bone IKノード Paraglider アセットで手をグライダーにかける方法

モデルを変更した結果
Paragliderのプロジェクトに入れたら問題が出てきた。
UE4のジョイント名でないとr_handからik_hand、lowerarm_lが探せないエラー

LogAnimation: Warning: FBoneReference::Initialize BoneIndex for Bone ‘lowerarm_l’ does not exist in Skeleton ‘motion_000_000_all_unkeyReduction_fbx_Skeleton’


lowerarm_lだけならTwo Bone IKノードのJointTarget>JointTarget>lowerarm_lを別のヒジジョイント名に変えるだけでOKだ。


そんなことは後で知ったので
Mayaでjointの名前を変更した。>大変だったが必要なのは
root>ik_hand_root>ik_hand_r と
root>(hipあってもなくてもいい)>pelvis >spine_01>spine_2>spine_03>clavicle_r>upperarm_r>lowerarm_r>hand_r
の流れだった。
実はヒジのジョイント名だけでいいかもしれない
あとはちゃんとik_hand がhandジョイントにコンストレインされて同じように動いていることかもしれない。

いがいと、ジョイント名が変わっても
ジョイント位置+メッシュ頂点位置でスキンウェイトコピーが反応してくれて大丈夫だった

「余裕がないとかからない」ので
ThirdPersonCharactor_BPのビューポートでParagliderComponent_BPの位置を
位置
z:109.897697
から
z:85にして近づけたら
グライダーとモデルの間隔がせばまって届くようになった。