SEO- Description:언리얼 엔진에서 Python 스크립팅으로 IK 릭을 생성하고 편집하여 워크플로를 자동화합니다. Type: Reference Parent:animating-characters-and-objects\SkeletalMeshAnimation\AssetsFeatures\IKRig\IKEditor Engine-Concept:Animating Characters and Objects Skill-Family:Essential Training Track:GameDev Track:Film/TV Tags:Animation Tags:IK Rig Tags:Python Topic-image:TopicImage.png Topic-Icon:TopicIcon.png Social-Image:SocialMedia.png Hero-Image:BannerImage.png Order: Prereq: Related:animating-characters-and-objects\IKRig course: Version: 5.2
언리얼 엔진 에서 IK 릭을 생성하고 사용하여 캐릭터와 오브젝트를 애니메이팅할 때, 커스텀 Python 스크립팅을 사용하여 IK 릭 에셋 워크플로를 제어하고 자동화할 수 있습니다.
이 문서에서는 IK 릭 에셋을 편집하고 인터페이스하기 위해 참조하고 사용할 수 있는 Python 스크립트를 간략하게 살펴보고 그 예시를 보여줍니다.
개요
IK 릭은 언리얼 엔진에서 모션 데이터를 스켈레탈 메시 에셋에 적용할 수 있는 컨트롤과 솔버 세트입니다. IK 릭은 다음과 같은 여러 부분으로 구성됩니다.
-
본(bones) , 목표(goals) , 목표 세팅(goal settins) 및 본 세팅(bone settings) 의 계층구조
-
계층구조의 본 및 본 간의 관계에 영향을 주는 IK 솔버 목록
- 목표는 IK 솔버 구동에 사용되며, 목표 세팅과 본 세팅은 솔버의 행동을 정의하는 데 사용됨
-
IK 리타기팅에 사용되는 리타깃 루트(Retarget Root) 및 리타깃 체인(Retarget Chains) 목록
-
에디터 프리뷰 전용으로 사용되는 프리뷰 씬
IK 릭 시스템은 모델(Model) > 뷰(View) > 컨트롤러(Controller) 디자인 공식을 사용하여 구성됩니다. 데이터 모델 자체에 사용되는 용어는 다음과 같습니다.
-
솔버(Solver) : 체인의 본 회전 및 위치 지정에 대한 인버스 키네마틱(Inverse Kinematic) 솔루션을 포함하고 있습니다. 다중 솔버도 동시에 사용해서 최종 포즈에 대한 IK 이펙트를 추가적으로 커스터마이징할 수 있습니다.
-
목표(Goal) : IK 체인에 대한 이펙터 포인트 역할을 합니다. 목표는 솔버와 함께 목표 위치에 도달하기 위해 들어오는 포즈를 수정하는 데 사용됩니다. 목표는 여러 솔버에 할당할 수 있습니다.
-
목표 세팅(Goal Settings) : IK 목표 내에 있는 솔버별 세팅입니다. 목표에 대한 솔버 할당마다 서로 다른 솔버별 세팅 오브젝트가 있습니다.
-
본 세팅(Bone Settings) : 본 내에 있는 솔버별 세팅입니다. 본에 대한 솔버 할당마다 서로 다른 솔버별 세팅 오브젝트가 있습니다.
-
리타깃 루트 : 소스에서 타깃으로 전달하는 데 사용되는 캐릭터 모션의 루트입니다.
-
리타깃 체인 : 소스에서 타깃으로 모션을 전달하기 위해 정의되는 본의 체인입니다.
IK 릭 액세스하기
IK 릭에 대한 스크립팅 시 첫 번째 단계는 상호작용할 주 오브젝트 에 대한 액세스 권한 획득, 즉 The IKRigDefinition 을 설정하는 것입니다. 상황에 따라 몇 가지 방법이 있습니다. 다음 예시는 Python 스크립트를 사용하여 IK 릭 오브젝트를 정의하는 방법을 보여줍니다.
기존 IKR 에셋 로드하기
기존 IK 릭 에셋(ikr)에 액세스하려면 다음 예시 스크립트를 사용하여 해당 에셋을 로드하면 됩니다.
import unreal
# 프로젝트에서 에셋 위치의 파일 경로가 정확한지 확인합니다.
ikr = unreal.load_asset(name = '/Game/Characters/Mannequins/Rigs/IK_Mannequin', outer = None)
새 IKR 에셋 생성하기
다음 팩토리를 사용하여 새 IK 릭 에셋을 생성할 수 있습니다.
# 에셋 툴을 가져옵니다.
asset_tools = unreal.AssetToolsHelpers.get_asset_tools()
# 파일 경로에 의해 정의된 위치에 IK 릭을 생성합니다. 예를 들면 다음과 같습니다. ` …/Game/IK_Mannequin`.
ikr = asset_tools.create_asset(asset_name='IK_Mannequin',
package_path='/Game/', asset_class=unreal.IKRigDefinition,
factory=unreal.IKRigDefinitionFactory())
IK 릭 편집하기
컨트롤러에 액세스하여 편집 준비하기
컨트롤러는 IK 릭 변경에 사용할 수 있는 중심적인 오브젝트입니다. 컨트롤러에는 편집에 사용할 수 있는 많은 함수가 있습니다. 다음 예시는 Python 스크립팅을 사용하여 IK 릭 에셋을 편집할 수 있는 메서드의 서브셋입니다.
# IK 릭 컨트롤러를 가져옵니다.
ikr_controller = unreal.IKRigController.get_controller(ikr)
새 IK 릭에 스켈레탈 메시 할당하기
새 IK 릭을 생성할 때는 스켈레탈 메시를 할당해야 합니다. 다음 Python 스크립트를 사용하여 스켈레탈 메시 에셋을 로드하고 IK 릭에 할당하는 것은 물론, IK 릭에 할당된 스켈레탈 메시를 참조하거나 가져올 수도 있습니다.
# 스켈레탈 메시 에셋을 로드합니다.
skel_mesh = unreal.load_asset(name = '/Game/Characters/Mannequins/Meshes/SKM_Manny_Simple')
# IK 릭에 스켈레탈 메시 에셋을 할당합니다.
ikr_controller.set_skeletal_mesh(skel_mesh)
# IK 릭에 할당된 스켈레탈 메시를 가져옵니다.
set_mesh = ikr_controller.get_skeletal_mesh()
IK 솔버 추가, 편집 및 쿼리하기
컨트롤러를 통해 다른 IK 솔버를 간단하게 추가할 수 있습니다. 솔버를 추가하려면 IK 릭 솔버 클래스를 지정해야 합니다. 왜냐하면 프로젝트에서 사용되는 커스텀 IK 릭 솔버가 있을 수 있기 때문입니다. 베이스 클래스가 IKRigSolver 인 한, 모든 클래스 입력이 작동합니다.
# FBIK, 바디 무버(Body Mover), 림(Limb), 폴(Pole) 및 트랜스폼 설정(Set Transform) 솔버를 IK 릭에 추가합니다.
fbik_index = ikr_controller.add_solver(unreal.IKRigFBIKSolver)
bodymover_index = ikr_controller.add_solver(unreal.IKRig_BodyMover)
limb_index = ikr_controller.add_solver(unreal.IKRig_LimbSolver)
pole_index = ikr_controller.add_solver(unreal.IKRig_PoleSolver)
settransform_index = ikr_controller.add_solver(unreal.IKRig_SetTransform)
솔버를 추가할 때 컨트롤러는 솔버 인덱스를 출력합니다. 이 인덱스에 따라, IK 릭에서 솔브할 솔버 순서가 결정됩니다. 인덱스를 사용하여 솔버의 작동 상태를 토글하거나 스택에서 솔버를 이동하거나 특정 솔버를 제거할 수 있습니다.
# 특정 솔버를 활성화하거나 비활성화합니다.
ikr_controller.set_solver_enabled(bodymover_index, False)
# 솔버를 이동합니다.
ikr_controller.move_solver_in_stack(bodymover_index, limb_index)
# 솔버를 제거합니다.
ikr_controller.remove_solver(bodymover_index)
ikr_controller.remove_solver(limb_index)
ikr_controller.remove_solver(pole_index)
ikr_controller.remove_solver(settransform_index)
또한, 다음 스크립트를 사용하여 IK 릭의 솔버 인덱스 또는 모든 솔버를 쿼리할 수도 있습니다.
# 인덱스에서 IK 릭 컨트롤러의 첫 번째 솔버를 가져옵니다.
fbik_solver = ikr_controller.get_solver_at_index(fbik_index)
# IK 릭 컨트롤러와 관련된 솔버 수를 가져옵니다.
num_solvers = ikr_controller.get_num_solvers()
솔버의 루트 본 설정하기
솔버가 작동하려면 솔브를 시작할 루트 본이 있어야 합니다. 그러려면 루트 본을 설정할 솔버 인덱스가 필요합니다. 다음 스크립트를 사용하여 솔버에 대한 루트 본을 설정할 수 있습니다.
# 첫 번째 솔버의 루트 본을 설정하고 가져옵니다.
ikr_controller.set_root_bone("pelvis", 0)
root_bone = ikr_controller.get_root_bone(0)
IK 목표 추가, 편집 및 쿼리하기
IK 솔버를 구동하기 위해서는 목표가 필요합니다. 목표는 목표 본 유무와 상관없이 추가할 수 있으며 이름을 변경할 수 있습니다.
# IK 릭에 목표를 추가합니다. 생성 중에 본을 할당할 수도 있습니다.
ikr_controller.add_new_goal("hand_l_goal", None)
ikr_controller.add_new_goal("TEMP_hand_r_goal", "hand_r")
# 기존 목표에 본을 할당합니다.
# 본에서 목표를 쿼리할 수도 있고 그 반대도 가능합니다.
ikr_controller.set_goal_bone("hand_l_goal", "hand_l")
ikr_controller.get_goal_name_for_bone("hand_l")
ikr_controller.get_bone_for_goal("hand_l_goal")
# 목표의 이름을 변경합니다.
ikr_controller.rename_goal("TEMP_hand_r_goal", "hand_r_goal")
# 목표를 제거합니다.
ikr_controller.remove_goal("hand_r_goal")
IK 릭에서 모든 목표를 쿼리할 수도 있습니다.
# IK 릭에서 모든 목표를 가져옵니다.
ikr_controller.get_all_goals()
목표 프로퍼티를 편집하기 위해 해당 목표 오브젝트를 가져와 원하는 에디터 프로퍼티를 편집할 수 있습니다.
# 목표 오브젝트를 가져오고 위치 알파를 설정합니다.
goal = ikr_controller.get_goal("hand_r_goal")
goal.set_editor_property("position_alpha", 0.5)
new_alpha = goal.get_editor_property("position_alpha")
솔버에 목표 연결하기
이제 목표가 추가되었으니 그 목표를 솔버에 연결해야 합니다. 연결 전에 목표가 솔버에 연결되어 있는지 확인할 수 있습니다.
# 다른 솔버나 특정 솔버에 목표가 연결되어 있는지 확인합니다.
ikr_controller.is_goal_connected_to_any_solver("hand_r_goal")
ikr_controller.is_goal_connected_to_solver("hand_r_goal", 0)
# 솔버에 목표를 연결하거나 연결 해제합니다.
ikr_controller.connect_goal_to_solver("hand_r_goal", 0)
ikr_controller.disconnect_goal_from_solver("hand_r_goal", 0)
목표 및 본 세팅 추가, 편집 및 쿼리하기
솔버에 목표를 연결한 다음에는 그 특정 목표의 목표 세팅에 액세스할 수 있습니다. 목표와 솔버 간의 각 연결에는 저마다 고유한 세팅이 있습니다.
다음 예시에서 hand_r_goal 은 FBIK 솔버와 바디 무버 솔버에 연결되므로 각각 해당 솔버와 연결되어 있는 두 가지 목표 세팅이 있습니다.
# 목표 이름과 솔버를 입력하여 목표에 해당하는 세팅을 가져옵니다.
hand_r_goal_settings = ikr_controller.get_goal_settings_for_solver("hand_r_goal", 0)
# 특정 이펙터 세팅의 프로퍼티를 편집합니다.
hand_r_goal_settings.pull_chain_alpha = 0
hand_r_goal_settings.strength_alpha = 1
솔버는 선택적으로 본별 세팅을 지원할 수 있지만, 모든 솔버에 이 세팅이 필요한 것은 아닙니다. IK 릭과 함께 제공되는 솔버 중에서는 FBIK 솔버에만 본별 세팅이 있습니다. 이에 대한 예시 구성은 앞서 목표 세팅에서 다룬 구성과 비슷합니다.
# 팔에 본 세팅을 추가합니다.
ikr_controller.add_bone_setting("lowerarm_l", 0)
ikr_controller.add_bone_setting("lowerarm_r", 0)
ikr_controller.add_bone_setting("clavicle_l", 0)
ikr_controller.add_bone_setting("clavicle_r", 0)
# 본 세팅을 가져옵니다.
left_lowerarm_setting = ikr_controller.get_bone_settings("lowerarm_l", 0)
right_lowerarm_setting = ikr_controller.get_bone_settings("lowerarm_r", 0)
left_clav_setting = ikr_controller.get_bone_settings("clavicle_l", 0)
right_clav_setting = ikr_controller.get_bone_settings("clavicle_r", 0)
# 선호하는 각도와 회전 강성을 설정합니다.
left_lowerarm_setting.use_preferred_angles = True
left_lowerarm_setting.preferred_angles = unreal.Vector(0,0,90)
right_lowerarm_setting.use_preferred_angles = True
right_lowerarm_setting.preferred_angles = unreal.Vector(0,0,90)
left_clav_setting.rotation_stiffness = 1
right_clav_setting.rotation_stiffness = 1
다른 스켈레탈 메시와의 호환성 확인하기
IK 릭은 스켈레톤에 구애받지 않는데, 이는 IK 릭을 비슷한 스켈레톤 계층구조에 공유할 수 있다는 뜻입니다. Python을 사용하면 간단한 명령으로 IK 릭의 메시 호환성을 확인할 수 있습니다.
# 정의된 스켈레탈 메시와 이 릭이 호환되는지 확인합니다.
compatible_skel_mesh = unreal.load_asset(name = '/Game/Characters/Mannequins/Meshes/SKM_Quinn_Simple')
print(ikr_controller.is_skeletal_mesh_compatible(compatible_skel_mesh))
리타깃 포즈 및 체인 추가, 편집 및 쿼리하기
리타깃용 IK 릭을 구성하려면 리타깃 루트와 리타깃 체인이 있어야 합니다. 리타깃 루트와 리타깃 체인은 다음 예시 Python 스크립트를 사용하여 작성할 수 있습니다.
# 리타깃 루트를 설정하거나 가져옵니다.
ikr_controller.set_retarget_root("pelvis")
retarget_root = ikr_controller.get_retarget_root()
리타깃 체인의 경우, 시작 본이나 끝 본 또는 목표 입력 없이 작성할 수 있습니다. 이러한 요소는 필요 시 나중에 체인에 추가할 수 있습니다.
# 시작 본, 끝 본 및 목표와 함께 리타깃 체인을 추가합니다.
ikr_controller.add_retarget_chain("LeftArm", "upperarm_l", "hand_l", "hand_l_goal")
# 리타깃 체인을 추가합니다.
ikr_controller.add_retarget_chain("TEMP_RightArm", "", "", "")
# 리타깃 체인의 이름을 변경합니다.
ikr_controller.rename_retarget_chain("TEMP_RightArm", "RightArm")
# 리타깃 체인의 시작 본, 끝 본 및 목표를 설정합니다.
ikr_controller.set_retarget_chain_start_bone("RightArm", "upperarm_r")
ikr_controller.set_retarget_chain_end_bone("RightArm", "hand_r")
ikr_controller.set_retarget_chain_goal("RightArm", "hand_r_goal")
# 리타깃 체인의 시작 본, 끝 본 및 목표를 가져옵니다.
ikr_controller.get_retarget_chain_start_bone("RightArm")
ikr_controller.get_retarget_chain_end_bone("RightArm")
ikr_controller.get_retarget_chain_goal("RightArm")
# 리타깃 체인을 제거합니다.
ikr_controller.remove_retarget_chain("RightArm")
IK 릭에서 모든 목표를 쿼리할 수도 있습니다.
# IK 릭에서 모든 리타깃 체인을 가져옵니다.
all_retarget_chains = ikr_controller.get_retarget_chains()