サンプル

コリジョン

コリジョン - MascotCapsule eruption

ここではコリジョンについて解説します。





※ 開発環境によってダウンロードするサンプルデータが異なります。

目次



MascotCapsule eruption では、球体に対して、レイ、三角形、球体の 3 種類の衝突判定を行うことができます。


1. コリジョンの設定

まず mceGeometricShape_create( type, center, size, radius, ex ) を使用して、mceGeometricShape を生成します。引数 type では幾何形状を 4 種類指定することが可能です。球体以外の形状は、現状では衝突判定には利用できず、将来的なリザーブ扱いとなっています。 指定できる幾何形状は以下の 4 種類が用意されています。

typedef struct tagWork
{
    (中略)

    mceGeometricShape *Geoshape0;    /* GeometricShape0 */
    mceGeometricShape *Geoshape1;    /* GeometricShape1 */

    (中略)
} WORK;
hi_exception exception;

mceVector3D center_vector;

    (中略)

/* 球形状のmceGeometricShapeを作成 */
mceVector3D_set   (&center_vector,
                  MCE_F2C (0.0f), MCE_F2C (0.0f), MCE_F2C (0.0f));
work->Geoshape0 = mceGeometricShape_create(
                  mceGeometricShape_Type_Sphere,
                  &center_vector, NULL, MCE_F2C (5.0f), &exception);
if ((work->Geoshape0 == NULL) || (exception != hi_NoException))
{
    return 1;
}

mceVector3D_set   (&center_vector,
                  MCE_F2C (0.0f), MCE_F2C (0.0f), MCE_F2C (0.0f));
work->Geoshape1 = mceGeometricShape_create(
                  mceGeometricShape_Type_Sphere,
                  &center_vector, NULL, MCE_F2C (5.0f), &exception);
if ((work->Geoshape1 == NULL) || (exception != hi_NoException))
{
    return 1;
}


2. コリジョンの判定

衝突判定は球体にのみ行うことができ、以下の 6 種類が用意されています。

衝突判定の結果は、mceCollision3D クラスの関数の戻り値として取得します。使用する関数は衝突判定を行うオブジェクトの組み合わせによって変化します。
サンプルプログラムでは mceGeometricShape 同士の衝突判定を行っているため、mceCollision3D_isHitGeometricShapeToGeometricShape( bs0, bs1, trans0, trans1, isInvolved, exception ) を使用しています。

#define ANGLE        (360)        /* 角度 */

    (中略)

typedef struct tagWork
{
    (中略)

    hi_coord ObjTx;               /* オブジェクトワールドX軸 */
    hi_coord ObjTy;               /* オブジェクトワールドY軸 */
    hi_coord ObjTz;               /* オブジェクトワールドZ軸 */

    hi_coord ObjRy0;              /* オブジェクト0Y軸回転 */
    hi_coord ObjRy1;              /* オブジェクト1Y軸回転 */

} WORK;
hi_exception exception;

mceTransform matrix;
mceTransform matrix2;
mceVector3D  rotate;

mceTransform obj0_matrix;
mceTransform obj1_matrix;

hi_bool collision_flag, in_flag;

    (中略)

/*------ コリジョン設定 ------*/

mceTransform_setTranslate (&obj0_matrix,
                           work->ObjTx, work->ObjTy, work->ObjTz);

mceVector3D_set           (&rotate,
                           MCE_F2C (1.0f), MCE_F2C (0.0f), MCE_F2C (0.0f));
mceTransform_setRotate    (&matrix2, &rotate, work->ObjRy0 / ANGLE);
mceTransform_multiply     (&obj0_matrix, &matrix2);

mceTransform_setTranslate (&obj1_matrix,
                           MCE_F2C (0.0f), MCE_F2C (0.0f), MCE_F2C (0.0f));

mceVector3D_set           (&rotate,
                           MCE_F2C (0.0f), MCE_F2C (1.0f), MCE_F2C (0.0f));
mceTransform_setRotate    (&matrix2, &rotate, work->ObjRy1 / ANGLE);
mceTransform_multiply     (&obj1_matrix, &matrix2);

collision_flag = mceCollision3D_isHitGeometricShapeToGeometricShape (
                                          work->Geoshape0, work->Geoshape1,
                                          &obj0_matrix, &obj1_matrix,
                                          &in_flag, &exception);
if (exception != hi_NoException)
{
    return 1;
}

サンプルプログラムでは、描画するモデルと同じ大きさの mceGeometricShape を作成し、モデルと同一の位置に配置して、描画するモデルの衝突判定を行っています。

描画結果 衝突していないとき 描画結果 衝突しているとき
衝突していないとき 衝突しているとき
描画結果



このページの先頭へ戻る