TIL (Today I Learned)
오늘 해야할 것
- Lever 정확히 이해
- Drawer 논리적 사고로 코드 안보고 짜보기
- Lever 논리적 사고로 코드 안보고 짜보기
- Strong Box 코드 분석 + 어떻게 구현할지 생각해보기
오늘 한 것
- Drawer 논리적 사고로 코드 안보고 짜보기
- Drawer 목표: 손으로 손잡이를 잡아당기면 서랍이 따라온다.
- 1. 손의 위치 구하기
- 2. 물체의 중심 구하기 -> 왜? 물체가 끌려와야 하니까
- 3. 물체가 끌리는 방향 필요
- 4. 손이 끄는 방향 필요
- 5. ideal case: 물체가 끌리는 방향과 손이 끄는 방향이 일치할 때
- 6. worst case: 강제로 끄는 방향과 끌리는 방향이 같게 하고 싶다. -> Projection
FVector _handPos = _handSocketRef->GetComponentLocation() - GetActorLocation();
FVector _forwardVec = GetActorForwardVector();
_forwardVec.Normalize();
_handPos=_handPos.ProjectOnTo(_forwardVec);
FVector newPos=GetActorLocation()+_handPos;
SetActorLocation(newPos);
-> 좌/우로 움직임
-> 방향이 잘못되었나? 하면서 _forwardVec을 봤고 Actor의 ForwardVector가 정확히 어디를 가리키는진 모르지만 방향성을 정확히 해야겠다고 생각했음-> 정확히 내가 끌어당기는 방향을 제시해주자 -> 내가 잡고 있는 위치 - GetActorLocation 해줘서 방향을 바꿔줌
FVector _handPos = _handSocketRef->GetComponentLocation() - GetActorLocation();
FVector _forwardVec = _grabArea->GetComponentLocation() - GetActorLocation();
_forwardVec.Normalize();
_handPos = _handPos.ProjectOnTo(_forwardVec);
FVector newPos = GetActorLocation() + _handPos;
SetActorLocation(newPos);
-> 앞뒤로 움직이긴 하는데 잡는 위치가 Drawer의 가운데로 잡힘
handPos의 크기 문제라고 생각. 늘어나는 만큼을 지정해준다. 물체 중앙이 아니라 손잡이의 소켓 위치까지
FVector _handPos = _handSocketRef->GetComponentLocation() - _handSocketPosWhenGrabbed;
FVector _forwardVec = _grabArea->GetComponentLocation() - GetActorLocation();
_forwardVec.Normalize();
_handPos=_handPos.ProjectOnTo(_forwardVec);
FVector newPos=_actorPosWhenGrabbed+_handPos;
SetActorLocation(newPos);
-> 정상 작동
- Wheel 논리적 사고로 코드 안보고 짜보기
- Wheel 목표: forward 축 기준으로 돌아가는 데 손을 잡고 돌리면 돌아가기
- 1. 손의 위치
- 2. 중심이 되는 축
- 3. ideal case: 손이 정확히 흔들림 없이 마치 forward축이 없는 것처럼 움직이는 것
- 4. worst case: 손이 forward 축이 0이 아닌 값이 되게 움직이는 것. 손이 fwd=0인 공간에 붙어있게 하고 싶다 -> Projection.
- 5. 붙은 다음에 손의 변화하는 위치에 따라 각도를 구해서 각도만큼 더해준다.
- 6. 시계 방향으로 돌리면 시계방향으로 돌아가게 + 반시계방향으로 돌리면 반시계로 돌아가게 -> 외적
- 7. 손의 위치끼리 얻은 각으로 시계방향, 반시계방향 판단해서 case 분류해서 넣어주기
- 8. AddRelativeAngle로 if문 안에서 실제 회전 구현하기
void AR1WheelBase::RotateWheel2()
{
if (_handSocketRef == nullptr)
return;
FVector _handPos= _handSocketRef->GetComponentLocation();
//FVector _handPos= _handSocketRef->GetComponentLocation()-GetActorLocation();
FVector v1=_handPrevPos-GetActorLocation();
FVector v2=_handPos-GetActorLocation();
FVector _forward = GetActorForwardVector();
//Projection
v1 = UKismetMathLibrary::ProjectVectorOnToPlane(v1, _forward);
v2 = UKismetMathLibrary::ProjectVectorOnToPlane(v2, _forward);
//각 구해주기
double angle= R1Math::GetAngleBetweenTwoVectors(v1, v2);
//외적 구해주기 -> 방향 판단
FVector v = UKismetMathLibrary::Cross_VectorVector(v1, v2);
if (_forward.Dot(v)<0)
{
_mesh->AddRelativeRotation(FRotator(0,0,angle));
}
else
{
_mesh->AddRelativeRotation(FRotator(0, 0, -angle));
}
_handPrevPos = _handPos;
}
보정이 끊김 -> 처음에 handPos 구할 때 GetActorLocation을 두번 빼줬음 -> 한 번으로 수정
- Lever 논리적 사고로 코드 안보고 짜보기
- Lever 목표: 레버를 잡고 움직이는 방향에 따라 회전 하는데, 일정 각도로는 안내려가게 막아주고 싶다
- 1. 손의 위치
- 2. 고정된 축 -> 축 중심 회전이니까
- 3. 근데 BaseMesh의 RightVector 중심으로 돌아갈 때 BaseMesh의 RightVector가 0인 것처럼 손이 지정된 영역만 움직이고 싶다 -> Projection
- 4. 손의 위치 두개의 각을 구한다
- 5. 손의 위치 두개를 외적해서 축을 구하고 시계방향인지 반시계인지 판단후 돌려준다.
- 6. 돌리는 것에 성공하면 회전 각도를 제한해준다.
오늘 배운 것
- 코드 짜기 전 논리적으로 생각하기
오늘 느낀 것
- 많이 본 코드는 흐름과 이유들이 외워져서 설명해보라고 했을 때 외운대로 설명하는 느낌이 있었다.
- 이 경우, 똑같거나 비슷한 것만 구현해낼 가능성이 크기 때문에 무엇이 필요한지 글로 정리하고 코드를 짜는 연습이 많이 필요하다.
- 잡생각을 안하려고 했는데 우울한 마음에 집중을 좀 못했다. 연습하면 좋아지겠지..
내일까지 진행할 것
- WheelBase 완벽히 이해하기- 특히 if문 안에
- projection 정확히 왜 해야 하는지?
- R1LeverBase RotateLever 원래 코드의 문제점 (forward) -> 투영 시켜서 어떻게 바꿀 수 있나?
- upVector로 바꿨을 때의 문제점 -> 투영 시켜서 어떻게 바꿀 수 있나?
- 외적 정확히
- 내적 정확히
- acos, asin, atan 정확히
내일 진행할 것
- Strong Box 시도하기
앞으로 진행할 것
- 오큘러스 내 빌드 해결
- SCP 914 찾아보기
https://www.youtube.com/watch?v=-9rbYP0cDjU
https://www.youtube.com/watch?v=V2Ps5bM4TwE
'회사 TIL' 카테고리의 다른 글
[TIL] 22.12.16 / 금고 1단계 이동/회전 구현하기 + 제한 주기 (0) | 2022.12.18 |
---|---|
[TIL] 22.12.15 /World, Local 좌표 이해하기😥, Strong Box 1단계 도전 (0) | 2022.12.16 |
[TIL] 22.12.13 / Drawer, Wheel 코드 분석 (0) | 2022.12.14 |
[TIL] 22.12.12 / 에셋 가져와서 BP, C++ 만들기 (0) | 2022.12.13 |
[TIL] 22.12.09 / 레버 돌리기, 종합 수학 개념들 (0) | 2022.12.10 |
댓글