IK

less than 1 minute read

언리얼에서 IK 적용하기

먼저 발 Bone에 발보다 더 밑으로 내려간 연장선을 만들어 줍니다.

FHitResult hitResult;
	UKismetSystemLibrary::LineTraceSingle
	(
		GetWorld(),
		start, end,
		UEngineTypes::ConvertToTraceType(ECC_Visibility),
		true,
		ignoreActors,
		DrawDebugType,
		hitResult,
		true,
		FLinearColor::Green, 
		FLinearColor::Red
	);


연장선이 땅과 충돌된 위치에서 연장선의 끝부분까지의 길이를 구합니다.

float length = (hitResult.ImpactPoint - hitResult.TraceEnd).Size();  


연장선에서 length를 빼서 땅에서 발이 떨어진 길이를 구합니다.
발이 땅속에 조금 들어가기 때문에 보정값을 줍니다.

OutDistance = OffsetDistance + length - TraceDistance;


그다음 TickComponent에서 발이 땅에 닿은 높이 Offset을 구해줍니다. 0에 가까운 값

float offset = FMath::Min(leftDistance, rightDistance); 


그리고 UKismetMathLibrary::FInterpTo를 사용해
원래 발 위치에서 아까 구한 OutDistance 높이까지 보간시켜줍니다.
오른발이 내려가도록 오른발에 -를 붙여줍니다.

Data.LeftDistance.X = UKismetMathLibrary::FInterpTo(Data.LeftDistance.X, (leftDistance - offset), DeltaTime, InterpSpeed);

Data.RightDistance.X = UKismetMathLibrary::FInterpTo(Data.RightDistance.X, -(rightDistance - offset), DeltaTime, InterpSpeed);