[펌] 3D공간구조 기본충돌
Plane to Plane
-> 한평면의 테두리인 4개의 직선과 평면 충돌로 검출
// 평면1과 평면2의 선분 4개와 충돌 검사를 한다.
for( int I = 0; I < LineNum; i++){
{intersect3D_SegmentPlane( Segment S2[i], Plane Pn1, Point* I ) }
//평면 2와 평면1의 선분 4개와 충돌검사를 한다. LineNum = 4
for( int I = 0; I < LineNum; i++)
{intersect3D_SegmentPlane( Segment S1[i], Plane Pn2, Point* I ) }
BOOL CheckPlane()
{
for( int I = 0; I < LineNum; i++){
if( intersect3D_SegmentPlane( Segment S2[i], Plane Pn1, Point* I ) )
return TRUE;
}
for( int I = 0; I < LineNum; i++)
{
if( ntersect3D_SegmentPlane( Segment S1[i], Plane Pn2, Point* I ) )
return TRUE;
}
}
Sphere to Sphere
-> 구의 반지름 길이로 충돌검출
float D;
|Vr| = D = sqrt(Vr.x*Vr*x + Vr.y*Vr.y + Vr.z*Vr.z)
(벡터크기는 DX에서는 D3DXVEC3Length 란 함수로 제공한다. 그 외에 벡터들간의 연산에 관련된 여러 가지 함수들이 제공되어 편하다 )
if( (r+R) > D )
{
// sphere 충돌
}
float d = (Vr.x*Vr*x + Vr.y*Vr.y + Vr.z*Vr.z)
(r+R)² > d
Sphere to Line
-> 직선의 방정식과 구의 방정식을 이용해 충돌 검출
// return 값이 -1 이 아니라면 교차한다.
float ray_sphereIntersection(sphere_t* sphere, ray_t* ray) {
//B = [xd (x0 - xc) + yd(y0 - yc) + zd(z0 - zc)]이므로
// b - 직선의 방향벡터 d 와 직선의 한점 o 에서 구의 중심 p
// 으 로 향하는 벡터의 dot product
// C = (x0 - xc)² + (y0 - yc) ² + (z0 - zc)² - rs²
// 2가아니라 제곱입니다. 제곱은 카피가 안되니 조심하세요. //…
//vsquaredist = (o.x-p.x)²+(o.y-p.y)²+(o.z-p.z)²
float b = vdot(ray->d, vsub(ray->o, sphere->p));
float c = vsquaredist(ray->o, sphere->p) - (sphere->r * sphere->r);
// d = b²-c
float d = b * b - c;
if (d < 0.0f) {
return -1.0f;
}
return -b - sqrt(d); //t 값 return
}
BOOL WINAPI D3DXSphereBoundProbe(
const D3DXVECTOR3 *pCenter, // 구의 중심점
FLOAT Radius, // 구의 반지름
const D3DXVECTOR3 *pRayPosition, //직선의 위치
const D3DXVECTOR3 *pRayDirection //직선의 방향 벡터
);
'Programming > Math' 카테고리의 다른 글
투영 벡터 ( Projection Vector ) (0) | 2012.05.16 |
---|---|
동차좌표 ( 同次座標, Homogeneous coordinate ) (0) | 2012.05.16 |
좌표계 (0) | 2010.07.01 |
역행렬(Inverse Matrix) (0) | 2010.03.17 |
행렬식(Determinant) (0) | 2010.03.17 |