커서 이동하기전에

일단 화면 중심점을따라 라인트레이싱해서

충돌된 스크린 좌표 가져오는 내용을 했었는데

이렇게 구한 YZ 좌표를 스크린의 XY계로 변경할수 있어야함.

 

정면 스크린의 경우

1470, 0, 640에 위치하고 있으니

 

1920x1080의 절반인 960 x540이 화면 중점 좌표고

아래의 사진의 경우 Y=533이므로

 

저 빨간점의 좌표는 (960 + 533) x 540 -> 1493 x 540쯤 될것이다.

 

 

 

 

 

하지만 좌우에 위치한 기울어진 화면의 경우 문제가 된다.

충돌 지점의 위치가 1064, 1182, 640인데

이걸 어떻게 할까.

 

 

 

 

 

스크린 바로 위에 큐브를 배치해서 대강 중점과 코너 위치를 정리했다.

큐브 z는 1200이라 생략하고 XY만 작성

 

 

 

 

위에 스크린 3에 라인트레이싱 한 결과는

충돌 지점의 위치가 1064, 1182, 640였으므로

 

대충 파란색 지점쯤 될것인데 이걸 어떻게 계산시킬까

영상처리에서 어파인변환 같은느낌으로 해야할것같기도하고.

 

 

 

그냥 가장 간단하게 생각하면

먼저 시작점과 파란점 사이 각도 세타를 구하고

위 그림의 파란점을 - 시작점 한뒤

파란점을 세타만큼 역방향 회전시키면 진짜 위치를 구할수 있을것같다.

 

 

 

오른쪽스크린, 왼쪽스크린 시작점 벡터 추가

각 스크린 시작점은 맨 왼쪽에 있는 지점 사용

 

 

 

 

 

일단 BP_Screen2부터 생각해보자.

 

아까 이사진의 충돌점을 화면상 좌표를 계산했었는데

----

1920x1080의 절반인 960 x540이 화면 중점 좌표고

아래의 사진의 경우 Y=533이므로

저 빨간점의 좌표는 (960 + 533) x 540 -> 1493 x 540쯤 될것이다.

---

스크린X는

Screen_X = (960 + LT_Y)

LT_Y = 533

=> Screen_X = 1493

 

스크린Y는

540 - (LT_Z - 540) = 1080 - LT_Z 

LT_Z  는 640이므로 

=> Screen_Y = 440

?

 

인가 싶은데 좀햇갈린다.

 

 

 

LT_Z=640  일때 Screen_Y = 540

LT_Z= 1180 일땐 Screen_Y = 0

LT_Z = 0    이면 Screen_Y = 1080

이 되어야 한다.

 

이에 대한 방정식은

 

Screen_Y = -LT_Z + 1180이 된다.

스크린 X는 아까 구했고

Screen_X = 960 + LT_Y

 

 

이제 좌표 계산하려고하는데

가져오기 힘들어서 따로 HitLoc 벡터 추가해서사용

 

 

ScreenX, ScreenY int 변수 추가해서 하면 잘동작하는데

 

 

라인트레이싱에서 월드 다이나믹스로 충돌 감지하도록하다보니

BP_Cursor 충돌을 NoCollision으로 해야함.

 

 

 

 

이제 아까 하던 오른쪽 화면을 해보자.

먼저 충돌점 - 시작점 한후 세타부터 계산

해봣는데

 

어딜가든 -60이 나온다.

당연한게 스크린을 -120(뒤집혀서 이럼) 회전시켜서 스크린상 충돌지점은 어딜가나 똑같음

 

 

 

그래서 atan2할필요없이 그냥 60도 회전하면 될줄 알았는데 뭔가 잘안된다.

충돌점, 시작점 차벡터를 구해서 z축 60도 로테이터로 벡터 회전만 시켜주면 끝인줄 알았는데

전과 후나 차이가 없음.

 

그래서 손계산 하다가 생각난 방법은

 

충돌-시작점 차벡터의 놈을 Screen_X로 쓰면될듯하다.

 

벡터 랭스로 놈을 구해서 쓰니 원하던 X축 좌표가 잘나온다.

 

 

 

 

이번에는 좌측 화면 좌표를 잡으려하는데

좌측 화면 중심이 충돌점이라 치자

 

그러면 좌측화면 시작점을 0,0으로 보내서 놈 계산하려면

여기도 충돌점 - 시작점하면 될듯

 

 

 

 

 

좌측 화면도 정상 동작 확인해서

최종 정리하면 이런식이 될듯하다

 

정면 스크린은 x로 +1920

우측스크린은 x로 + 3840

 

 

중간에 추가한 스크란 좌표 출력

 

 

 

실제 스크린에서 비치할 좌표가 정상적으로 나온다.

 

 

 

일단 지난 글까지 카메라 중심으로 부터 간단하게 라인트레이싱하는것까지만 봤는데

윈 api로 마우스 커서 이동시키기전에 먼저 커서 매시 만들어서 위치시키려고한다.

 

 

히트인포를 분할시켰더니 이런식으로 나오는데

히트 거리, 로케이션 정도면 충분할듯

 

 

일단 거리, 위치는 잘 나오는듯 한데

 

커서를 dist -20 지점쯤에 띄워주면 될듯

 

 

 

 

 

블렌더로 대충 커서로 쓸 삼각형 만들고

게임에 대충 추가

 

 

커서를 배치할때

스크린1은 120도

스크린2는 0도

스크린3은 -120도 회전시켜야 하므로

 

 

충돌 여부와 충돌 액터이름 출력 추가

 

 

 

무슨 액터와 충돌했는지 나오니

커서도 잘 회전시킬수 있을듯

 

 

 

 

 

 

근데 저 커서를 가져오려고하니 액터가 아니라 bp에서 접근이 안되니 엑터로 만들어 사용

 

 

 

 

커서가 스크린에 따라 회전되니 커서 위치도 바꿔줄 차례

 

라인 트레이싱 지점에서 살짝 스크린 앞으로 나온 지점으로 커서 이동

 

 

중심점으로 게임 커서 이동, 스크린에 따라 회전 결과

 

 

 

 

이제 대강 카메라 제어도 만들었겠다.

손으로 마우스 제어를 하려고한다.

 

그런데 우선 두손을 주먹쥐면

 

카메라 방향 라인트레이싱해서

화면과 충돌된 지점의 위치를 가져와서

그 지점으로 마우스 커서 이동시키려고 함.

 

하다보니 

 

윈api DC에선 마우스 커서가 보이질 않는다.

따로 커서 매시를 화면에 띄워줘야 될것같은느낌

 

 

 

주먹을 완전히 쥐었더니

카메라 제어상황과 오해해서

 

 

엄지는 쥐지않고 이정도 자세가 적당한듯

 

b_l_index1 은 b_l_index3과

b_l_middle1 은 b_l_middle3과

b_l_ring1 은 b_l_ring3과

b_l_pinky1 은 b_l_pinky3과

 

근데 이 4손가락 다 보는건 너무 내용이 많아지므로

 

index, middle 두손가락이 1, 3이 서로 가까운지 보면 될듯.

근데 생각해보니 양손다 이상황을 판단시키기엔 양이 많아질것같아

왼손만 시켜야할듯하다.

 

 

상태들은 따로 불리언 변수로 빼고

상태, 검지 중지 거리 출력 bp

 

위 루틴으로는 두손 존재 + 줌인아웃,좌우회전이 아닐때 넘어간다.

 

 

 

 

검지 거리가 안나오고, 

출력이 줌인아웃 아닐때만 출력됨.

 

보니 index1, index1 가져오도록했었음.

 

이 루틴에는 거리만 출력하고

 

상태 초기화 전에 

기존에 저장된 상태값 출력하도록 수정

 

 

이상한게 엄지검지 붙은 상태에서 줌인아웃, 안할때만 출력된다.

원래 의도는 아닌데

생각해보니 attach false때하면 되는걸 잊음

attach false때 들어가도록 수정

 

 

 

쥐었을때 거리가 아주 커도 40이하는 되고

평소 손을 폈을때 5~60쯤 된다.

 

 

 

 

일단 커서 상태 저장하는 부분까지하고

라인트레이싱 시작

 

 

 

 

일단 대충 라인 트레이싱 

 

 

 

 

 

 

 

+ Recent posts