OpenGL 충돌처리 어떻게 적용시켜야할지 감이 잘안잡히네요..
조회수 1148회
헤더파일 입니다
typedef float real;
class CBox
{
public:
real center[3];
real axis[3][3];//transformation matrix
real extent[3];//half full size-eqivalent to radius not diameter
real translation[3];// translation vector
void GetTransform(real t[16])
{
t[0] = axis[0][0];
t[1] = axis[0][1];
t[2] = axis[0][2];
t[3] = ((real)0.0);
t[4] = axis[1][0];
t[5] = axis[1][1];
t[6] = axis[1][2];
t[7] = ((real)0.0);
t[8] = axis[2][0];
t[9] = axis[2][1];
t[10] = axis[2][2];
t[11] = ((real)0.0);
t[12] = translation[0];
t[13] = translation[1];
t[14] = translation[2];
t[15] = ((real)1.0);
}
};
int BoxBoxIntersectionTest(const CBox& box0, const CBox& box1);
inline real DotProduct(const real v0[3], const real v1[3])
{//=v0.v1
return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
}
#define fc_fabs fabsf
소스파일입니다...
#include <math.h>
#include "BlockCollision.h"
#ifdef _DEBUG
//#define CD_DEBUG
#endif//of #ifdef _DEBUG
int BoxBoxIntersectionTest(const CBox& box0, const CBox& box1)
{
// compute difference of box centers,D=C1-C0
real D[3] =
{
box1.center[0] - box0.center[0],
box1.center[1] - box0.center[1],
box1.center[2] - box0.center[2]
};
real C[3][3]; //matrix C=A^T B,c_{ij}=Dot(A_i,B_j)
real absC[3][3]; //|c_{ij}|
real AD[3]; //Dot(A_i,D)
real R0, R1, R; //interval radii and distance between centers
real R01; //=R0+R1
//A0
C[0][0] = DotProduct(box0.axis[0], box1.axis[0]);
C[0][1] = DotProduct(box0.axis[0], box1.axis[1]);
C[0][2] = DotProduct(box0.axis[0], box1.axis[2]);
AD[0] = DotProduct(box0.axis[0], D);
absC[0][0] = (real)fc_fabs(C[0][0]);
absC[0][1] = (real)fc_fabs(C[0][1]);
absC[0][2] = (real)fc_fabs(C[0][2]);
R = (real)fc_fabs(AD[0]);
R1 = box1.extent[0] * absC[0][0] + box1.extent[1] * absC[0][1] + box1.extent[2] * absC[0][2];
R01 = box0.extent[0] + R1;
if (R>R01)return 0;
//A1
C[1][0] = DotProduct(box0.axis[1], box1.axis[0]);
C[1][1] = DotProduct(box0.axis[1], box1.axis[1]);
C[1][2] = DotProduct(box0.axis[1], box1.axis[2]);
AD[1] = DotProduct(box0.axis[1], D);
absC[1][0] = (real)fc_fabs(C[1][0]);
absC[1][1] = (real)fc_fabs(C[1][1]);
absC[1][2] = (real)fc_fabs(C[1][2]);
R = (real)fc_fabs(AD[1]);
R1 = box1.extent[0] * absC[1][0] + box1.extent[1] * absC[1][1] + box1.extent[2] * absC[1][2];
R01 = box0.extent[1] + R1;
if (R>R01)
return 0;
//A2
C[2][0] = DotProduct(box0.axis[2], box1.axis[0]);
C[2][1] = DotProduct(box0.axis[2], box1.axis[1]);
C[2][2] = DotProduct(box0.axis[2], box1.axis[2]);
AD[2] = DotProduct(box0.axis[2], D);
absC[2][0] = (real)fc_fabs(C[2][0]);
absC[2][1] = (real)fc_fabs(C[2][1]);
absC[2][2] = (real)fc_fabs(C[2][2]);
R = (real)fc_fabs(AD[2]);
R1 = box1.extent[0] * absC[2][0] + box1.extent[1] * absC[2][1] + box1.extent[2] * absC[2][2];
R01 = box0.extent[2] + R1;
if (R>R01)return 0;
//B0
R = (real)fc_fabs(DotProduct(box1.axis[0], D));
R0 = box0.extent[0] * absC[0][0] + box0.extent[1] * absC[1][0] + box0.extent[2] * absC[2][0];
R01 = R0 + box1.extent[0];
if (R>R01)return 0;
//B1
R = (real)fc_fabs(DotProduct(box1.axis[1], D));
R0 = box0.extent[0] * absC[0][1] + box0.extent[1] * absC[1][1] + box0.extent[2] * absC[2][1];
R01 = R0 + box1.extent[1];
if (R>R01)return 0;
//B2
R = (real)fc_fabs(DotProduct(box1.axis[2], D));
R0 = box0.extent[0] * absC[0][2] + box0.extent[1] * absC[1][2] + box0.extent[2] * absC[2][2];
R01 = R0 + box1.extent[2];
if (R>R01)return 0;
//A0xB0
R = (real)fc_fabs(AD[2] * C[1][0] - AD[1] * C[2][0]);
R0 = box0.extent[1] * absC[2][0] + box0.extent[2] * absC[1][0];
R1 = box1.extent[1] * absC[0][2] + box1.extent[2] * absC[0][1];
R01 = R0 + R1;
if (R>R01)return 0;
//A0xB1
R = (real)fc_fabs(AD[2] * C[1][1] - AD[1] * C[2][1]);
R0 = box0.extent[1] * absC[2][1] + box0.extent[2] * absC[1][1];
R1 = box1.extent[0] * absC[0][2] + box1.extent[2] * absC[0][0];
R01 = R0 + R1;
if (R>R01)return 0;
//A0xB2
R = (real)fc_fabs(AD[2] * C[1][2] - AD[1] * C[2][2]);
R0 = box0.extent[1] * absC[2][2] + box0.extent[2] * absC[1][2];
R1 = box1.extent[0] * absC[0][1] + box1.extent[1] * absC[0][0];
R01 = R0 + R1;
if (R>R01)return 0;
//A1xB0
R = (real)fc_fabs(AD[0] * C[2][0] - AD[2] * C[0][0]);
R0 = box0.extent[0] * absC[2][0] + box0.extent[2] * absC[0][0];
R1 = box1.extent[1] * absC[1][2] + box1.extent[2] * absC[1][1];
R01 = R0 + R1;
if (R>R01)return 0;
//A1xB1
R = (real)fc_fabs(AD[0] * C[2][1] - AD[2] * C[0][1]);
R0 = box0.extent[0] * absC[2][1] + box0.extent[2] * absC[0][1];
R1 = box1.extent[0] * absC[1][2] + box1.extent[2] * absC[1][0];
R01 = R0 + R1;
if (R>R01)return 0;
//A1xB2
R = (real)fc_fabs(AD[0] * C[2][2] - AD[2] * C[0][2]);
R0 = box0.extent[0] * absC[2][2] + box0.extent[2] * absC[0][2];
R1 = box1.extent[0] * absC[1][1] + box1.extent[1] * absC[1][0];
R01 = R0 + R1;
if (R>R01)return 0;
//A2xB0
R = (real)fc_fabs(AD[1] * C[0][0] - AD[0] * C[1][0]);
R0 = box0.extent[0] * absC[1][0] + box0.extent[1] * absC[0][0];
R1 = box1.extent[1] * absC[2][2] + box1.extent[2] * absC[2][1];
R01 = R0 + R1;
if (R>R01)return 0;
//A2xB1
R = (real)fc_fabs(AD[1] * C[0][1] - AD[0] * C[1][1]);
R0 = box0.extent[0] * absC[1][1] + box0.extent[1] * absC[0][1];
R1 = box1.extent[0] * absC[2][2] + box1.extent[2] * absC[2][0];
R01 = R0 + R1;
if (R>R01)return 0;
//A2xB2
R = (real)fc_fabs(AD[1] * C[0][2] - AD[0] * C[1][2]);
R0 = box0.extent[0] * absC[1][2] + box0.extent[1] * absC[0][2];
R1 = box1.extent[0] * absC[2][1] + box1.extent[1] * absC[2][0];
R01 = R0 + R1;
if (R>R01)return 0;
return 1;
}
필요 없을거같지만 혹시나해서 헤더파일과 소스파일을 준비했습니다. OpenGL에서 적용 시키려고합니다. 두 객체의 충돌처리를 하려고하는데.. 함수랑 헤더는 정의되어있는데 어떻게 이걸 객체에 적용 시켜야할지 도저히 감이안잡힙니다..
Box 클래스를 충돌 적용 시키려는 객체안에 멤버 변수로 정의해야하나?
아니면 그냥 함수 호출 방식으로 써야하나? 그렇다면 인자로 받는 Box 는 어떻게하지? 객체에 어떻게 적용 시키지? return 값이 충돌 체크여부인데 이걸 어떻게 써먹어야하지?
이런 생각들을 해보았는데요..마땅히 생각이 잘 떠오르질 않습니다.
게다가 객체가 한개가 아니라 전부 다른 객체 7가지 정도 됩니다..어떻게 적용시켜야할지 감이 잘 안오는데 도움좀 주시면 감사하겠습니다.
댓글 입력