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가지 정도 됩니다..어떻게 적용시켜야할지 감이 잘 안오는데 도움좀 주시면 감사하겠습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)