Scalable Graphics/Geometric Algorithm Lab. (SGLAB)
Korea Advanced Institute of Science and Technology (KAIST)

OpenCCD: Continuous Collision Detection API

Contents of the Distribution

The archive contains all the libraries (except for opengl and glut) and includefiles needed to build applications using OpenCCD.
The following is a description of what each folder contains:

  1. Src: source code for the OpenCCD library
  2. Doc: documentation for the OpenCCD library
  3. Demo1: One example demonstrating usage of the OpenCCD library
  4. include: Header files that should be included to an application

Basic APIs are explained in below. Please see the full CCD_API Documentation for details. [ Click Here ]

OpenCCD

* Create an object

obj1.beginObject( # of frames , # of vertexes , # of triangles , object type ) ;

        // set vertexes' info. of each frame
        obj.setVtx(00, Vec3f( 000 ) ) ;

        ¡¦

        // set trianlges' info. of each frame
        obj.setTri( 0012 ) ;

obj.endObject() ;
 

* Set and perform CCD

CCD ccd ;
CCD_Output output ;
CCD_Object obj1, obj2 ;

ccd.setOutput( &output ) ;

...

// Set Info. of objects

... 

obj1.setID ( ccd.addObject( &obj1 ) );
obj2.setID ( ccd.addObject( &obj2 ) );

ccd.readyCCD( 0100 ) ;

while ( ) {
        ccd.performCCD() ;
        // move to next frame or update model Info.
}

output.printSummary() ;

(Code example 1)

CCD ccd ;
CCD_Output output ;
CCD_Object obj1, obj2 ;

// Assign output instance to CCD
ccd.setOutput( &output ) ;

// set object 1
obj1.beginObject(231, CCD_OBJECT_TYPE_STATIC ) ;

  // frame 1
  obj1.setVtx(00, Vec3f( 000 ) ) ;
  obj1.setVtx(01, Vec3f( 001 ) ) ;
  obj1.setVtx(02, Vec3f( 011 ) ) ;

  // frame 2
  obj1.setVtx(10, Vec3f( 00, -1 ) ) ;
  obj1.setVtx(11, Vec3f( 000  ) ) ;
  obj1.setVtx(12, Vec3f( 010  ) ) ;

  obj1.setTri( 0012 ) ;

obj1.endObject() ;

// set object 2
obj2.beginObject(231, CCD_OBJECT_TYPE_STATIC ) ;

  // frame 1
  obj2.setVtx(00, Vec3f( -100, -0.5 ) ) ;
  obj2.setVtx(01, Vec3f( 010, -0.5 ) ) ;
  obj2.setVtx(02, Vec3f( 100, -0.5 ) ) ;

  // frame 2
  obj2.setVtx(10, Vec3f( -100, -0.5 ) ) ;
  obj2.setVtx(11, Vec3f( 010, -0.5 ) ) ;
  obj2.setVtx(12, Vec3f( 100, -0.5 ) ) ;

  obj2.setTri( 0012 ) ;

obj2.endObject() ;

 

// Add objects to CCD
obj1.setID ( ccd.addObject( &obj1 ) );
obj2.setID ( ccd.addObject( &obj2 ) );

// Ready to perform CCD
ccd.readyCCD( 020 ) ;

// Perform CCD
for ( int i = 0 ; i < 3 ; i++ ) {
  ccd.performCCD() ;
  ccd.nextFrame() ;
}

// Print results
output.printSummary() ;

(Code example 2)

CCD ccd ;
CCD_Output output ;
CCD_Object obj1, obj2 ;

// Assign output instance to CCD
ccd.setOutput( &output ) ;

// set object 1
obj1.beginObject(131, CCD_OBJECT_TYPE_STATIC ) ;

  obj1.setVtx(00, Vec3f( 000 ) ) ;
  obj1.setVtx(01, Vec3f( 001 ) ) ;
  obj1.setVtx(02, Vec3f( 011 ) ) ;

  obj1.setTri( 0012 ) ;

obj1.endObject() ;

// set object 2
obj2.beginObject(131, CCD_OBJECT_TYPE_STATIC ) ;

  obj2.setVtx(00, Vec3f( -100, -0.5 ) ) ;
  obj2.setVtx(01, Vec3f( 010, -0.5 ) ) ;
  obj2.setVtx(02, Vec3f( 100, -0.5 ) ) ;

  obj2.setTri( 0012 ) ;

obj2.endObject() ;

// Add objects to CCD
obj1.setID ( ccd.addObject( &obj1 ) );
obj2.setID ( ccd.addObject( &obj2 ) );

// Ready to perform CCD
ccd.readyCCD( 010 ) ;

// Apply model changes
obj1.swapVtxs_Cur_Prev() ;
  obj1.setCurVtx(0, Vec3f( 00, -1 ) ) ;
  obj1.setCurVtx(1, Vec3f( 000  ) ) ;
  obj1.setCurVtx(2, Vec3f( 010  ) ) ;

obj2.swapVtxs_Cur_Prev() ;
  obj2.setCurVtx(0, Vec3f( -100, -0.5 ) ) ;
  obj2.setCurVtx(1, Vec3f( 010, -0.5 ) ) ;
  obj2.setCurVtx(2, Vec3f( 100, -0.5 ) ) ;

// perform CCD
ccd.performCCD() ;

// Print results
output.printSummary() ;