Skip to content

motion-planning/pqp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Copyright 1999 University of North Carolina at Chapel Hill.
  All rights reserved.

  Permission to use, copy, modify, and distribute this software and its
  documentation for educational, research, and non-profit purposes, without fee,
  and without a written agreement is hereby granted, provided that the above
  copyright notice and the following three paragraphs appear in all copies.

  IN NO EVENT SHALL THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL BE LIABLE TO
  ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
  INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
  DOCUMENTATION, EVEN IF THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL HAS
  BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

  THE UNIVERSITY OF NORTH CAROLINA AT CHAPEL HILL SPECIFICALLY DISCLAIMS ANY
  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED
  HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF NORTH CAROLINA AT
  CHAPEL HILL HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
  ENHANCEMENTS, OR MODIFICATIONS.

  The authors may be contacted via:  

  US Mail:             Eric Larsen, Stefan Gottschalk
                       Department of Computer Science
                       Sitterson Hall, CB #3175
                       University of North Carolina
                       Chapel Hill, NC 27599-3175  

  Phone:               (919) 962-1749 

  Email:               geom@cs.unc.edu
  
  ---------------------------------------------------------------------------


                             PQP v. 1.3

                    Eric Larsen, Stefan Gottschalk
                   UNC - Chapel Hill Computer Science
                           geom@cs.unc.edu

---------------------------------------------------------------------------
Changes:

1.0   - first release of library 
1.1   - fixed a bug in calculating query times on Win32 machines.
        added a demo 'falling' which can demonstrate all of the proximity 
        query types. 
1.2   - altered the triangle distance routine due to a degeneracy problem 
        when edges of two triangles nearly intersect.
1.3   - now use isnan() to test for NaN, instead of a comparison that was
	sometimes optimized away.
---------------------------------------------------------------------------


I. Introduction

 PQP, which stands for Proximity Query Package, is a library for three
 types of proximity queries performed on geometric models composed of
 triangles:

   * collision detection - detect whether two models overlap, and
                           optionally, which triangles of the models
                           overlap.

   * distance computation - compute the distance between two models, 
                            i. e., the length of the shortest translation
                            that makes the models overlap

   * tolerance verification - detect whether two models are closer or
                              farther than a tolerance value.

 By default, the library uses "RSS" bounding volumes for distance and
 tolerance queries, and OBBs for collision detection (see PQP_Compile.h).
 Descriptions of the bounding volumes and algorithms used in this package 
 are contained in:

   Eric Larsen, Stefan Gottschalk, Ming Lin, Dinesh Manocha,
   "Fast Proximity Queries with Swept Sphere Volumes", 
   Technical report TR99-018, Department of Computer Science, 
   UNC Chapel Hill 

   S. Gottschalk, M. C. Lin and D. Manocha,
   "OBB-Tree: A Hierarchical Structure for Rapid Interference Detection",
   Technical report TR96-013, Department of Computer Science, University
   of N. Carolina, Chapel Hill.
   Proc. of ACM Siggraph'96.

II. Layout of Files

 PQP_v1.3/
   Makefile           Unix makefile to build PQP library
   PQP.dsw PQP.dsp    MS VC++ 5.0 workspace and project files for PQP

   src/
     PQP source

   lib/             
     libPQP.a         after Unix compilation
     PQP.lib          after Win32 compilation

   include/
     PQP.h            include this file to use PQP classes and functions.
     PQP_Internal.h   
     PQP_Compile.h    *WARNING* you should only modify PQP_Compile.h in
     Tri.h            the src directory, not here, because these files
     BV.h             are copied here from src when you perform a build
                     
   demos/
     Makefile         Unix makefile for both demos
     demos.dsw        MS VC++ 5.0 workspace for demos
 
     falling/         source and project files
     sample/          "      "   "       "
     spinning/        "      "   "       "

III. Building the PQP Library

 In the top level directory, there is a Unix Makefile for building the PQP
 library.  Type 'make' to create a 'libPQP.a' in the lib directory.
 The compiler is currently set to g++ with -O2 level optimization. 

 In Visual C++ 5.0 or higher, open PQP.dsw to build the library.

 Building on either platform has a side effect of copying the include
 files needed for a client application to the include/ directory.  

IV. Building the Demos

 In the demos directory is a Unix Makefile.  Typing 'make' will perform a
 'make' in the 'sample' and 'spinning' directories.  For VC++5.0
 users, the demos directory contains a demos.dsw file which contains
 projects for both demos.

   sample

   This demo is adapted from the sample client included with RAPID.  Two 
   tori are created, and proximity queries are performed on them at  
   several configurations

   spinning

   The spinning demo is a GLUT application, so paths to the GLUT & OpenGL
   libraries and includes must be set in spinning/Makefile, or in the 
   VC++ project settings. When run, a bunny and a torus should appear in
   the GLUT window, with a line drawn between their closest points.
   Pressing a key alternately starts and stops them spinning.

   falling

   This demo is also a GLUT application, showing a bent torus
   falling through the center of a knobby torus.  Each of the three 
   proximity query types can be demonstrated.

V. Creating a PQP Client Application

 "PQP.h" contains the most complete information on constructing client
 applications.  Here is a summary of the steps involved.

 1. Include the PQP API header.
 
    #include "PQP.h"

 2. Create two instances of PQP_Model.

    PQP_Model m1, m2;

 3. Specify the triangles of each PQP_Model.

    Note that PQP uses the PQP_REAL type for all its floating point 
    values. This can be set in "PQP_Compile.h", and is "double" by 
    default

    // begin m1

    m1.BeginModel();

    // create some triangles

    PQP_REAL p1[3], p2[3], p3[3];  
    PQP_REAL q1[3], q2[3], q3[3];
    PQP_REAL r1[3], r2[3], r3[3];

    // initialize the points
     .
     . 
     .  

    // add triangles that will belong to m1
 
    m1.AddTri(p1, p2, p3, 0);
    m1.AddTri(q1, q2, q3, 1);
    m1.AddTri(r1, r2, r3, 2);
 
    // end m1, which builds the model

    m1.EndModel();

 4. Specify the orientation and position of each model.

    The position of a model is specified as a 3 vector giving the
    position of its frame in the world, stored in a PQP_REAL [3]. 

    The rotation for a model is specified as a 3x3 matrix, whose columns
    are the model frame's basis vectors, stored in row major order in
    a PQP_REAL [3][3];

    Note that an OpenGL 4x4 matrix has column major storage.

 5. Perform any of the three proximity queries.

    // collision

    PQP_CollideResult cres;
    PQP_Collide(&cres,R1,T1,&m1,R2,T2,&m2);

    // distance

    PQP_DistanceResult dres;
    double rel_err = 0.0, abs_err = 0.0;
    PQP_Distance(&dres,R1,T1,&m1,R2,T2,&m2,rel_err,abs_err);

    // tolerance
 
    PQP_ToleranceResult tres;
    double tolerance = 1.0;
    PQP_Tolerance(&tres,R1,T1,&m1,R2,T2,&m2,tolerance);

    See "PQP.h" for complete information.

 6. Access the result structure passed in the query call.

    int colliding = cres.Colliding();
    double distance = dres.Distance();
    int closer = tres.CloserThanTolerance();

    See "PQP.h" for the complete interface to each result structure.