So-net無料ブログ作成
検索選択

自由切断を実装してみた [C++]

メタルギア ライジング リベンジェンスの自由切断がかっこよすぎるので、
自分でもなんちゃって実装してみました。

テクスチャを張ったキューブを自由切断したところ
slice_cube.png

ちょっと複雑な形の物体を自由切断したところ
slice_popper.png

断面に張るポリゴンも生成します。ただし断面のテクスチャは考慮していません(座標0,0になっています)。
また、穴が開いた断面には対応していません(外枠か、中の穴かどちらかに張るだけ)。


Vertex を用意
const GLfloat data[][8] =
{
   	{ -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f, 0.0f, 0.0f},
   	{  0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f, 1.0f, 0.0f},
   	{  0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f, 1.0f, 1.0f},
	...
};


平面を作成

MODELVEC3D p = MODELVEC3DMake(0.0f, 1.0f, 0.0f); // any point on the plane
MODELVEC3D n = MODELVEC3DMake(1.0f, 0.0f, 0.0f); // normal vector
MODELPLANE plane = MODELPLANEMake(p,n); // make a plane


結果を受け取るバッファを用意
GLfloat bufN[MAX_CHOP_BUF][8] = {0.0f}; // vertices located in normal vector sides
GLfloat bufA[MAX_CHOP_BUF][8] = {0.0f}; // vertices located in anti-normal vector sides
int bufNCount = 0;
int bufACount = 0;


自由切断実行
Chop(plane, &(data[0][0]), sizeof(data)/8/sizeof(GLfloat), bufN, bufA, bufNCount, bufACount);


処理内容は、ひたすら面と一つ一つのポリゴン(とどのつまり直線)の計算をしているだけです。

コードはGitHub においてあります。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。