본문 바로가기
언리얼엔진 개발/VR

[UnrealEngine5] VR 나사 돌리기 만들기(5)

by yeni_0224 2023. 5. 16.
728x90
반응형
궁극의 나사돌리기 유사 시뮬레이션
Unreal VR Screw Simulation

https://yeni-0224.tistory.com/entry/UnrealEngine5-VR-%EB%82%98%EC%82%AC-%EB%8F%8C%EB%A6%AC%EA%B8%B0-%EB%A7%8C%EB%93%A4%EA%B8%B04

 

[UnrealEngine5] VR 나사 돌리기 만들기(4)

궁극의 나사돌리기 유사 시뮬레이션 Unreal VR Screw Simulation https://yeni-0224.tistory.com/entry/UnrealEngine5-%EB%82%98%EC%82%AC-%EB%8F%8C%EB%A6%AC%EA%B8%B01 [UnrealEngine5] VR 나사 돌리기 만들기(1) VR 게임 나사 돌리기 유사

yeni-0224.tistory.com

레벨에 올린 후 역시나 나사 돌리는 과정에서 여러 이슈가 발생했다. 일단 충돌 이슈는 계속해서 수정해줘야한다. 계속해서 오브젝트가 추가되고있고, 플레이어와 물체와의 충돌 부분도 계속해서 수정되고 있기 때문이다. 

레벨에 나사 여러개를 올려놨을 때 여러개의 나사가 동시에 움직였다. 드라이버에 닿고있는 나사만 움직이게 해야했기 때문에 수정해야했고. 그리고 원래의 위치보다 뒤로 이동하는 것을 막아줘야했다.

 

<수정 사항>

1. 드라이버와 현재 닿고 있는 나사만 돌아가도록 해주었다.

나사가 돌아가도록 하기 위해 나사와 드라이버 클래스 두 개를 사용하였지만, 드라이버 쪽에서 구현해주었다. 아무래도 나사 클래스에서는 돌아가게 하고, 나사가 돌아가도록 하는 드라이버의 회전 값을 드라이버에서 받아오고 있기에 발생하는 이슈인 것으로 추정된다. 그래서 모든 구현은 나사가 하도록 수정해주었다. 

void AScrew::AttachtoDriver(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
	UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	if (driver != nullptr)
	{
		//UE_LOG(LogTemp, Warning, TEXT("OtherActor = %s"), *OtherActor->GetName())
		isAttaching = true;
		//닿았을 때 최초 회전값
		prevDriverRot = driver->GetActorRotation().Roll;
	}
}

void AScrew::DettachFromDriver(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
	UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{	
	if (driver != nullptr)
	{ 
		isAttaching = false;	
	}
}

충돌 처리는 드라이버가 아닌 나사에서 하도록 했다!

 

2. 나사가 조여지고, 열리는 방향을 수정했다.

지금껏 구현한 내용은 원래 나사가 돌아간다는 것의 반대 방향이었다.

하지만 방향 벡터가 어느 방향일 때 어느 방향으로 회전하도록 할 것인지 설정만 해주면 되기 때문에 금방 해결 할 수 있었다.

 

3. 원래의 위치보다 뒤로 가지 못하게 막았다.

처음에는 나사의 첫 위치벡터에서 다음 위치 벡터를 뺀 값이 0보다 작을 경우엔 작동하지 않도록 하려고 했으나, 이걸 어떻게 구현해낼것인가가 관건이었다. 벡터의 내적을 사용할 것인가, 외적을 사용할 것인가. 하지만 결국 각 벡터의 X값을 크기비교하여 그 범위 안에서만 움직일 수 있도록 했다.

마감 일자를 지켜야하기 때문에 더 오래 걸리지 않는 방향으로 구현하기로 했다.

알파타입 마감 일자가 다가올수록 마감일을 마쳐야한다는 책임감이 커졌기 때문이다. 프리랜서로 활동하고, 협찬, 광고 건으로 사진, 영상을 만들었던 사람으로서 마감일자는 생명이라고 할 수 있다...!

void AScrew::MoveScrew()
{
	if (GetActorLocation().X >= startLoc.X || (deltaRot < -15 && deltaRot > -120))
	{
		//회전
		SetActorRotation(GetActorRotation() + FRotator(0, 0, -1 * rotIntAngle * 0.043f));
		//이동 : rotIntAngle 증가한만큼 나사가 forwardvector로 이동한다
		SetActorLocation(GetActorLocation() + GetActorForwardVector() * rotIntAngle * 0.003f * -1);
	}
}

 

<나사 구현 영상>

애정을 갖고 열정을 갖고 될때까지 계속해서 붙잡고 고민하고 생각한 결과! 뿌듯하다. 나사가 돌아가게 하였지만 추가로, 회전의 정도와, 나오는 거리 부분, 충돌 부분은 계속해서 조정해줘야하고, 조정할 것이다. 

728x90
반응형