삼각형 레이 충돌검사 알고리즘

수학, 물리학 등 게임 프로그래밍의 기반이 되는 이론에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

삼각형 레이 충돌검사 알고리즘

Post by 비회원 »

#define in(a) ((unsigned&) a)
//vPoly는 삼각형 꼭지점 배열,vLine는 라인 시작점&끝점 배열, vIntersection 교차점 리턴

//법선벡터가 저장되어 있지 않다고 가정하고 한것임




bool IntersectedTri2(const CVector3 vPoly[],const CVector3 vLine[],CVector3 &vIntersection)
{
CVector3 v1=vPoly[1]-vPoly[0];
CVector3 v2=vPoly[2]-vPoly[0];
CVector3 vNormal; //법선 구함
CROSS(v1,v2,vNormal); //외적 vNormal = v1 x v2
vNormal.Normalize(); //정규화
const float d= -Dot(vNormal,vPoly[0]);
const float i0=Dot(vNormal,vLine[0]),
i1=Dot(vNormal,vLine[1]); //내적

//평면을 통과하는지
const float t=-(i1+d)/(i0-i1);
if (t<0.f || t>1.f)
return false;

//평면과 교차점
vIntersection.x=vLine[0].x*t+vLine[1].x*(1.f-t);
vIntersection.y=vLine[0].y*t+vLine[1].y*(1.f-t);
vIntersection.z=vLine[0].z*t+vLine[1].z*(1.f-t);
//점이 삼각형 안에 있는지 판단
const float tempa = Dot(v1,v1); //내적
const float tempb =Dot(v1,v2); //내적
const float tempc = Dot(v2,v2); //내적
const float ac_bb=(tempa*tempc)-(tempb*tempb);
CVector3 vp=vIntersection-vPoly[0];
const float tempd = Dot(vp,v1); //내적
const float tempe = Dot(vp,v2); //내적
const float x = (tempd*tempc)-(tempe*tempb);
const float y = (tempe*tempa)-(tempd*tempb);
const float z = x+y-ac_bb;
return (( in(z)& ~(in(x)|in(y)) ) & 0x80000000);
}
[출처] 레이 삼각형 충돌함수|작성자 혀노



이런 소스를 찾았는데
점이 삼각형 안에 있는지 판단하는 부분이 이해가 안됩니다

const float tempa = Dot(v1,v1); //내적
const float tempb =Dot(v1,v2); //내적
const float tempc = Dot(v2,v2); //내적
const float ac_bb=(tempa*tempc)-(tempb*tempb);
CVector3 vp=vIntersection-vPoly[0];
const float tempd = Dot(vp,v1); //내적
const float tempe = Dot(vp,v2); //내적
const float x = (tempd*tempc)-(tempe*tempb);
const float y = (tempe*tempa)-(tempd*tempb);
const float z = x+y-ac_bb;
return (( in(z)& ~(in(x)|in(y)) ) & 0x80000000);
}

어떤 원리인가요?
Locked