2012年4月29日日曜日

dcollide Kdopのテスト

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;
}