우선 소스는 이게 다구요.. 우선 GPG에 있는 내용을 토대로 작성하였던 겁니다.. 이곳 " 게임 개발자 네트워크"에서 검색해 보시면 카툰에 대해서 나오죠? 거기에 링크 걸려있으니 찾아 들어가시면 위의 소스에 대해서 토론한것들이나 설명같은거 자세하니 궁금하시다면 찾아 들어가 보시면 될듯하구요.. 이거 만들때 문제가 발생해서 볼따구님께서 정말 많이 도와주셨습니다.. 막판에 않되던거 볼따구님이 수정해 주셨죠 ㅎㅎ;; 예제소스는 볼따구님이 수정해주셨던 걸로 올립니다.. 내용은 위에꺼와 똑같습니다.
// 평면 방정식에 D 값 구하기 ( AX+BY+CZ+D = 0 ) // D = -(AX+BY+CZ) // = -( (a,b,c) * (x,y,z) ) //
// Step.1 // 먼저 평면에 포함되어 있는 점을 가지고 d 값을 구한다. // 원점을 중심으로 노멀값으로부터 떨어진 점(vPoint)의 d 값을 구하면, // 원점의 평면에서, 평면 방정식을 성립함 (당연 점(vPoint)는 캐릭터의 바운딩박스임) d1 = -D3DXVec3Dot(&vNormal[j],&vPoint[nCnt]);
// Step.3 // 마지막으로 d1과 d2값을 뺀다. // 먼저 빼는 넘(지금은 d1)을 기준으로 d2가 있는 방향과 거리가 나온다. // 두개의 값을 뺀 결과 값이, [+] 값이라면 d2는 d1의 오른쪽(+방향)에 있는 것이며, // [-] 값이라면 d2는 d1에 왼쪽(-방향)에 위치하고 있다. // 만약 0이면 d2는 d1에 완전히 포함했다. 라는게 성립된다. dir = d1 - d2;
if( dir < 0 ) // 0 보다 작으면 더 계산할 필요없이, 충돌이 아님 break; // 현재 for문을 끊어버림~
// 여기까지 오면 일단 현재 면은 충돌로 판정해야 한다. ++nCollCount; // 충돌면의 숫자를 늘린다. }
if( nCollCount >= 6) // 충돌한 면이 6면보다 많다면, 물론 많을순 없지만 -_- { return true; // 충돌 되었다고 알리고, 여기서 충돌채크는 끝을 낸다. }
댓글을 달아 주세요