언리얼에서 윈도우 화면 커서 이동을 구현하려고함.

이 다음엔 윈도우 커서따라 언리얼 커서도 따라가야할것

 

 

 

지금까지 제어로직은 이런식

조건 1. 양손 존재 확인

조건 2. 엄지 검지 붙음 : 줌인아웃회전제어

조건 3. 왼손 엄지/검지3이 엄지/검지3과 가까움 : 초기점 설정

 

 

조건1, 2 true : 줌인아웃 회전제어

조건1, 3 true : 초기점 설정

 

 

마우스 커서 이동 조건은 이런식으로 할 예정

1.양손 보임

2. 왼손 검지, 중지 붙음 

 

 

 

 

간단하게 만들어서 확인하니

손 펴서 엄지검지 떨어질땐 30이상

엄지 검지 붙였을땐 20이하

 

손펼때 손가락붙일때

 

 

손가락 붙은 상황

중지끝 diff 계산해서 따라 마우스 이동 시키면 될듯

이를 위해 

LeftMidVecForCursor 벡터 변수 추가

 

0 체크해주고

0아니면 diff 계산

 

 

 

언리얼 전역계 Y diff는 스크린 X

언리얼 전역계  diffZ는 스크린 Z로 해주면 될것같긴하지만

스케일링 필요하지 않은지 먼저 출력해서 확인해봐야할듯해서

 

따로 diff 출력 추가

 

 

확인하려다가 잠깐 빠트린게 마우스 커서 이동 상태인지 체크 안했다.

 

cursor move 추가

 

 

보니까 손 땟다 붙였을때 이전 위치 사용해서 때졋을때 0초기화로 수정

 

 

 

 

diff 출력한거 보니 굳이 스케일링 따로 안해도될듯

 

 

 

이렇게 이동한 위치 따라 커서 이동 구현해야하는데

 

ScreenX/Y 좌표를 월드 좌표계로 변환시켜야한다.

 

 

위아래 이동인 ScreenY부터 생각해보자

 

handdesktop 23번 글에서 Screen_Y 계산하는 식을 이런식으로 정리했었는데

---

Screen_Y = -LT_Z + 1180

---

지금은 라인 트레이싱을 하는게 아니니 LT_Z 대신 Coord_Z로 표기해서 이 값에 대해 수정하면

 

 

Coord_Z = 1180 - Screen_Y가 된다.

 

그러고보니 Screen XY 임계치도 설정해줘야할듯

 

 

 

임계화 시킨건 좋은데 Y를 반대로 하는걸 잊었다.

손이 위로 올라가면 커서가 올라가는 것이므로 Y는 낮아져야함

아무튼 임계화도 정상 동작 확인

 

 

다시 아까 하던걸로 돌아와

스크린 Y로 Coord_Z 지금보니 World_Z가 적당할듯하지만

 

Coord_Z = 1180 - Screen_Y

 

그냥 WorldCursorTF로 트렌스폼 변수 추가

먼저 커서 위치 설정하는 부분에 월드 커서 TF의 LoC와 Rot 설정

(스케일은 0.5)

 

 

다시 돌아와서

 

Coord_Z = 1180 - Screen_Y를 블루프린트로 만들고

 

월드 커서 TF로 커서액터 이동하도록 만들어 테스트하니 정상동작 확인

 

 

 

 

월드커서Z는 했으니 스크린X로 월드커서XY를 구해야한다.

스크린 좌표와 월드 화면의 위치를 같이 보면 이런식이 된다.

 

스크린 X값에 따라 현재 스크린이 무엇인지 판단하고

그에 따라 다르게 동작하도록 하면 될것같다.

 

 

2번 스크린의 경우 간단하다.

ScreenX가 1920 ~ 3840 일때 2번 스크린인데

2번 화면은 회전되어있지 않으므로 

또, 화면과 동일 위치에 있으면 가려지므로 -10 해줌

 

World_X = 1470 - 10

World_Y = ScreenX - 1920 

 

이렇게 동작하도록 BP만들었는데 생긴 문제가

 

커서 초기화 루틴이랑 커서 이동 루틴이랑 엄지, 검지가 까까워지면서 오해한다

 

커서 초기화 루틴 손동작을 엄지검지 대신

약지소지로 변경

 

 

또 이상한게 커서 초기화 후 제어 시작할때

중심점이 아닌 우측 화면 시작점에서 부터 커서가 나온다.

 

World_Y = ScreenX - 1920 을 하면 0으로 가는데 문제는 스크린 2는 Y가 -960부터 시작하기 때문으로보임.

World_Y = ScreenX - 1920 - 960 = ScreenX - 2880 으로 수정

 

 

 

정상동작 하나 옆화면으로는 못넘어간다.

 

 

 

이제 ScreenX로 좌우 스크린 XY를 계산해야한다.

먼저 좌측 스크린부터 생각해보자.

 

내가 라인트레이싱 충돌점으로 ScreenX계산한걸 생각하면 벡터의 놈을 사용했었다.

반대로 ScreenX는 놈값이니

 

좌측스크린 좌측시작점에서 좌측끝점을 향하는 벡터를 구해서

ScreenX(0~1920)를 곱해주면 되지않을까 싶다.

 

 

근데 좌측 스크린의 경우도 겹치는걸 방지하기 위해

BP_Screen2는 World_X = 1470 - 10 해서 -10으로 떨어트렸지만

 

BP_Screen1은 

시작점을 (-185 x -1915) 끝점은 (1475 x -955) 쯤으로 사용하면 될듯

 

 

 

 

요 60도 포워드벡터 가져와출력해보니 0.5, 0.866 나오는데

이걸 사용하면 될것같다.

 

 1920 / 2 = 960 이므로

이 포워드벡터 x 960을 한뒤 -190, -1920 하면 640 x -1440 나올듯 하다

 

아까 실수한게

위에서 보면 첫스크린이 y과 각이 60도 정도 벌어진것 처럼보이는데

 

위에있는 분홍 큐브를 사용해보니 z축에 대해 30도 만 회전하면 됨

요 30의 포워드 벡터 만들어서 계산해보니 정상적으로 BP_Screen1의 중심점이 나온다.

 

 

 

 

Start Point Left 를 xy로 +5해준뒤

요 30도 포워드 벡터와 스크린X를 곱해준것을 더해서

만든결과 정상적으로 스크린1,2를 이동가능해진다.

 

 

아직 안한게

스크린 X에 따라 커서를 회전처리도 필요하다.

 

z축 회전각을

정면에는 0도

스크린1의 경우 -60

스크린2는 60

 

일단 기존 구현에 이런식으로 로테이터 추가했더니

커서가 정상 회전하는걸 확인함.

 

 

 

 

 

 

 

 

이번엔 우측 화면을 하자

 

우측 화면 시작점 X축 기준으로

150도 회전하니 이걸로 포워드 벡터얻으면 될것같고.

 

그 포워드벡터 x 960 + 우측시작점 = 640 x 1440이 되는지 보면된다.

 

 

 

블루프린트로 만든결과

원하던데로 BP스크린3 중심점이 생각한데로 640x1440가 나온다.

 

 

 

 

 

BP_Screen3을 위한 WorldCursorTF 도 만듬

 

 

최종 커서 제어 결과

+ Recent posts