# PQP
**Repository Path**: zen_shawn/PQP
## Basic Information
- **Project Name**: PQP
- **Description**: Mirror to https://github.com/GammaUNC/PQP
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2020-08-17
- **Last Updated**: 2022-06-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# PQP
###### [http://gamma.cs.unc.edu/SSV/](http://gamma.cs.unc.edu/SSV/)
###### Authored by Eric Larsen and Stefan Gottschalk
###### UNC - Chapel Hill Computer Science
###### geom (at) cs (dot) unc (dot) edu
|Version|Changes|
|-------|:------|
|1.3 | now use isnan() to test for NaN, instead of a comparison that was sometimes optimized away.
|1.2 | Altered the triangle distance routine due to a degeneracy problem when edges of two triangles nearly intersect.
|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.0 | First release of library
## 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:
- [Fast Proximity Queries with Swept Sphere Volumes](http://gamma.cs.unc.edu/SSV/ssv.pdf)
Eric Larsen, Stefan Gottschalk, Ming C. Lin, Dinesh Manocha
Technical report TR99-018, Department of Computer Science
UNC Chapel Hill
- [OBB-Tree: A Hierarchical Structure for Rapid Interference Detection](http://gamma.cs.unc.edu/SSV/obb.pdf)
Stefan Gottschalk, Ming C. Lin and Dinesh Manocha
Technical report TR96-013, Department of Computer Science, University of North Carolina, Chapel Hill.
Proc. of ACM Siggraph'96.
## 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/ " " " "
```
## 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.
## 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.
## 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.