Transform (Modify) Bone

김지윤·2025년 2월 7일

UE5_MultiplayerShooter

목록 보기
8/25
post-thumbnail

현재까지 개발한 부분의 문제점이다.
빨간색 선은 총구의 방향에서 뻗어나간 선이고, 파란색 선은 총구에서 플레이어가 바라본 지점까지 뻗어나간 선이다.
보다시피 플레이어가 바라보는 방향과 총구의 방향이 크게 어긋나있다.
오늘 할 내용은 이를 동기화시키는 거다.

// Weapon의 MuzzleFlash 소켓(총구에 위치함)의 FTransform을 가져옴
FTransform MuzzleTipTransform = EquippedWeapon->GetWeaponMesh()->GetSocketTransform(FName("MuzzleFlash"), RTS_World);

// 위에서 구한 FTransform의 X방향 단위 벡터를 계산
FVector MuzzleX(FRotationMatrix(MuzzleTipTransform.GetRotation().Rotator()).GetUnitAxis(EAxis::X));

// 총구 방향으로 그린다.
DrawDebugLine(GetWorld(), MuzzleTipTransform.GetLocation(), MuzzleTipTransform.GetLocation() + MuzzleX * 1000.f, FColor::Red);
// 총구에서 크로스헤어 방향으로 그린다. Character가 LineTrace를 통해 얻은 Vector를 가져와 사용한다.
DrawDebugLine(GetWorld(), MuzzleTipTransform.GetLocation(), BlasterCharacter->GetHitTarget(), FColor::Blue);

디버그 라인은 이렇게 그렸다.

강의에서 소개한 방법은 Hand_R 본의 방향을 직접 조정하는 거였다.
바라본 지점의 Vector와 Hand_R의 Vector를 적절히 사용해 무기를 쥔 손의 본의 Rotation 값을 직접 조정, 총구가 바라본 지점을 가리킬 수 있도록 했다.

아래부턴 구현 내용이다.

// 자신의 캐릭터만 총구를 정렬
if (BlasterCharacter->IsLocallyControlled())
{
	// 오른손에서 총구 방향으로 향하는 벡터 계산
	bLocallyControlled = true;
	FTransform RightHandTransform = EquippedWeapon->GetWeaponMesh()->GetSocketTransform(FName("Hand_R"),RTS_World);
	RightHandRotation = UKismetMathLibrary::FindLookAtRotation(
		RightHandTransform.GetLocation(),
		BlasterCharacter->GetHitTarget());
}

먼저 Hand_R의 Transform부터 구한다.
그 다음 FindLookAtRotation(1번 매개변수 벡터가 2번 매개변수 벡터를 바라보는 Rotation을 구하는 함수)을 사용한다.
Start Vector는 Hand_R의 Location이며
Target Vector는 바라본 지점이 되겠다.

그렇게 구한 RightHandTransform을 Transform (Modify) Bone 노드를 통해 기존 애님블프에 적용했다.
원하는 본에 대한 Transform을 직접 조작할 수 있는 노드다.
지금은 Location과 Scale의 Pin을 제거해 Rotation만 남겼다.

해당 노드의 Rotation에 대한 설정값이다.
Rotation 자체를 재설정해야 하기 때문에 Replace를, 구한 Rotation이 월드 기준이기 때문에 World로 설정했다.

바라본 지점의 Vector를 그대로 넣자 발생한 문제다.
왜 발생하는 문제인지 대충 감은 오는데 맞는진 모르겠다.
아마 Hand_R본의 ForwardVector(정면)가 손끝쪽이 아닌 팔목쪽(Parent Bone)이기 때문이 아닐까?
스켈레탈 메쉬의 구조상 어쩔 수 없는 부분인 것 같다.
자손은 여러개일 수 있으나 부모는 하나니까 ForwardVector를 명확히 하기 위해선 부모를 가리켜야겠지.
그렇다면 구한 Rotation에 대한 Yaw값을 뒤집어줘야겠다.

RightHandRotation = UKismetMathLibrary::FindLookAtRotation(
	RightHandTransform.GetLocation(),
	BlasterCharacter->GetHitTarget()) + FRotator(0.f, 180.f, 0.f);

이렇게 해도 뭐.. 작동은 하겠지만
멋이 없다.
강의에서 알려준대로 작성해보겠다.

RightHandRotation = UKismetMathLibrary::FindLookAtRotation(
	RightHandTransform.GetLocation(),
	RightHandTransform.GetLocation() + (RightHandTransform.GetLocation() - BlasterCharacter->GetHitTarget()));

벡터의 합과 차를 이용해 Hand_R의 Location을 기준으로 뒤집어진 HitTarget을 구한다.
그곳을 TargetVector에 넣어주면

나타나는 두 번째 문제
하지만 우리의 Hand_R 본은 제대로된 방향을 가리키고 있다.
이는 단순히 RightHandSocket(Weapon이 붙는 소켓)의 Rotation이 문제다.

실제 플레이 화면을 잘 보면서 정렬해주자.

이 정도면 플레이에 지장이 전혀 없을 정도의 정렬이다.
하지만 세 번째 문제가 숨어있다.

저번에 고생해서 만든 FABRIK이 어긋났다.
하지만 이것도 쉽게 해결할 수 있는 문제다.
현재 애님블프의 노드 순서가
FABRIK -> Hand_R 정렬이라서 그렇다.
이를 뒤집어주기만 하면

이것도 해결했다.

따봉

profile
공부한 거 시간 날 때 작성하는 곳

0개의 댓글