본문 바로가기
회사 TIL

[TIL] 22.01.04 / AddWorldOffset, AddLocalOffset, InverseTransformVector, 퍼즐 보정, 왜 못했는지 생각하기1

by imagineer_jinny 2023. 1. 5.

TIL (Today I Learned)

 

오늘 해야할 것

  • 3 x 3 퍼즐 구현

 

오늘 한 것

  • 3 x 3 퍼즐 구현중

 - 보정을 어떻게 해줄 것인가?

- 지금은 판의 범위 상관 없이 막 움직임

- 원하는 것은 격자 내에서만 움직이고 싶다.

- 네모 영역에 퍼즐이 들어오면 그 영역의 지정된 자리로 퍼즐이 붙는다. 

 

 

필요한 것

- 네모 영역: 빨간네모칸

- 지정된 자리: 초록점

 

- 퍼즐이 들어왔는지 어떻게 판단?

현재 잡고 있는 퍼즐의 위치가 네모 영역에 들어오면 퍼즐의 위치를 초록점으로 옮겨준다.

 

- 네모 영역에 들어오는건 어떻게 판단?

dir과 puzzle의 plane vector를 내적한 값이 45도 이하 && 퍼즐의 중점이 어디에 있나? 

퍼즐 중점이 2 영역에 들어오자마자 2로 가는것.


처음 시도 한 것

퍼즐의 중점과 영역의 중점과의 거리가 5랑 같거나 작으면 퍼즐의 중점이 영역의 중점으로 움직인다.

if (_puzzlePos.X > -4.7)
{
    //여기서 다시 움직여준다.
    _puzzlePos.X = 0.f;
    _puzzlePos.Y = -5.f;
    _puzzle1->SetRelativeLocation(_puzzlePos);

}

 

- 판의 각각의 중점 정보를 입력해주고 이걸 받아와서 자동 보정을 해주자.

TArray<TArray<FVector>> _boardCenterPosInfo
    = {
        {FVector(-9.6, -15.3,0),FVector(0, -15.3,0),FVector(9.6, -15.3,0)},
        {FVector(-9.6, -5,0),FVector(0, -5,0),FVector(9.6, -5,0)},
        {FVector(-9.6, 4.6,0),FVector(0, 4.6,0),FVector(9.6, 4.6,0)},
        {FVector(-9.6, 14.3,0),FVector(0, 14.3,0),FVector(9.6, 14.3,0)}
      };
if (_puzzlePos.X > -4.7)
{
    //여기서 다시 움직여준다.
    _puzzlePos = _boardCenterPosInfo[1][1];
    _puzzle1->SetRelativeLocation(_puzzlePos);

}

 

1. 손을 뗐을 때 퍼즐의 위치를 받아온다. 

2. 퍼즐의 위치를 확인한다.

3. for문을 돌며 퍼즐의 위치와 가장 가까운 x,y 좌표를 확인한다.

- Sqrt 써서 점과 점 사이의 거리 구해주기

4. 가장 가까운 x,y 좌표로 puzzle의 위치를 보정해준다. 

 

 

 

오늘 배운 것

  • 보정된 움직임 왜 못했는지 생각하기

- 이미 기능이 작동되는 코드는 의심하고 싶지도 않고 건드리고 싶지도 않았던 마음이 컸다.

- 그래서 기존 코드를 건드리지 않는 선에서 바꿔주려고 애쓰고 + 이미 잘 되는 코드는 왜 돌아가는지 자세히 생각하지 않은게 큰 원인이었다.

 

- 그리고 Local, World 좌표로 다 맞춰줘야 한다는 사실은 알겠는데 비교해주는 대상들끼리만 맞추면 되는거 아닌가? 라고 마음대로 생각해버렸다. 

 

- 기존 코드에서는 dir에 AddWorldOffset을 해줬다. 

나머지는 다 local 처리를 하는데 dir은 world라도 이상하다는 생각을 안했다. 이미 되는 코드가 있었으니까!

 

- 아예 안보더라도 차례대로 논리적으로 생각할 필요는 있었다. 

- 움직이는게 이상하면 움직임을 주는 코드들을 더 살펴볼 필요가 있었는데 내가 짠 조건만 틀렸을 것이라고 생각했다.

 

 

  • 1. AddWorldOffset과 AddLocalOffset, InverseTransformVector

InverseTransformVector: Do backward operation when inverse, translation -> rotation -> scale

설명은 저런데 월드->로컬좌표 변환에 쓰임

 

FVector fingerPos = _fingerSocketRef->GetComponentLocation();
FVector fingerPrevPos = _fingerPrevPos - _puzzle1->GetComponentLocation();
FVector fingerCurPos = fingerPos - _puzzle1->GetComponentLocation();

dir = fingerCurPos - fingerPrevPos;
FVector up = GetActorUpVector();

dir = UKismetMathLibrary::ProjectVectorOnToPlane(dir, up);

//World -> Local
dir = _puzzle1->GetComponentTransform().InverseTransformVector(dir); 
if (UKismetMathLibrary::Abs(dir.X) > UKismetMathLibrary::Abs(dir.Y))
{
    dir.Y = 0; 	
}
else
{
    dir.X = 0; 
}


_puzzle1->AddLocalOffset(dir);

 

내일 진행할 것

  • 3 x 3 구현 마무리....!

 

앞으로 진행할 것

  • 유데미 언리얼 강의 듣기
  • UE5 블루프린트 강의 듣기
  • R1 Project 커리큘럼 - 유데미 강의 들으면서 러프하게 짜기
  • Static Mesh / Skeletal Mesh(애니메이션을 위한) 찾아보기
  • Texture / Material(상위개념)  찾아보기
  • Pico 빌드
  • 서랍, 문 등 다시 잡을 때 손잡이가 앞으로 확 오는 문제 처리하기

 

댓글