DDT를 하기위해선 피킹을 알아야되는데
피킹을 하기위해선 레이에 대한 기본 개념부터 알아야된다.
Ray는
어떤 방향으로 무한히 뻗어나가는 반직선을 레이라고 부른다.
피킹충돌을 걸러낼 땐 구가 더 편하다. 하지만 육면체충돌도 인터넷에 풀코드로 나와있다. 이걸로 테스트하기
원근투영같은경우
x,y,z 하고 원근투영행렬을 곱하면
x11,y22가 나온다.
z는 1로 이후 단위벡터 (z가 1인 이유는 Ray는 카메라를 기준으로 하면서 계속 뻗어나가는 것이다. z가 계속뻗어나간다고 생각하면 된다.)
이후 방향을 월드공간으로 변환하려면 뷰행렬을 역행렬해준다음 처리해주면된다.
피킹
3차원 공간에 있는 물체를 2차원 공간으로 변환하는 작업
"원방정식"을 사용함 (피타고라스정의라고 생각하면 편하다)
이미지
||O-P||=R
크기 구하기 크기를 구할땐 루트(x^2+y^2+z^2) 피타고라스정의?
(||O-P||)^2 = R^2
O^2 -2OP +P^2=R^2
광선
P= 광선의 원점 + 광선의 벡터*광선의 원점과 P까지의 길이
광선의 원점 = S
광선의 벡터 = D
광선의 원점과 P까지의 길이 =T
P=S+Dt;
위의 식에 대입을 하게된다면
||O-P||=R -> ||O-S+Dt||=R
여기서 원점과 방향은 우리가 알고있다 (광선은 직접 쏘고, 도형은 갖고있다. 여기서 충돌체크하는것이기 때문에)
t만 모르고있음
O^2 -2OP +P^2=R^2 -> O^2 -2O(S+Dt) +(S+Dt)^2=R^2
이차방정식으로 나타난다.
이차방정식은 인수분해 근의공식으로 풀수있는데 근의공식으로 풀것이다.
인수분해는 안되는조건이 있음

위식이 복잡해져서 ||O-S+Dt||=R 에서 O-S를 하나로 묶어서 V로 표현
Dt^2 + 2MDt + M^2 -R^2=0
a = D^2
b = 2MD
c = M^2 -R^2
D는 벡터이기때문에 1
a=1
벡터들의 곱은 내적으로 처리해주면 된다.
값은 두가지로 나오게된다.
왜냐하면 원을 뚫고나오는 이 두번의 작업을 하기 때문이다.
근의 공식을 이용해서 t를 구해준다. (인수분해도있지만 이것은 나오지않을때도있기때문에 근의공식으로)
D는 단위벡터방향이므로 크기는 1이다.
근의공식으로 하면 +와 - 두가지 결과가 나온다.
'공부 > DirectX' 카테고리의 다른 글
| DIrectX 3D 빌보드 (0) | 2022.01.26 |
|---|---|
| DirectX 3D 지형타기 (0) | 2022.01.22 |
| DirectX 3D LandScapeComponent (Terrain) (0) | 2022.01.22 |
| DirectX 자원뷰의 종류 (0) | 2021.12.15 |
| Texture (0) | 2021.09.28 |