K-DOP (K discrete oriented polytope)
main.cpp |
#define _USE_MATH_DEFINES
#include <d-collide/dcollide.h>
#include <d-collide/proxyfactory.h>
#include <d-collide/math/vector.h>
#include <d-collide/shapes/mesh/meshfactory.h>
int main()
{
// ワールド
dcollide::World world;
// プロキシファクトリを取得
dcollide::ProxyFactory* pPf = world.getProxyFactory();
// プロキシを作成
dcollide::Proxy* pProxy = pPf->createProxy();
// メッシュの頂点
dcollide::Vertex vtx_array[] = {
dcollide::Vertex(0, 10.18f, 0),
dcollide::Vertex(-10, 0, -10),
dcollide::Vertex( 10, 0, -10),
dcollide::Vertex(-10, 0, 10),
dcollide::Vertex( 10, 0, 10),
};
std::vector vertices;
vertices.push_back( &vtx_array[0] );
vertices.push_back( &vtx_array[1] );
vertices.push_back( &vtx_array[2] );
vertices.push_back( &vtx_array[3] );
vertices.push_back( &vtx_array[4] );
// メッシュのインデックス
std::vector indices;
indices.push_back(1); indices.push_back(2); indices.push_back(0);
indices.push_back(3); indices.push_back(4); indices.push_back(0);
// メッシュ
dcollide::Mesh mesh(vertices, indices);
mesh.setProxy( pProxy );
// メッシュファクトリ
dcollide::MeshFactory mf;
// メッシュファクトリから球のメッシュを作成
dcollide::Mesh* pSphereMesh = mf.createSphere(4.56f, 5.0f);
pSphereMesh->setProxy( pProxy );
// kdopのk
int k = 6; // 6:AABB 14, 18, 26
// kdop
dcollide::Kdop kdop(k);
kdop.adjustToShape(&mesh); // プロキシが無いとerror
// kdop.adjustToShape(pSphereMesh);
// AABB
dcollide::Vector3 vMin = kdop.getSurroundingAabbMin();
dcollide::Vector3 vMax = kdop.getSurroundingAabbMax();
printf("k = %d\n", k);
for(int i = 0; i < k; ++i)
{
// 原点から平面までの距離
dcollide::real dist = kdop.getDistanceOfPlaneToOrigin(i);
// 平面の法線ベクトル
dcollide::Vector3 vN = kdop.getPlaneNormal(i);
printf("%d [%f %f %f %f]\n", i, vN.getX(), vN.getY(), vN.getZ(), dist);
}
return 0;
}
|