궁극의 나사돌리기 유사 시뮬레이션
Unreal VR Screw Simulation
[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);
}
}
<나사 구현 영상>
애정을 갖고 열정을 갖고 될때까지 계속해서 붙잡고 고민하고 생각한 결과! 뿌듯하다. 나사가 돌아가게 하였지만 추가로, 회전의 정도와, 나오는 거리 부분, 충돌 부분은 계속해서 조정해줘야하고, 조정할 것이다.
'언리얼엔진 개발 > VR' 카테고리의 다른 글
[UnrealEngine5] 나사 돌리기 그 후 (2) | 2023.06.09 |
---|---|
[UnrealEngine5]버튼을 누르면 문 열고 닫기 C++ (5) (0) | 2023.05.20 |
[UnrealEngine5] VR 나사 돌리기 만들기(4) (0) | 2023.05.14 |
[UnrealEngine5] VR 나사 돌리기 만들기(3) (0) | 2023.05.13 |
[UnrealEngine5] VR 나사 돌리기 만들기(2) (1) | 2023.05.12 |