From 7bceea80d4a04649f495f4f4331d7e3bdcdb05ca Mon Sep 17 00:00:00 2001 From: Marijn Tamis Date: Wed, 12 Sep 2018 14:12:47 +0200 Subject: 1.1.5 Release (24934621) --- NvCloth/docs/documentation/.buildinfo | 4 - .../documentation/CollisionDetection/Index.html | 261 + .../CollisionDetection/InterCollision.html | 288 ++ .../CollisionDetection/SelfCollision.html | 316 ++ .../CollisionDetection/SphereCapsuleCollision.html | 562 +++ NvCloth/docs/documentation/Compiling/index.html | 63 +- NvCloth/docs/documentation/Cooking/Index.html | 251 + .../documentation/Cooking/TripletScheduler.html | 278 ++ NvCloth/docs/documentation/CopyRight/Index.html | 64 +- NvCloth/docs/documentation/Modules/Index.html | 60 +- NvCloth/docs/documentation/ReleaseNotes/index.html | 118 +- NvCloth/docs/documentation/Solver/Index.html | 593 +++ NvCloth/docs/documentation/UserGuide/Index.html | 58 +- .../docs/documentation/_images/AdjacencyTables.svg | 5130 ++++++++++++++++++++ .../_images/CapsuleCircleIntersectionDiagram.svg | 435 ++ .../_images/CapsulePointCollisionDetection.svg | 467 ++ .../_images/CapsulePointCollisionDetection2.svg | 368 ++ .../_images/CapsulePointCollisionResponse.svg | 334 ++ .../documentation/_images/CapsuleRadiusDiagram.svg | 453 ++ .../documentation/_images/SelfCollisionGrid.svg | 259 + .../_images/SelfCollisionHashAxisKernel.svg | 282 ++ NvCloth/docs/documentation/_images/Simd.svg | 2230 +++++++++ .../documentation/_images/SphereAcceleration.svg | 2487 ++++++++++ NvCloth/docs/documentation/_images/SphereCCD.svg | 482 ++ NvCloth/docs/documentation/genindex.html | 81 +- NvCloth/docs/documentation/index.html | 84 +- NvCloth/docs/documentation/search.html | 81 +- NvCloth/docs/documentation/searchindex.js | 2 +- 28 files changed, 15847 insertions(+), 244 deletions(-) delete mode 100644 NvCloth/docs/documentation/.buildinfo create mode 100644 NvCloth/docs/documentation/CollisionDetection/Index.html create mode 100644 NvCloth/docs/documentation/CollisionDetection/InterCollision.html create mode 100644 NvCloth/docs/documentation/CollisionDetection/SelfCollision.html create mode 100644 NvCloth/docs/documentation/CollisionDetection/SphereCapsuleCollision.html create mode 100644 NvCloth/docs/documentation/Cooking/Index.html create mode 100644 NvCloth/docs/documentation/Cooking/TripletScheduler.html create mode 100644 NvCloth/docs/documentation/Solver/Index.html create mode 100644 NvCloth/docs/documentation/_images/AdjacencyTables.svg create mode 100644 NvCloth/docs/documentation/_images/CapsuleCircleIntersectionDiagram.svg create mode 100644 NvCloth/docs/documentation/_images/CapsulePointCollisionDetection.svg create mode 100644 NvCloth/docs/documentation/_images/CapsulePointCollisionDetection2.svg create mode 100644 NvCloth/docs/documentation/_images/CapsulePointCollisionResponse.svg create mode 100644 NvCloth/docs/documentation/_images/CapsuleRadiusDiagram.svg create mode 100644 NvCloth/docs/documentation/_images/SelfCollisionGrid.svg create mode 100644 NvCloth/docs/documentation/_images/SelfCollisionHashAxisKernel.svg create mode 100644 NvCloth/docs/documentation/_images/Simd.svg create mode 100644 NvCloth/docs/documentation/_images/SphereAcceleration.svg create mode 100644 NvCloth/docs/documentation/_images/SphereCCD.svg (limited to 'NvCloth/docs') diff --git a/NvCloth/docs/documentation/.buildinfo b/NvCloth/docs/documentation/.buildinfo deleted file mode 100644 index 86ed4fc..0000000 --- a/NvCloth/docs/documentation/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 21969e2cf75a2beb3740518da9aaaf11 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/NvCloth/docs/documentation/CollisionDetection/Index.html b/NvCloth/docs/documentation/CollisionDetection/Index.html new file mode 100644 index 0000000..61ba480 --- /dev/null +++ b/NvCloth/docs/documentation/CollisionDetection/Index.html @@ -0,0 +1,261 @@ + + + + + + + + + Internal collision detection documentation — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+

Internal collision detection documentation

+

This document describes the internal workings of the collision detection code.

+
+

Overview of the different modules

+

Contents:

+ +
+
+

Todo

+
    +
  • Plane/Convex collision detection
  • +
  • Triangle collision detection
  • +
  • Inter collision detection
  • +
+
+
+ + +
+
+
+
+
+
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/CollisionDetection/InterCollision.html b/NvCloth/docs/documentation/CollisionDetection/InterCollision.html new file mode 100644 index 0000000..4db71f8 --- /dev/null +++ b/NvCloth/docs/documentation/CollisionDetection/InterCollision.html @@ -0,0 +1,288 @@ + + + + + + + + + Inter Collision — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+

Inter Collision

+
+

Overview

+

Inter collision tries to keep multiple cloth objects from intersecting, but does not keep any cloth from self intersecting. +It does this by keeping the particles from every cloth a minimum distance away from the particles of every other cloth. +This distance can be set using Cloth::setInterCollisionDistance().

+
+
+

Broad phase collision detection

+
+
+

Acceleration structure

+

The acceleration structures used for Inter Collision are very similar to those used in Self Collision. +The only addition is the broad phase which is used to cull cloth pairs based their bounding boxes, and cull particles from the narrow phase based on the overlapping volumes.

+
+

Broad phase collision detection

+

calculatePotentialColliders() takes care of the broad phase. +It first calculates the individual bounding boxes of each cloth in world space. +The sweep axis is determined using the bounding box enclosing all cloths. +The worldspace bounding boxes are sorted by the lower boundary on the sweep axis. +Sorting this way gives the following properties:

+
true = clothBounds[sortedIndices[i]].mLower <= clothBounds[sortedIndices[i+1]].mLower
+
+if(clothBounds[sortedIndices[a]].mUpper < clothBounds[sortedIndices[b]].mLower)
+{
+       true = clothBounds[sortedIndices[a]].mUpper < clothBounds[sortedIndices[b+1]].mLower
+       // b and all sorted cloths after b do not intersect a
+}
+
+

Now the clothes are tested against the bounds of every other cloth.

+

For cloth A, all overlapping bounds of the other cloths are stored in temporary memory (in overlapBounds) in the local space of cloth A. +All the particles of cloth A that overlap with any of those bounds are marked for narrow phase collision (and transformed to world space). +Marking a particle for narrow phase collision is done by storing it in the mClothIndices and mParticleIndices arrays. +Now the narrow phase only has to deal with the particles in those lists.

+
+
+

Differences with self collision

+

Some of the obvious differences:

+
+
    +
  • Instead of iterating over all particles only particles from the mClothIndices and mParticleIndices arrays are used.
  • +
  • The particle cannot be directly accessed, the getParticle() function is used instead.
  • +
  • Intercollision has no equivalent to self collision indices.
  • +
  • The particles need to be transformed back into local space after collision response.
  • +
+
+
+
+
+ + +
+
+
+
+
+
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/CollisionDetection/SelfCollision.html b/NvCloth/docs/documentation/CollisionDetection/SelfCollision.html new file mode 100644 index 0000000..05f5d1b --- /dev/null +++ b/NvCloth/docs/documentation/CollisionDetection/SelfCollision.html @@ -0,0 +1,316 @@ + + + + + + + + + Self Collision — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+

Self Collision

+
+

Overview

+

Self collision tries to keep the cloth from self intersecting. +It does this by keeping the particles a minimum distance away from each other. +This distance can be set using Cloth::setSelfCollisionDistance().

+
+
+

Acceleration structure

+

Testing every particle against all other particle is too slow. +Instead an acceleration structure is used to only test nearby particles.

+

The acceleration structure is a combination of a regular grid and a sweep. +The longest axes of the AABB around all particles is used for the sweep. +The other two axes are divided in a regular grid of 253x253. +For each particle we test against the current and neighboring cells of the grid in which we sweep along the remaining axis. +The whole process will be described in more detail below.

+
+

Grid setup

+

The AABB is obtained from ClothData (calculated by SwCollision<T4f>::computeBounds()). +The edge lengths are calculated by subtracting the lower bounds from the upper bounds. +The sweep axis index (0 to 2 for x to z so we can use the array operators) is picked by the largest edge length. +The two hash axes are the remaining axes in arbitrary order.

+

The cell size for the hash axes is picked so that it is not smaller than the collision distance set by the user, and large enough that 253 cells cover the whole edge length. +The sweep axis is divided in 65533 cells. +The first and last cells of each axis are reserved as a sentinel. +The amount of sweep cells that need to be checked to cover the collision distance is given by:

+
numSweepCells = 2 + gridScale * collisionDistance
+
+
+

We calculate the grid scale and grid bias to quickly convert particle coordinates to cell coordinates using \(coordinate \cdot gridScale + gridBias\). +The gridScale is \((cellCount + 1)^{-1}\) and the gridBias is \(-lowerBound \cdot gridScale + 1 \), where \(lowerBound\) is taken from the AABB.

+
+
+

Particle sorting

+

Particles are sorted based on a key which is constructed from the cell coordinates. +The 16 least significant bits are used to store the sweep axis cell coordinate. +The two other bytes are used to store the hash axis cell coordinates (this is the reason for the specific cell count per axis in the grid).

+

A radix sort with a radix (bin) size of 256 is used, requiring 4 bins to sort the 32-bit keys.

+
+
+

Key range sweep

+

Individual particles can be processed now that the acceleration structure is setup. +Only 5 cells are processed for each particle, as we don’t want to detect duplicate pairs.

+

Particles can be quickly identified in the acceleration structure by looping though the sorted keys. +Cells cannot be directly accessed as they are variable in size (depending on how many particles a cell contains) and stored in a continuous buffer.

+

The range of keys that need to be tested against the current particles can be calculated using key offsets. +Key offsets are relative key coordinates for the cells marked in yellow in the above diagram.

+

The first and last keys in the starting cell is calculated using:

+
firstKey = currentParticleKey - min(numSweepCells, currentParticleKey & bucketMask)
+lastKey =  min(currentParticleKey + numSweepCells, currentParticleKey | bucketMask)
+
+
+

The key offsets can be added to these values to obtain the range for the other cells. +Note that numSweepCells is not subtracted for firstKey to ensure no duplicate collisions are detected. +Note that bit operations can be used as the different axes are contained in their own bytes within the key.

+

Collision detection/response can begin once the first/last keys are known.

+

Note that the first/last keys from the previous processed particle are reused for optimizations that can be done because the keys are sorted.

+
+
+

Collision detection and response

+

Near phase collision detection can start once two possibly colliding keys are identified. +The pointers to the keys are converted to the particles and the rest particles.

+

A basic distance check between the particles and the user specified collision distance is done, culling non-colliding particles.

+

When available the distance is also checked against the rest distance to cull particles that are supposed to be close in the mesh. +This makes it possible to set the collision distance larger than the shortest constraint in the fabric without providing manual collision indices.

+

Next a position delta is calculated if the particle collision is not culled:

+
diff = p1-p0
+ratio = collisionDistance / |diff|
+scale = stiffness / (epsilon + w0 + w1)
+delta = scale * (diff - diff * ratio
+p0 += delta * w0
+p1 -= delta * w1
+
+

TODO: format nicer

+
+
+
+ + +
+
+
+
+
+
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/CollisionDetection/SphereCapsuleCollision.html b/NvCloth/docs/documentation/CollisionDetection/SphereCapsuleCollision.html new file mode 100644 index 0000000..cc1598c --- /dev/null +++ b/NvCloth/docs/documentation/CollisionDetection/SphereCapsuleCollision.html @@ -0,0 +1,562 @@ + + + + + + + + + Sphere Capsule collision detection — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+

Sphere Capsule collision detection

+

Sphere and capsule collision is divided in 3 steps:

+
+
    +
  • Sphere/capsule generation
  • +
  • Acceleration structure generation
  • +
  • Collision detection
  • +
+
+
+

Sphere/ Capsule generation

+

The sphere data set by the user doesn’t need to be converted before it can be used for collision detection. +However, the data will be interpolated between frames when continuous collision detection is enabled.

+

The capsules need more setup work as the representation set by the user is not directly usable for collision detection. +Some values are precomputed (in generateCones()) so they won’t have to be computed unnecessarily in the collision detection routine. +All the computations are explained in the cone collision detection documentation. Refer to the code to see which values are precomputed.

+
+
+

Sphere acceleration structure

+

We use a small sweep and prune (SAP) acceleration structure to avoid testing each particle against every sphere. +We begin by calculating the axis aligned bounding volume containing all particles and collision spheres (SwCollision<T4f>::buildAcceleration()). +That space is then divided into an 8x8x8 grid. +The span of each sphere along the 3 primary axes are stored in bitmasks where each bit is for a different sphere. +So we have 8 bitmasks for each axis. +We store the info twice to ensure that particles don’t skip over marked grid cells (when using continuous collision detection). +The first set contains spans that are extended to the maximum, while the spans in the second set are extended to the minimum (see image below). +So if the sphere was contained in cells 2, 3, and 4 along the x axis, the cells 5, 6, and 7 would also be marked for the first set.

+

Thick bordered bitmask cells indicate that the sphere is inside. +The cells that contain the spheres can be obtained by combining both sets using binary AND. +This is done when continuous collision detection is disabled (SwCollision<T4f>::mergeAcceleration()).

+

We use both bit mask sets when continuous collision detection is enabled to test if the span from the particle movement overlaps the sphere span stored in the bitmasks. +For each axis, we test the highest of the two position values against the bitmask from the first set and the lowest against the second set. +We don’t have to test the cells in between because the bitmasks are extended (e.g. if the particle moves from cell 5 to cell 1 along the x axis both bitmasks will test positive, even though the particle skipped past the sphere. However, if the particle moved from cell 5 to 6 only one of the cells tests positive, culling the collision).

+
+
+

collideParticles()

+

TODO mass scaling +CollideParticles iterates through the cloth particles to handle non-continuous collisions with spheres and capsules. +The capsule cones are handled first so that the corresponding spheres can be ignored, ensuring that no double collisions are registered (in the case where a particle intersects both the cone and sphere of the capsule). +The sphere and cone collision detection is discussed in the sections below. +The results of the collision detection routines are stored in the ImpulseAccumulator which keeps track of the depenetration delta sum, friction velocity sum (multiplied by the frame time) and collision count (to calculate the averages).

+

The average depenetration delta is directly added to the current particle position.

+

The friction impulse (calculated by calculateFrictionImpulse()) is directly applied to the previous particle position so that only the velocity is changed.

+
+
+

Capsule collision detection

+
+

Cone collision detection

+

Capsule collision detection is split in two parts: Sphere and cone collision detection. +Here we describe the cone collision detection. Spheres are described in the next subsection.

+

The cone needs to be constructed in a way that it correctly fills the space between two spheres with centers \(c_i\) and radii \(r_i\), where \(i \in \left\{ 1,2 \right\} \). +The capsule is a continuous surface, so the cone needs to intersect both spheres at a tangent. +The problem can be solved in 2d by projecting it onto a plane that contains both sphere centers. +We use an approach similar as described here.

+

Two circles are constructed: circle m (green) with center on midpoint \(m = \frac{1}{2}\left(c_1+c_2\right)\) and radius \(r_m=\frac{1}{2}|c_2-c_1|\) +and circle 3 (black) with center \(c_1\) and radius \(r_3=r_1-r_2\). +The intersection between circle 3 and m gives us the tangent point \(t_1\) (see here for more details on circle intersections). +The tangent line intersects points \(c_2\) and \(t_1\).

+

\(t_2\) is obtained by offsetting \(t_1\) by \(\frac{t_1-c_1}{r_3}r_2\), and similar with \(c_2\) to obtain \(t_3\).

+

The cone length can be derived from the diagram: +$$ +V_l = \left|t_3-t_2\right| = \left|t_1-c_2\right| = \sqrt{\left|c_1-c_2\right|^2-\left(r_1-r_2\right)^2} +$$ +The axis length of the cone is +$$ +A_l = \left|c_2 - c_1\right| +$$ +The axis of the cone is +$$ +A = \frac{\left(c_2 - c_1\right)}{A_l} +$$

+

The radius of the cone above point \(m\) (in blue) is +$$ +V_r = \left(\frac{1}{2}\left(r_2 - r_1\right) + r_1\right) \frac{A_l}{V_l} = \frac{1}{2}\left(r_2 + r_1\right) \frac{A_l}{V_l} +$$ +as the triangles made from the red-blue line pairs are similar. +The slope of the cone (the rate of change of the radius) is +$$ +V_s = \frac{r_2 - r_1}{V_l} +$$

+

Detecting if point p lies inside the cone is done in two steps: detecting if it lies within the infinite cone and checking if it is contained within the span of \(t_2\) and \(t_3\).

+

Point P is first projected onto the cone axis \(A\) giving the distance (dotted red in diagram) to \(m\) along \(A\): +$$ +d = \left(p-m\right)\cdot A +$$ +The radius below p (thick blue) is +$$ +r_p = d V_s + V_r +$$ +The distance of \(p\) to \(A\) is given by: +$$ +d_{\bot} = \sqrt{\left|p-m\right|^2 - d^2} +$$ +The point is contained within the infinite cone when \(r_p> d_{\bot}\).

+

The distance \(d_o\) (blue dashed line) between \(p\) and \(m’\) is given by: +$$ +d_o = d + V_s d_{\bot} +$$ +\(d_o\) is less than \(\frac{1}{2}A_l\) if point \(p\) lies inside the finite capped cone: +$$ +\frac{1}{2}A_l < d_o$$

+

Todo: collision response

+

The (un-normalized) collision normal \(n\) is given by: +$$ +n = (p-m) - d_o A +$$

+

The collision response scale is calculated using: +$$ +s = \frac{r_p}{d_{\bot}}cos (\alpha)^2 - cos (\alpha)^2 +$$ +where \(cos(\alpha)^2\) is calculated using: +$$ +cos(\alpha)^2 = 1 - \left(\frac{r_2-r_1}{A_l}\right)^2 = 1 - sin(\alpha)^2 = \left(\frac{\left|t_1-c_2\right|}{\left|c_1-c_2\right|}\right)^2 +$$

+

\(\frac{r_p}{d_{\bot}} \) is 1 when the particle is exactly on the surface of the cone, bigger than 1 when the particle has penetrated the capsule. +\(cos (\alpha)^2\) ???

+

$$ +s = \cos\left(\alpha\right)^2 \left(\frac{r_p}{d_{\bot}}-1\right) +$$

+

Variables in generateCones():

+
center = \(m\)
+axis.xyz = \(\frac{1}{2}(c_2-c_1) = \frac{1}{2}A_l A\)
+cIt->axis = \(A\)
+axis.w = \(-\frac{1}{2}r_3\)
+sqrAxisHalfLength = \((\frac{1}{2}A_l)^2\)
+sqrConeHalfLength = \((\frac{1}{2}V_l)^2\)
+slope = \(\frac{\frac{1}{2}(r_2-r_1)}{\frac{1}{2}V_l} = \frac{(r_2-r_1)}{V_l} = V_s\)
+cIt->radius = \((\frac{1}{2}(r_2-r_1)+r_1)\frac{A_l}{V_l} = V_r \)
+
+

Variables in cloth::SwCollision<T4f>::collideCones():

+
todo
+
+
+
+
+

Sphere collision detection

+

We calculate the following values for the regular particle against sphere collision:

+
delta = particle - sphereCenter
+sqDeltaLegnth = epsilon + dot(delta, delta)
+negativeScale = 1 - sphereRadius/sqrt(sqDeltaLegnth)
+
+
+

NegativeScale will be negative when the particle does not collide with the sphere, at which point we can skip the rest of the work. +We apply a depenetration impulse to the particle when it does collide:

+
particleDelta -= delta * negativeScale
+
+
+
+
+

Sphere CCD

+

Continuous collision detection between cloth and spheres calculate the time of impact between cloth particles and moving spheres. +Both particles and spheres move linearly during a solver iteration, so this problem is the same as a line sphere intersection (making the particle movement relative to the sphere).

+

We start with the following equations: +\begin{align} +x =& p_0 + (p_1-p_0)t\\ +y =& c_0 + (c_1-c_0)t\\ +\left|x-y\right|^2 =& (r_0+(r_1-r_0)t)^2 +\end{align}

+

where \(p_0\) and \(p_1\) are the beginning and end positions of the particle, \(c_0\) and \(c_1\) are the beginning and end positions of the sphere, and \(r_0\) and \(r_1\) are the beginning and end radii of the sphere.

+

We simplify the equations by working relative to the sphere: +\begin{align} +q_0 =& p_0 - c_0\\ +q_1 =& p_1 - c_1\\ +x-y =& q_0 + (q_1-q_0)t\\ +\end{align}

+

Expanding this gives us: +\begin{align} +q_0^2 + 2q_0(q_1-q_0)t + (q_1-q_0)^2t^2 =& r_0^2 + 2r_0(r_1-r_0)t + (r_1-r_0)^2t^2\\ +q_0^2 + (2q_0q_1-2q_0^2)t + (q_1^2-2q_1q_0+q_0^2)t^2 =& r_0^2 + (2r_0r_1-2r_0^2)t + (r_1^2-2r_1r_0+r_0^2)t^2\\ +\end{align} +We rewrite this as a quadratic polynomial: +\begin{align} +q_0^2-r_0^2 + (2q_0q_1-2q_0^2)t-(2r_0r_1-2r_0^2)t + (q_1^2-2q_1q_0+q_0^2)t^2-(r_1^2-2r_1r_0+r_0^2)t^2 =0\\ +q_0^2-r_0^2 + (2q_0q_1-2r_0r_1-2q_0^2+2r_0^2)t + (q_1^2-r_1^2-2q_1q_0+2r_1r_0+q_0^2-r_0^2)t^2 =0\\ +m_{00} + (2m_{01}-2m_{00})t + (m_{11}-2m_{01}+m_{00})t^2 =0\\ +\end{align}

+

Using the following definitions for readability: +\begin{align} +m_{00} =& q_0^2 - r_0^2\\ +m_{11} =& q_1^2 - r_1^2\\ +m_{01} =& q_0q_1 - r_0r_1\\ +\end{align}

+

We can now use the quadratic formula to solve for \(t\): +\begin{align} +a =& m_{11}-2m_{01}+m_{00}\\ +b =& 2m_{01}-2m_{00}\\ +c =& m_{00}\\ +d =& b^2-4ac = 4m_{01}^2-4m_{01}m_{00}+4m_{00}^2 -4m_{00}m_{11}+4m_{00}m_{01}-4m_{00}^2\\ +d =& 4m_{01}^2-4m_{00}m_{11}\\ +t =& \frac{-b+\sqrt{d}}{2a} = \frac{-m_{01}+m_{00} + \sqrt{\left(m^2_{01}-m_{00}m_{11}\right)}}{m_{11}-2m_{01}+m_{00}}\\ +\end{align}

+

The variables used in SwCollision<T4f>::collideSpheres are very similar:

+
dotPrevPrev = \(m_{00}\)
+dotPrevCur = \(m_{01}\)
+dotCurCur = \(m_{11}\) //(epsilon is omitted here)
+discriminant = \(\frac{1}{4}d\)
+sqrtD = \(\frac{1}{2}\sqrt{\left(d\right)}\)
+halfB = -\(\frac{1}{2}b\)
+minusA = \(-a\)
+
+

Continuous collision detection can be skipped if one (relative) sphere is contained in the other (relative) sphere, or \(\left|q_0-q_1\right|^2 < (r_0-r_1)^2\). +We can reuse \(a\) for this check. If \(a > 0\) Continuous collision detection is executed (TODO: check if this makes sense. it looks like discrete collision detection never runs when CCD is enabled. Are all cases really handled when a<0?): +\begin{align} +a >& 0\\ +a =& m_{11} - 2m_{01} + m_{00}\\ +=& q_1^2-r_1^2 - 2q_0q_1 +2r_0r_1 + q_0^2-r_0^2\\ +=& q_0^2+q_1^2- 2q_0q_1 -r_1^2 + 2r_0r_1 -r_0^2\\ +=& (q_1-q_0)^2 - (r_1-r_0)^2 < 0\\ +=& (p_1 - c_1 - p_0 + c_0)^2 - (r_1-r_0)^2\\ +=& ((p_1 - p_0) - (c_1 - c_0))^2 - (r_1-r_0)^2 < 0\\ +\end{align} +TODO: check code if we can skip both if sphere 0 is \(\in\) sphere 1 or sphere 1 is \(\in\) sphere 0 as we only do collision detection with sphere 1 in the end.

+

Collision will happen within the current frame when \( 0 < t < 1\). +The following position correction is applied to stop the particle from penetrating the sphere: +\begin{align} +p’_1 =& c_1 + q_1 + \left(q_0-q_1\right)\left(1 - t\right)\\ +=& p_1 + \left(q_0-q_1\right)\left(1 - t\right) +\end{align} +Note that \(q_1 + \left(q_0-q_1\right)\left(1 - t\right)\) is the toi position relative to the toi sphere center. +This offset is added to the current sphere center \(c_1\), this is correct if the particle sticks to the sphere for the rest of the iteration step duration.

+

The rest of the steps are the same as the non-continuous collision detection (but using the distance from the toi calculation).

+

TODO: check the other collisionMask calculations and comments:

+
// skip continuous collision if the (un-clamped) particle
+// trajectory only touches the outer skin of the cone.
+T4f rMin = prevRadius + halfB * minusA * (curRadius - prevRadius);
+collisionMask = collisionMask & (discriminant > minusA * rMin * rMin * sSkeletonWidth);
+
+

\begin{align} +r_{min} =& r_0 - \frac{1}{2}ba(r_1-r_0)\\ +\frac{1}{4}d >& -a r_{min}^2 s\\ +\frac{1}{4}d >& -a (r_0 - \frac{1}{2}ba(r_1-r_0))^2 s\\ +\frac{1}{4}d >& -asr_0^2 - as\frac{1}{4}b^2a^2(r_1-r_0)^2\\ +\frac{1}{4}d >& -asr_0^2 - as\frac{1}{4}b^2a^2(r_1-r_0)^2\\ +d >& -4asr_0^2 - 4as\frac{1}{4}b^2a^2(r_1-r_0)^2\\ +d >& 4a(-sr_0^2 - s\frac{1}{4}b^2a^2(r_1-r_0)^2)\\ +\frac{d}{4a} >& -sr_0^2 - s\frac{1}{4}b^2a^2(r_1-r_0)^2\\ +\frac{d}{4a} >& -s(r_0^2 + \frac{1}{4}b^2a^2(r_1-r_0)^2)\\ +\end{align}

+

\begin{align} +y =& at^2 + bt + c\\ +t =& -b/(2a)\\ +y_{min} =& c - \frac{b^2}{4a} = -\frac{d}{4a} = \text{vertex}_y\\ +\end{align}

+

\begin{align} +b =& 2m_{01}-2m_{00}\\ +b =& 2q_0q_1 - 2r_0r_1 - 2q_0^2 + 2r_0^2\\ +b =& 2q_0q_1 - 2q_0^2 + 2r_0^2 - 2r_0r_1\\ +b =& 2(p_0-c_0)(p_1-c_1) - 2(p_0-c_0)^2 + 2r_0^2 - 2r_0r_1\\ +b =& 2(p_0p_1-p_0c_1-c_0p_1+c_0c_1) - 2(p_0^2+c_0^2 - 2 p_0c_0) + 2r_0^2 - 2r_0r_1\\ +\end{align}

+

TODO: what is going on:

+
// reduce ccd impulse if (clamped) particle trajectory stays in sphere skin,
+// i.e. scale by exp2(-k) or 1/(1+k) with k = (tmin - toi) / (1 - toi)
+T4f minusK = sqrtD * recip(minusA * oneMinusToi) & (oneMinusToi > gSimd4fEpsilon);
+oneMinusToi = oneMinusToi * recip(gSimd4fOne - minusK);
+
+
+
+

Cone CCD

+

Cone continuous collision detection works in a similar way as the sphere CCD.

+
+
At roughly double the cost of discrete collision, the linearized trajectory of the particle relative to the capsule is tested for intersection. The 6th order polynomial is approximated by a quadratic equation, assuming the capsule length and slope stay constant.
+

– From Engwiki, csigg

+

We use the cross product method instead of dot products to calculate the point line distance: +$$ +\text{distance}_\bot = \left|(p-c) \times a\right| +$$ +where \(c\) is a point on the line, \(a\) is the unit direction of the line (axis) and \(p\) is the point.

+

We start with the following equations: +\begin{align} +x =& \left(p_0-c_0\right) \times A_0 + \left(\left(p_1-c_1\right)\times A_1-\left(p_0-c_0\right)\times A_0\right)t\\ +\left|x\right|^2 =& (r_0+(r_1-r_0)t)^2 +\end{align} +where \(p_0\) and \(p_1\) are the beginning and end positions of the particle, +\(c_0\) and \(c_1\) are the beginning and end positions of the cone center, +\(A_0\) and \(A_1\) are the beginning and end cone axes, +and \(r_0\) and \(r_1\) are the beginning and end radii of the cone +below the particle (like \(r_p\) from the discrete cone section above): +\begin{align} +r = ((p-c) \cdot A) V_s + V_r +\end{align} +where \(V_s\) is the cone slope and \(V_r\) is the radius above the cone mid point.

+

Note that \(x\) is very similar to the \(x-y\) from the sphere ccd section above, only adding the cross products.

+

We simplify the equations using the following definitions: +\begin{align} +q_0 =& \left(p_0 - c_0\right) \times A_0\\ +q_1 =& \left(p_1 - c_1\right) \times A_1\\ +x =& q_0 + (q_1-q_0)t\\ +\end{align}

+

We can now solve for \(t\) in the same way as described in the sphere ccd section above. +The checks determining if collision occurred, and the skipping conditions are also the same as with sphere ccd.

+

So far, all checks were against the infinite cone. Next, we check if the collision falls on the cone section between the spheres. +We interpolate the following values to the time of impact:

+

\begin{align} +p_{toi} =& p_0-c_0 - (p_0-c_0 - p_1-c_1)t\\ +A_{ltoi} =& \left|A_1A_{l1} - (A_1A_{l1} - A_0A_{l0})(1-t)\right|\\ +A_{toi} =& \left(A_1A_{l1} - (A_1A_{l1} - A_0A_{l0})(1-t)\right)A_{ltoi}^{-1}\\ +\end{align} +Where \(A_{l0}\) is the axis length at the start and \(A_{l1}\) at the end.

+

We calculate the point line distance, and the distance along the axis: +\begin{align} +d_{\bot} =& \sqrt{p_{toi}^2 - \left(p_{toi} \cdot A_{toi}\right)^2}\\ +d_| = & p_{toi} \cdot A_{toi} +\end{align}

+

Now we can calculate \(d_o\) again: +$$ +d_o = d_| + V_s d_{\bot} +$$ +which leaves us at with the same conditions used in the non-continuous capsule section.

+
+
+
+

calculateFrictionImpulse()

+

The calculateFrictionImpulse function is used to do the friction calculations after the collisions have been calculated. +The friction calculation is simplified by assuming the particle only touches one flat surface which approximates the average collision surface. +The normal of this surface is in the same direction as the collision delta calculated from the collision detection functions (mDeltaXYZ in the accumulator).

+

The velocity of the surface is calculated each time a collision is detected. +The sum of these velocities also stored in the accumulator (mVelXYZ). +The velocity of the friction surface is the average of all those velocities.

+

The friction impulse will be along the tangential part of the relative velocity between the particle and the surface. +The friction impulse magnitude is proportional to the friction coefficient and the collision delta magnitude. (TODO: Is the collision delta a good approximation for the normal force?)

+
+
+ + +
+
+
+
+
+
+ +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/Compiling/index.html b/NvCloth/docs/documentation/Compiling/index.html index 56b5e16..3dd36d3 100644 --- a/NvCloth/docs/documentation/Compiling/index.html +++ b/NvCloth/docs/documentation/Compiling/index.html @@ -68,11 +68,13 @@

Table Of Contents

@@ -203,7 +163,6 @@ Internet connection is required for this.

Edit scripts/locate_cuda.bat to point to the CUDA installation folder (that contains the bin, include and lib folder), edit scripts/locate_win8sdk.bat to point to the windows SDK (C:\Program Files (x86)\Windows Kits\8.1 by default)

Run CmakeGenerateAll.bat to generate the visual studio solution files in compiler/vcXXwinXX-cmake/. -Run samples/CmakeGenerateProjects.bat to generate the visual studio solution files in samples/compiler/vcXXwinXX-cmake/. For example Visual Studio 2015 solution with 64-bit target processor will be placed to compiler/vc14win64-cmake/ folder. Then open NvCloth.sln, choose the release/debug configuration and build the solution. The library binaries will be put to the bin folder next to the compiler folder.

The above project generation script has optional command line arguments to control whether CUDA/DX11 solvers should be enabled:

@@ -213,6 +172,8 @@ Then open NvCloth.sln
CmakeGenerateProjects.bat 1 0

will include CUDA solver into the compilation but exclude the DX11 solver.

+

Run samples/CmakeGenerateProjects.bat to generate the visual studio solution files for the samples in samples/compiler/vc14winXX-cmake/CmakeGenerateProjects.bat. +You need to build assimp first before building the samples. Run E:\nx0\sw\devrel\libdev\NvCloth\trunk\samples\external\assimp-4.1.0 and build samples\external\assimp-4.1.0\compiler\vc14winXX-cmake\Assimp.sln

Linux

diff --git a/NvCloth/docs/documentation/Cooking/Index.html b/NvCloth/docs/documentation/Cooking/Index.html new file mode 100644 index 0000000..dcb5b00 --- /dev/null +++ b/NvCloth/docs/documentation/Cooking/Index.html @@ -0,0 +1,251 @@ + + + + + + + + + Internal cooking documentation — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+

Internal cooking documentation

+

This document describes the internal workings of the cooking algorithms and related code.

+
+

Overview of the different modules

+

Contents:

+ +
+
+ + +
+
+
+
+
+ + +
+ + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/Cooking/TripletScheduler.html b/NvCloth/docs/documentation/Cooking/TripletScheduler.html new file mode 100644 index 0000000..7b3dacc --- /dev/null +++ b/NvCloth/docs/documentation/Cooking/TripletScheduler.html @@ -0,0 +1,278 @@ + + + + + + + + + TripletScheduler — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+

TripletScheduler

+
+

AdjacencyQuerier

+

AdjacencyQuerier is a helper class that produces lists of adjacent triplets (triangles) for particles, from the given list of triangles. +The algorithm to generate these lists is described in this section.

+

The result will be stored in one continuous array, instead of separate allocations. +For all particles we count how often each particle is referenced by a triangle and store this in adjacencyCount[i] for particle i. +This will determine the size of the individual adjacency lists. +Next, we calculate the inclusive prefix sum of adjacencyCount and store it in mAdjacencyIndecies (which contains one element more than adjacencyCount, for later use). +Now the last element of mAdjacencyIndecies contains the total size of all adjacency lists combined, so mAdjacencies can be allocated.

+

To generate the adjacency lists we loop through all triplets and store the triplet index in the adjacency list of each particle. +We use mAdjacencyIndecies[i]-1 to find the beginning of the adjacency list inside mAdjacencies for particle i. +mAdjacencyIndecies[i] is decremented so the next one will be written in a new location. +The values in mAdjacencyIndecies will be decremented to be the exclusive prefix sum after all the lists are filled (still pointing to all the beginnings of the lists). +The extra element can be used so that the list range can be given like Range<uint32_t>(mAdjacencies[mAdjacencyIndecies[i]],mAdjacencies[mAdjacencyIndecies[i+1]]) without going out of bounds for the last list.

+

The following tables give example values for the arrays with a square cloth plane of 9 particles (without alternating diagonals):

+
+
+

TripletScheduler

+

The triplet scheduler is used to order triplets so that multiple can be processed in parralell (using simd, or gpu parralelism). +The triplets need to be reordered in a way that only unique particles are processed at the same time to avoid race conditions and/or result stomping.

+
+
+

TripletScheduler::simd()

+

This function is used to sort triplets for simd processing on the cpu. +The input mTriplets will be reordered in place to create batches of simdWidth triplets that don’t share particles. +We keep track of sets of batches, instead of adding padding when a batch cannot be filled. +A set is a range of triplets that is successfully divided in batches. +A new set should only start after a batch could not be filled with unique triplets. +We also track the total amount of padding needed to make the set sizes a multiple of simdWidth, which is used to reserve the size of mPaddedTriplets. +Now each set can be copied into mPaddedTriplets with the correct padding without having to resize the list. (this used to be done in SwCloth::setVirtualParticles).

+
+
+

TripletScheduler::warp()

+

This function is used to sort triplets for cuda/gpu processing. +It will generate sets of triplets that can be processed in parallel in a cuda warp, ensuring that no duplicate particles are processed in parallel. +It also optimizes the sets to have the least amount of bank conflicts possible.

+
+
+ + +
+
+
+
+
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/CopyRight/Index.html b/NvCloth/docs/documentation/CopyRight/Index.html index 6048a38..a1bdd32 100644 --- a/NvCloth/docs/documentation/CopyRight/Index.html +++ b/NvCloth/docs/documentation/CopyRight/Index.html @@ -32,7 +32,6 @@ - @@ -68,11 +67,13 @@

Table Of Contents

Previous topic

User Guide

-

Next topic

-

Internal solver function/algorithm documentation

diff --git a/NvCloth/docs/documentation/ReleaseNotes/index.html b/NvCloth/docs/documentation/ReleaseNotes/index.html index 3af83b7..295691c 100644 --- a/NvCloth/docs/documentation/ReleaseNotes/index.html +++ b/NvCloth/docs/documentation/ReleaseNotes/index.html @@ -68,11 +68,13 @@

Table Of Contents

  • NVIDIA Copyright Notice
  • @@ -118,6 +124,7 @@
  • Overview
  • Particle invMass w component
  • Slack
  • +
  • Log Stiffness
  • Integration
  • Wind simulation
  • Distance constraints
  • @@ -136,9 +143,11 @@
  • Capsule collision detection
  • +
  • calculateFrictionImpulse()
  • Self Collision
  • +
  • Inter Collision +
  • Todo
  • +
  • Internal cooking documentation +
  • @@ -192,7 +221,60 @@

    Release Notes

    -

    1.1.3

    +

    1.1.5

    +

    Supported platforms:

    +
      +
    • Windows (CPU, CUDA, DX11)
    • +
    • Mac (tested on Sierra)
    • +
    • iOS (tested on iOS 11)
    • +
    • Linux (tested on Ubuntu 16.04.1 LTS x64)
    • +
    • PlayStation 4 with PS4 SDK 4.5
    • +
    • Xbox one (CPU, DX11, beta)
    • +
    • Android (arm64-v8a, API >= 21), tested on Shield TV
    • +
    • Switch (SDK 3.5.0)
    • +
    +

    Supported compilers (via cmake 3.7)

    +
      +
    • Windows: Visual Studio 12, 14 (2013, 2015)
    • +
    • Linux: gcc 5.4 (only x64)
    • +
    • Mac: xcode
    • +
    • iOS: tested with XCode 9 (Apple LLVM)
    • +
    • PlayStation 4: Visual studio 14 (2015)
    • +
    • Xbox one: Visual studio 14 (2015)
    • +
    • Android: NDK r12b and above
    • +
    • Switch: Visual studio 14 (2015)
    • +
    +

    Fixed:

    +
      +
    • Wind simulation code could affect particle masses (especially when high drag/lift coefficients were used)
    • +
    • Fixed PS4 mising override error.
    • +
    • Fix setCapsules bug.
    • +
    +

    New: +- Authoring library (helper functions useful for authoring tools)

    +

    Known issues: +- None

    +
    +
    +

    1.1.4

    +

    Fixed:

    +
      +
    • DirectX 11 solver had issues with ccd sphere/capsule collision.
    • +
    • Fixed sphere collision detection issue when clothing AABB is (almost) completely flat.
    • +
    • Fix virtual particle collision issue on cuda (static particles could be moved)
    • +
    • Enabled namespace in simd library, fixed runtime issues on switch when linking with APEX or PhysX.
    • +
    +

    New:

    +
      +
    • Removed old cuda architectures that are not supported anymore
    • +
    • Added improved teleportation API, rotation support and better support for teleporting while moving
    • +
    • Virtual particle collision detection is now implemented in DX11 as well (DX11 was the only solver lacking it)
    • +
    +

    Known issues: +- None

    +
    +
    +

    1.1.3

    Supported platforms:

    • Windows (CPU, CUDA, DX11)
    • @@ -229,8 +311,8 @@

      Known issues: - DirectX 11 solver has issues with ccd sphere/capsule collision.

    -
    -

    1.1.2

    +
    +

    1.1.2

    Fixed:

    • Dynamic allocations at runtime removed from MovingAverage.
    • @@ -243,8 +325,8 @@

      Known issues: - DirectX 11 solver has issues with ccd sphere/capsule collision.

    -
    -

    1.1.1

    +
    +

    1.1.1

    Fixed:

    • Air drag/lift did react to flow speed only linearly, model was changed to be more physically correct.
    • @@ -254,8 +336,8 @@

      Known issues: - DirectX 11 solver has issues with ccd sphere/capsule collision.

    -
    -

    1.1.0

    +
    +

    1.1.0

    Fixed:

    • DirectX 11 solver now supports triangle collision shapes and air drag/lift.
    • @@ -270,8 +352,8 @@

      Known issues: - DirectX 11 solver has issues with ccd sphere/capsule collision.

    -
    -

    1.0.0

    +
    +

    1.0.0

    Known issues: - DirectX 11 solver doesn’t support triangle collision shapes and air drag/lift

    diff --git a/NvCloth/docs/documentation/Solver/Index.html b/NvCloth/docs/documentation/Solver/Index.html new file mode 100644 index 0000000..b699ced --- /dev/null +++ b/NvCloth/docs/documentation/Solver/Index.html @@ -0,0 +1,593 @@ + + + + + + + + + Internal solver function/algorithm documentation — NvCloth 1.1.3 documentation + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +

    Previous topic

    +

    NVIDIA Copyright Notice

    +

    Next topic

    +

    Internal collision detection documentation

    + + +
    +
    +
    +
    + +
    +

    Internal solver function/algorithm documentation

    +

    NOTE: This documentation is work in progress and may contain errors and unfinished sections.

    +

    This document describes the internal workings of the solver. +We describe how the different parts work independent from platform specific features. Although we might occasionally comment on particular implementation details.

    +

    Todo: give this solver a name, so that we can differentiate when a new/different solver is added.

    +
    +

    Overview

    +

    Overview of the general algorithm goes here.

    +
      +
    • Integrate particles (integrateParticles())
    • +
    • Simulate wind/drag/lift (applyWind())
    • +
    • Distance constraints (constrainMotion())
    • +
    • Tether constraints (constrainTether())
    • +
    • Solve edge constraints (solveFabric())
    • +
    • Solve separation constraints (constrainSeparation())
    • +
    • Collision (collideParticles())
    • +
    • Self collision (selfCollideParticles())
    • +
    • Update sleep state (updateSleepState())
    • +
    +
    +
    +

    Particle invMass w component

    +

    Todo: check and rewrite:

    +
    // note on invMass (stored in current/previous positions.w):
    +// integrateParticles()
    +//   - if(current.w == 0) current.w = previous.w
    +// constraintMotion()
    +//   - if(constraint.radius <= 0) current.w = 0
    +// computeBounds()
    +//   - if(current.w > 0) current.w = previous.w
    +// collideParticles()
    +//   - if(collides) current.w *= 1/massScale
    +// after simulate()
    +//   - previous.w: original invMass as set by user
    +//   - current.w: zeroed by motion constraints and mass-scaled by collision
    +
    +
    +
    +

    Slack

    +

    The position constraint for keeping distance between points a and b is usually written as:

    +
    error  = |b-a| - restLength
    +offset = error * (b-a)/|b-a|
    +       = (b-a) - restLength*(b-a)/|b-a|
    +
    +

    The equation calculating slack pops up often in the solver code. +This does exactly the same as the above:

    +
    slack  = 1 - restLength / |b-a|
    +offset = (b-a) * slack
    +       = (b-a) - restLength*(b-a)/|b-a|
    +
    +
    +
    +

    Log Stiffness

    +

    Many constraints have a stiffness parameter that can be used to influence the rate at which the constraint recovers from errors. +Stiffness can be applied, in the most basic forms, as follows: +$$ +p_1 = p_0 + \Delta p k +$$ +where \(p_0\) and \(p_1\) are the current and next particle positions, \(\Delta p\) is the constraint correction offset (as seen in the Slack section), and \(k\) is the stiffness constant.

    +

    The constraint error will be reduced by a factor of \(k\) per iteration, making it solver frequency dependent. +The remaining constraint error is \(\Delta p(1-k)^n\) after \(n\) iterations.

    +

    We adjust the stiffness constant based on the delta time to get framerate independence. +We want to pick \(k_{\Delta t} \) so that the error after one second at reference frequency \(f\), \(\Delta p(1-k)^f\), and the error after one second with time steps of \(\Delta t\), \(\Delta p(1-k_{\Delta t})^{\frac{1}{\Delta t}}\), are equal: +\begin{align} +(1-k)^{f} &= (1-k_{\Delta t})^{\frac{1}{\Delta t}}\\ +(1-k)^{f\Delta t} &= 1-k_{\Delta t}\\ +k_{\Delta t} &= 1 - (1-k)^{f\Delta t}\\ +\end{align}

    +

    This solution is most likely based on page 8 of this paper.

    +

    The user specifies the stiffness \(k\) (using the constraint phase configs and functions like Cloth::setTetherConstraintStiffness()) for the reference frequency \(f\) (set using Cloth::setStiffnessFrequency()). +Instead of storing \(k\) as is we store it in logarithmic space: +$$ +k_{\log} = +\begin{cases} +\log_2(1-k),& 1-k>0\\ +\text{-FLT_MAX_EXP},&\text{otherwise} +\end{cases} +$$

    +

    This way \(k_{\Delta t}\) can be calculated without using the powf() function: +$$ +k_{\Delta t} = 1 - \mathrm{e}^{\left(f \Delta t \log(2) k_{\log}\right)} +$$

    +

    Note: this still uses the expf() function. We also need the extra \(\log(2)\) constant as for some reason \(k_{\log}\) is in the base 2 logarithm. This is probably to make the condition work with FLT_MAX_EXP.

    +

    Also note that even though \(k_{\Delta t}\) should be timestep independent the time step still affects the stiffness of the simulation, both because of error propagation and because the integrator is not timestep independent.

    +
    +
    +

    Integration

    +

    The first step of the cloth simulation is the integration. +Explicit Euler integration is used to calculate the new position of the particles. +The velocity of the particles is not stored, instead we use the position from the previous frame to calculate the velocity. +We need to compensate for differences in delta time. Large fluctuations can cause problems, so the delta time is damped.

    +

    The following pseudo code describes how this is implemented:

    +
    //calculate damping constants from user setting 'damping'
    +logDamping = log_2(1-damping) //from ClothImpl<T>::setDamping
    +dampExponent = stiffnessFrequency * dt1 //from IterationState::create
    +
    +//calculate delta time ajustment
    +scale = e^{logDamping * dampExponent} * {dt1/dt0} //from IterationState::create
    +//Do the integration
    +delta = (particle_position1-particle_position0) * scale + acceleration
    +particle_position1 = particle_position1 + delta
    +
    +

    The integration code also replaces the current inverse mass with the previous inverse mass if the current is zero.

    +

    Todo: rotating reference frame.

    +

    Todo: how does damping work?

    +
    +
    +

    Wind simulation

    +

    Drag and lift simulation is done in the applyWind() function. +We use the following equations to model air drag and air lift:

    +

    $$ +F_d = \frac{1}{2} \rho v^2 c_{drag} A +$$

    +

    $$ +F_l = c_{lift}\frac{1}{2} \rho v^2 A +$$

    +

    where \(F_d\) and \(F_l\) are the drag and lift forces, \(\rho\) is the fluid density, \(v\) is the flow speed, \(A\) is the surface area and \(c_{drag}\) and \(c_{lift}\) are the drag and lift coefficients. +We use different symbols and notation in the explanation below to match closer to the source implementation. +Note that the equations above work with velocity in \(\mathrm{m.s^{-1}}\), while we work mostly with the offset per frame in \(\mathrm{m}\) (meanning velocity multiplied by the iteration delta time).

    +

    The following algorithm is used:

    +
    for each triangle
    +       \(p_j\), \(c_j\) and \(m^{-1}_j\) are the previous position, current position and is the inverse mass of the \(j\)th particle in the triangle.
    +
    +       //Calculate current and previous center of the triangle
    +       \(c_t = \frac{1}{3} \cdot \left( c_0 + c_1 + c_2 \right)\)
    +       \(p_t = \frac{1}{3} \cdot \left( p_0 + p_1 + p_2 \right)\)
    +
    +       //Position difference including wind (same as flow speed times dt; in \(\mathrm{m}\))
    +       \(d = c_t - p_t + wind\)
    +
    +       if rotating reference frame
    +               \(d = c_t + R\left(d-c_t\right)\) //where \(R\) is the inverse local space rotation for one solver iteration
    +               //Todo check/explain this
    +
    +       //Unnormalized normal of the triangle
    +       \(n = \left(c_2 - c_0\right) \times \left(c_1 - c_0\right) \)
    +
    +       //Double the area of the triangle in \(\mathrm{m^2}\)
    +       \(a = \left|n\right| \)
    +
    +       //Normalized triangle normal
    +       \(\hat{n} = \frac{n}{a}\)
    +
    +       //Calculate the cos and sin of the angle \(\theta\) between the \(d\) and \(n\)
    +       \(\Lrg{ \cos\left(\theta\right) = \frac{\hat{n} \cdot d}{\left|d \right|} }\)
    +       \(\Lrg{ \sin\left(\theta\right) =  \sqrt{\max(0, 1 - \cos\left(\theta\right)^2)}}\)
    +
    +       //Lift direction is orthogonal to \(d\) and in the \(d\) \(n\) plane. Its length is \(\left|d\right|\)
    +       \(\Lrg{ l_{dir} = \frac{\left( d \times \hat{n}\right) \times d}{\left|d \right|} }\)
    +
    +       //Calculate the lift and drag impulse
    +       //The lift is at its maximum when \(d\) is at an \(45^\circ\) angle to the triangle
    +       //We use \(\sin\left(\theta\right)\cdot\cos\left(\theta\right) = \frac{1}{2}\sin\left(2\cdot \theta\right)\) to calculate this
    +       \(i_{lift} = c_{lift} \cdot \cos\left(\theta\right) \cdot \sin\left(\theta\right) \cdot l_{dir} \cdot \left|d\right| \cdot \Delta t^{-1}\)
    +       \(i_{drag} = c_{drag} \cdot \left|\cos\left(\theta\right)\right| \cdot d \cdot \left|d\right| \cdot \Delta t^{-1} \)
    +       //\(c_{lift} \) and \(c_{drag}\) are the lift and drag coefficients
    +
    +       //combined impulse
    +       \(\Lrg{ i =
    +               \begin{cases}
    +               \epsilon < \left|d\right|^2,& 0\\
    +               \text{else},& \left(i_{lift} + i_{drag}\right) \cdot \rho \cdot a
    +               \end{cases}
    +       }\)
    +       //where \(\rho\) is the fluid density
    +       //\(\rho\) should be set to compensate for the double area in \(a\)
    +
    +       //apply impulses to the particle positions
    +       for each particle \(j = \left\{ 0, 1, 2 \right\} \)
    +               \(c_j = c_j - i \cdot m^{-1}_j \)
    +
    +

    Note that when we combine the impulses we check if \(\left|d\right|\) is too small as this causes instabilities due to float division inaccuracies. +This can cause different drag and lift behavior depending on the time step size (or solver frequency). +Smaller time steps result in smaller position deltas which reach the \(\epsilon\) threshold sooner. +This results in less drag/lift at small time steps (high solver frequencies) for slow moving particles.

    +
    +
    +

    Distance constraints

    +

    A distance constraint can limit the movement of a particle to the volume of a sphere. +The constraints are specified with an array of 4 dimensional vectors (physx::PxVec4) where the x, y, z elements define the center and w the radius of the sphere.

    +

    The constraints are interpolated between the start and target spheres if both are given.

    +

    The constrainMotion() function in the solver is responsible for enforcing these constraints. +The following pseudo code describes how this is implemented:

    +
    delta = sphere_center - particle_position
    +sqrLength = epsilon + |delta|^2
    +radius = max(0, sphere_radius * scale + bias)
    +slack = 1 - radius / sqrt{sqrLength}
    +
    +if(slack>0)
    +{
    +   if(radius <= 0)
    +      particle_invMass.w = 0 //Set the inverse mass to 0 if we are constrained to a zero radius sphere
    +   slack = slack * stiffness
    +   particle.xyz += delta * slack
    +}
    +
    +
    +
    +

    Tether constraints

    +

    Tether constraints help with reducing the stretchiness of the cloth without increasing the solver iteration count. +This is done by adding additional max distance constraints connecting simulated particles with their nearest fixed particle(s). +The tether constraints are stored as an index & length pair. +The array of constraints has a multiple of particle count elements. +The constraints in the array are stored in order so that the first particle of the constraint is element%numParticles. +The index stored in the constraint defines the other (anchor) particle of the constraint.

    +

    The constraint for one particle is solved as follows:

    +
    offset = 0
    +for each tether connecting pb
    +    //pa is the anchor particle
    +    delta = pa - pb
    +    radius = tetherLength * scale
    +    slack = 1 - radius / (|delta| + epsilon)
    +    offset += delta * max(slack, 0)
    +pb += offset * stiffness
    +
    +

    The stiffness is calculated as follows:

    +
    stiffness = tetherConstraintStiffness * numParticles / numTethers
    +
    +
    +
    +
    +

    Edge constraints

    +

    Algorithm:

    +
    r = restlength
    +pi = particle i
    +piw = inv weight of particle i
    +h = pb-pa
    +e2 = epsilon + |h|^2
    +er = r>0 ? (1 - r / sqrt{e2}) : 0
    +
    +if(useMultiplier)
    +{
    +    //from PhaseConfig.h cloth::transform
    +    multiplierC = log2(stiffnessMultiplier)
    +    compressionLimitC = 1 - 1 / compressionLimit
    +    strechLimitC = 1 - 1 / stretchLimit
    +    er -= multiplierC * max(compressionLimitC, min(er, stretchLimitC))
    +}
    +
    +stiffnessExponent = stiffnessFrequency * dt/iterations
    +stiffness = log2(1-stiffness) //check when this happens //from PhaseConfig.h cloth::transform
    +stiffnessC = 1-2^{stiffness * stiffnessExponent}
    +ex = er * stiffnessC / (pbw+paw)
    +
    +pa = pa + h*ex * paw
    +pb = pb - h*ex * pbw
    +
    +
    +
    +

    Separation constraints

    +

    Separation constraints do exactly the opposite of distance constraints. +These constraints ensure that the particles remain outside the defined spheres.

    +

    The constraints are interpolated between the start and target spheres if both are given.

    +

    The constrainSeparation() function in the solver is responsible for enforcing these constraints. +Solving a single constraint is done as follows:

    +
    //p is the particle position
    +//c is the sphere center
    +//r is the sphere radius
    +d = c-p
    +l = |d|
    +slack = 1 - r/l
    +if(slack < 0)
    +    p += d * slack
    +
    +
    +
    +

    Fabric data structure

    +

    The fabric data structure contains the constraint information that can be reused by multiple cloth instances. +The constraints are divided in different phases. +Each phase usually contains a different type of constraints such as (horizontal/vertical) stretching, searing, bending constraints.

    +

    mPhases contains indices indicating which set from mSets belongs to a phase.

    +

    mSets contains a list of start (and end) indices for mRestvalues and mIndices (if multiplied by 2). +The first rest value of set s is mRestvalues[mSets[s]] and the last is mRestvalues[mSets[s+1]-1].

    +

    mRestvalues contains the rest lengths / edge lengths of the constraints.

    +

    mIndices contains pairs of indices connected by a constraint. (mIndices.size()*2 == mRestvalues.size())

    +
    +
    + + +
    +
    +
    +
    +
    + + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/NvCloth/docs/documentation/UserGuide/Index.html b/NvCloth/docs/documentation/UserGuide/Index.html index ae14ec2..b2153fc 100644 --- a/NvCloth/docs/documentation/UserGuide/Index.html +++ b/NvCloth/docs/documentation/UserGuide/Index.html @@ -68,11 +68,13 @@

    Table Of Contents

    diff --git a/NvCloth/docs/documentation/_images/AdjacencyTables.svg b/NvCloth/docs/documentation/_images/AdjacencyTables.svg new file mode 100644 index 0000000..f932516 --- /dev/null +++ b/NvCloth/docs/documentation/_images/AdjacencyTables.svg @@ -0,0 +1,5130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index + + + 0 + + + 1 + + + 2 + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 9 + + + adjacencyCount + + + 2 + + + 3 + + + 1 + + + 3 + + + 6 + + + 3 + + + 1 + + + 3 + + + 2 + + + 0 + + + prefix sum inclusive + + + 2 + + + 5 + + + 6 + + + 9 + + + 15 + + + 18 + + + 19 + + + 22 + + + 24 + + + 24 + + + prefix sum exclusive + + + 0 + + + 2 + + + 5 + + + 6 + + + 9 + + + 15 + + + 18 + + + 19 + + + 22 + + + 24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Triplets + + + Index + + + t0 + + + t1 + + + t2 + + + t3 + + + t4 + + + t5 + + + t6 + + + t7 + + + particle 1 + + + p0 + + + p0 + + + p1 + + + p1 + + + p3 + + + p3 + + + p4 + + + p4 + + + particle 2 + + + p1 + + + p4 + + + p2 + + + p5 + + + p4 + + + p7 + + + p5 + + + p8 + + + particle 3 + + + p4 + + + p3 + + + p5 + + + p4 + + + p7 + + + p6 + + + p8 + + + p7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index + + + + + + + 0 + + + + + + + 1 + + + + + + + 2 + + + + + + + 3 + + + + + + + 4 + + + + + + + 5 + + + + + + + 6 + + + + + + + 7 + + + + + + + 8 + + + + + + + 9 + + + + + + + 10 + + + + + + + 11 + + + + + + + 12 + + + + + + + 13 + + + + + + + 14 + + + + + + + 15 + + + + + + + 16 + + + + + + + 17 + + + + + + + 18 + + + + + + + 19 + + + + + + + 20 + + + + + + + 21 + + + + + + + 22 + + + + + + + 23 + + + + + + + 24 + + + + + + + mAdjacencies + + + + + + + t1 + + + + + + + t0 + + + + + + + t3 + + + + + + + t2 + + + + + + + t0 + + + + + + + t2 + + + + + + + t5 + + + + + + + t4 + + + + + + + t1 + + + + + + + t7 + + + + + + + t6 + + + + + + + t4 + + + + + + + t3 + + + + + + + t1 + + + + + + + t0 + + + + + + + t6 + + + + + + + t3 + + + + + + + t2 + + + + + + + t5 + + + + + + + t7 + + + + + + + t5 + + + + + + + t4 + + + + + + + t7 + + + + + + + t6 + + + + + + + END + + + + + + + particle list sections + + + + + + + p0 + + + + + + + p1 + + + + + + + p2 + + + + + + + p3 + + + + + + + p4 + + + + + + + p5 + + + + + + + p6 + + + + + + + p7 + + + + + + + p8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NvCloth/docs/documentation/_images/CapsuleCircleIntersectionDiagram.svg b/NvCloth/docs/documentation/_images/CapsuleCircleIntersectionDiagram.svg new file mode 100644 index 0000000..787fbe9 --- /dev/null +++ b/NvCloth/docs/documentation/_images/CapsuleCircleIntersectionDiagram.svg @@ -0,0 +1,435 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + r1 + + r2 + r2 + + + c1 + c2 + rm + + m + + + + + + + + + + + t1 + t2 + + + + + + + t3 + + + + + + + + diff --git a/NvCloth/docs/documentation/_images/CapsulePointCollisionDetection.svg b/NvCloth/docs/documentation/_images/CapsulePointCollisionDetection.svg new file mode 100644 index 0000000..46493cf --- /dev/null +++ b/NvCloth/docs/documentation/_images/CapsulePointCollisionDetection.svg @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + r1 + + r2 + r2 + + + c1 + c2 + m + + + + + + + + + t1 + t2 + + + + + + + t3 + + + + + + + + p + + + + + diff --git a/NvCloth/docs/documentation/_images/CapsulePointCollisionDetection2.svg b/NvCloth/docs/documentation/_images/CapsulePointCollisionDetection2.svg new file mode 100644 index 0000000..40982ee --- /dev/null +++ b/NvCloth/docs/documentation/_images/CapsulePointCollisionDetection2.svg @@ -0,0 +1,368 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + r1 + + r2 + r2 + + + c1 + c2 + m + + + + + + + + + t1 + t2 + + + + + + + t3 + + + + + + + + p + + + + + + + + + + + + + m' + + diff --git a/NvCloth/docs/documentation/_images/CapsulePointCollisionResponse.svg b/NvCloth/docs/documentation/_images/CapsulePointCollisionResponse.svg new file mode 100644 index 0000000..2c7152e --- /dev/null +++ b/NvCloth/docs/documentation/_images/CapsulePointCollisionResponse.svg @@ -0,0 +1,334 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + r1 + + r2 + r2 + + + c1 + c2 + m + + + + + + + + + t1 + t2 + + + + + + + t3 + + + + + + + + p + + + α + + diff --git a/NvCloth/docs/documentation/_images/CapsuleRadiusDiagram.svg b/NvCloth/docs/documentation/_images/CapsuleRadiusDiagram.svg new file mode 100644 index 0000000..fa278fb --- /dev/null +++ b/NvCloth/docs/documentation/_images/CapsuleRadiusDiagram.svg @@ -0,0 +1,453 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + r1 + + r2 + r2 + + + c1 + c2 + m + + + t1 + t2 + + + t3 + + + + + + + + + + + + + + diff --git a/NvCloth/docs/documentation/_images/SelfCollisionGrid.svg b/NvCloth/docs/documentation/_images/SelfCollisionGrid.svg new file mode 100644 index 0000000..d765a3c --- /dev/null +++ b/NvCloth/docs/documentation/_images/SelfCollisionGrid.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NvCloth/docs/documentation/_images/SelfCollisionHashAxisKernel.svg b/NvCloth/docs/documentation/_images/SelfCollisionHashAxisKernel.svg new file mode 100644 index 0000000..1e6a0e2 --- /dev/null +++ b/NvCloth/docs/documentation/_images/SelfCollisionHashAxisKernel.svg @@ -0,0 +1,282 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 25432 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NvCloth/docs/documentation/_images/Simd.svg b/NvCloth/docs/documentation/_images/Simd.svg new file mode 100644 index 0000000..a33a029 --- /dev/null +++ b/NvCloth/docs/documentation/_images/Simd.svg @@ -0,0 +1,2230 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NvCloth/docs/documentation/_images/SphereAcceleration.svg b/NvCloth/docs/documentation/_images/SphereAcceleration.svg new file mode 100644 index 0000000..e8b6b7f --- /dev/null +++ b/NvCloth/docs/documentation/_images/SphereAcceleration.svg @@ -0,0 +1,2487 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SAP raster + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + + + + + + + X0 + Y1 + Z2 + X3 + Y4 + Z5 + + Right incl. + Left incl. + SAP Span bitmask + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + + + diff --git a/NvCloth/docs/documentation/_images/SphereCCD.svg b/NvCloth/docs/documentation/_images/SphereCCD.svg new file mode 100644 index 0000000..e58a571 --- /dev/null +++ b/NvCloth/docs/documentation/_images/SphereCCD.svg @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + c0 + c1 + p0 + p1 + + + + + + + + + + + + q0 + q1 + + + + + + + + + + + + + + + toi + q0 + q1 + + diff --git a/NvCloth/docs/documentation/genindex.html b/NvCloth/docs/documentation/genindex.html index cb29701..ab20cb2 100644 --- a/NvCloth/docs/documentation/genindex.html +++ b/NvCloth/docs/documentation/genindex.html @@ -67,11 +67,13 @@

    Table Of Contents

    diff --git a/NvCloth/docs/documentation/index.html b/NvCloth/docs/documentation/index.html index 54837c7..00aefaa 100644 --- a/NvCloth/docs/documentation/index.html +++ b/NvCloth/docs/documentation/index.html @@ -67,11 +67,13 @@

    Table Of Contents

    @@ -166,6 +237,9 @@
  • Modules
  • User Guide
  • NVIDIA Copyright Notice
  • +
  • Internal solver function/algorithm documentation
  • +
  • Internal collision detection documentation
  • +
  • Internal cooking documentation
  • diff --git a/NvCloth/docs/documentation/search.html b/NvCloth/docs/documentation/search.html index fe0e88b..d9b0400 100644 --- a/NvCloth/docs/documentation/search.html +++ b/NvCloth/docs/documentation/search.html @@ -63,11 +63,13 @@

    Table Of Contents

    diff --git a/NvCloth/docs/documentation/searchindex.js b/NvCloth/docs/documentation/searchindex.js index 12e6d5d..659f743 100644 --- a/NvCloth/docs/documentation/searchindex.js +++ b/NvCloth/docs/documentation/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,terms:{represent:9,all:[1,2,5,4,6,7,9,10,12],code:[8,9,3,7,11],edg:[],orthogon:3,indirectli:7,skip:[9,7],global:7,yellow:1,minusa:9,signific:1,sleep:3,per:[1,3,7],capsul:[],skin:[9,7],follow:[3,12,4,7,9,5],calculatepotentialcollid:4,mupper:4,minusk:9,profil:7,choos:12,"const":7,multiplierc:3,applywind:3,sensit:7,adjacencycount:5,negativescal:9,descript:10,setselfcollisiondist:1,program:12,gsimd4fon:9,present:[6,7],opposit:3,vcxxwinxx:12,sens:9,introduc:6,everyth:7,undesir:7,sourc:3,everi:[9,1,4],lrg:3,madjacencyindeci:5,far:9,offlin:10,strechlimitc:3,setfrict:7,volum:[9,4,3,7],radiu:[9,3,7],setplan:7,fall:9,veri:[9,4,7],evert:7,ajust:3,brows:0,cuctxcreat:7,pbw:3,uint32_t:[5,7],dampen:7,mstiffnessmultipli:7,stiff:7,did:6,list:[5,4,3,7,10],prefix:5,iter:[9,4,3,7],readabl:9,"try":7,tunnel:7,vector:[3,7],phase:[3,7],d_o:9,small:[9,3],setdragcoeffici:7,refer:[9,3,7],locat:[5,7],dir:3,setmotionconstraintstiff:7,upper:1,c_j:3,smaller:[1,3,7],p_j:3,unnorm:3,mass:[9,3,7],mdeltaxyz:9,natur:7,htm:[],edu:[],compens:3,direct:[9,3,7],transform:[4,3,7],setgrav:7,past:9,second:[9,3],cost:9,design:0,c_0c_1:9,download:12,massscal:3,p_t:3,setstiffnessfrequ:3,blue:9,index:[3,1,12,7,5],lastkei:1,hide:3,r15c:12,neg:[9,7],section:[9,3,7,5],advanc:7,abl:12,brief:10,current:[9,1,3,7,10],delet:7,version:12,run:[9,12,7],invers:[3,7],intersect:[9,1,4,7],"new":[5,3,6,7],impuls:[9,3,7],method:[9,6,7],movement:[9,3,7],cull:[9,1,4],mlower:4,intellectu:2,hash:1,deriv:9,locate_cuda:12,cellcount:1,curradiu:9,getsimulationchunkcount:7,never:9,dotcurcur:9,id3d11devic:7,here:[9,3,7,10],behaviour:[],shouldn:[],tangent:9,sortedindic:4,ubuntu:6,path:12,along:[9,1,7],vertic:[3,7],p_2:3,sinc:7,valu:[9,1,3,7,5],p_1:[9,3],box:4,ltoi:9,convert:[9,1],shift:7,larger:1,bot:9,precis:7,bitmask:9,r12b:[12,6],numteth:3,setposit:7,pick:[1,3,7],adjacentcycount:[],clearmotionconstraint:7,chang:[9,12,6,7],narrow:4,magnitud:9,particleposit:7,eshear:7,via:6,sskeletonwidth:9,although:3,extra:[5,3],timestep:3,approxim:9,sphereradiu:[9,7],linearli:[9,6],c_1:[9,3],c_0:[9,3],c_2:[9,3],clothfabriccook:7,sr_0:9,instabl:[3,7],instal:12,decrement:5,total:5,"__t100":6,unit:6,from:[1,2,3,4,5,6,7,9,10,12],describ:[1,5,7,8,9,11,3],would:[9,6],memori:[4,7],doubl:[9,3],visit:0,two:[9,1,7],madjac:5,next:[9,1,12,5,3],live:6,solvefabr:3,call:7,bash:12,taken:[1,7],black:9,type:[3,7],tell:7,reorder:5,more:6,flat:9,desir:7,settetherconstraintstiff:[3,7],c_i:9,cmakegenerateproject:12,relat:[8,2,10],finit:9,warn:6,pxprofilercallback:7,visual:[12,6],mparticleindic:4,c_t:3,"4ac":9,known:[1,6],ebend:7,hold:7,oldradiu:7,logarithm:3,reproduct:2,graphic:7,stretchlimit:3,prepar:10,work:[6,7,8,9,11,3],uniqu:5,dxcontextmanagercallbackimpl:7,swcloth:5,remain:[1,3,7],pxquat:7,vertexcount:7,can:[1,5,4,7,9,10,3],frequenc:[3,7],collidespher:9,about:[],d3d11:7,root:12,could:[5,7],tripletschedul:[],control:[12,7],nearest:3,give:[5,4,7,9,10,3],process:[5,1,12],lock:7,share:[5,7],calcul:[1,5,4,6,7,9,3],gsimd4fepsilon:9,high:3,sphere:[],minimum:[9,1,4],proprietari:2,bend:3,want:[1,3,7,10],setvirtualparticl:5,setconvex:7,made:9,rappidli:[],q_0q_1:9,teleport:7,differenti:[3,7],end:[9,12,7,3],straightforward:7,divid:[9,1,3,7,5],environ:12,occur:9,write:[],how:[5,1,3,7],pseudo:3,consist:7,env:12,regist:9,instead:[1,5,4,7,9,3],getparticl:4,config:[3,7],sin:[9,3],updat:[3,7],product:[0,9],collisionshap:7,frac:[9,3],clothdata:1,referenc:5,alwai:7,tetherconstraintstiff:3,max:3,after:[9,4,3,7,5],surfac:[9,3],usabl:9,diagram:[9,1],befor:[9,7],mesh:[1,7,10],generatecon:9,buildacceler:9,mai:7,multipl:[5,4,3,6,7],data:10,parallel:[5,12],averag:9,parralel:5,stabil:7,alloc:[5,6,7],github:[],setwindveloc:7,updatesleepst:3,"6th":9,createcloth:7,favorit:12,correspond:[9,7],element:[5,3],issu:[6,7],inform:[3,7],"switch":7,green:9,compressionlimit:3,allow:[6,7],nvidia:12,exclus:5,attachmentvertic:7,"253x253":1,when:[1,5,6,7,9,3],order:[9,1,3,7,5],wind:6,vc14win64:12,origin:[3,7],gcc:6,help:[3,12,7],v_r:9,setcentrifugalinertia:7,gradual:7,over:[9,4,7],move:[9,3,7],settransl:7,becaus:[9,1,3],meter:7,x64:6,cook:[7,10],nv_cloth_delet:7,paper:3,through:[9,5,7],same:[9,3,7,5,10],affect:3,v_l:9,still:[5,3,7],pointer:1,nvidiagamework:[],directx:6,paramet:[3,6,7],osx64:12,typedef:6,outer:9,render:7,fix:[3,12,6,7],curesult:7,better:7,platform:[3,12,6,7],pend:7,mrestvalu:3,requir:[1,12,7],bypass:10,clothimpl:[3,6],featurelevel:7,might:[3,12,7],tri:[1,4],non:[9,1,7],good:[9,7],crash:6,thei:[9,1,7],handl:[9,7,10],similar:[9,4,7],"2q_0":9,deiniti:7,sooner:3,scene:[6,7],"break":7,mappedrang:7,impulseaccumul:9,streatch:[],larg:[1,3,7],now:[1,4,6,7,9,5],"class":[5,7],discuss:9,bigger:9,productnam:[],search:0,somewher:7,name:3,anyth:7,edit:12,simpl:7,solver:[12,6],mindic:3,easili:7,exampl:[5,12,7],mode:6,each:[1,5,4,7,9,3],debug:[12,6],penetr:[9,7],mtriplet:5,mean:[3,7],clamp:[9,7],prohibit:2,cudacontext:7,weight:3,replac:[3,7],individu:[1,4,5,7],continu:[9,1,5,7],realli:9,playstat:6,dx11:[12,6,7],been:[9,7],"static":[6,7],connect:[3,12,7],setcapsul:7,fluctuat:3,happen:[9,3],out:[5,7],variabl:[9,1,12],shown:[],getnumcloth:6,space:[],goe:3,miss:7,content:[8,11],rewrit:[9,3],adjust:[3,7],suitabl:0,rel:[9,1,7],internet:12,hardwar:6,formula:9,gridbia:1,correct:[9,3,6,5,7],red:9,mphase:3,log2:3,linear:[9,7],insid:[9,12,6,5,7],prevradiu:9,midpoint:9,accordingli:7,selfcollideparticl:3,reason:[1,3],base:[3,1,4,12,7],removecloth:7,releas:12,org:12,"byte":[1,7],compressionlimitc:3,shortest:1,care:[4,7],setliftcoeffici:7,reusabl:7,r_0r_1:9,thread:7,"20level":[],angl:3,particledelta:9,veloc:[9,3,7],omit:9,put:12,keep:[1,5,4,7,9,3],recov:[3,7],thing:7,length:[9,1,3,7],enforc:3,place:[5,12],outsid:3,nvcloth:[2,12],fequenc:[],retain:2,onto:9,interact:0,first:[9,1,4,3,7],oper:1,softwar:2,restlength:3,directli:[9,1,4,7,10],x86_64:12,cuda_success:7,arrai:[5,1,4,3,7],independ:3,number:[6,7],system:7,invluenc:[],alreadi:[6,7],done:[9,1,4,3,5],construct:[9,1,7],inpuls:[],thick:9,stick:9,open:12,primari:9,mpaddedtriplet:5,idea:7,given:[9,1,3,5],"long":7,optim:[1,5,6],point_to_lin:[],script:12,exp2:9,licens:2,sometim:7,least:[1,5,7],toi:9,too:[1,3,7],circl:9,time:[9,3,7,5],gpu:[5,6,7],dt1:3,dt0:3,"final":[],store:[1,5,4,7,9,3],editor:12,dampexpon:3,getnumtriangl:7,piw:3,option:[12,7],endsimul:7,namespac:6,seper:[],aabb:1,copi:[5,12],usemultipli:3,plane:[11,9,3,7,5],devicecount:7,part:10,enclos:4,mostli:3,quad:[7,10],exactli:[9,3],nvclothcreatefactorycuda:7,than:[9,1,5,7],ehorizont:7,f_d:3,level:0,stiffnessc:3,prune:9,provid:[0,1,7,10],remov:[6,7],d3d11createdevic:7,rate:[9,3,7],horizont:[3,7],project:[9,12],matter:7,reus:[9,1,3],includ:[3,12,7,10],were:[9,6],posit:[9,1,3,7],amount:[1,5],dxcontextmanagercallback:7,expf:3,"function":10,comput:9,behavior:[3,6,7],nicer:1,explicit:3,pass:7,getclothlist:6,argument:[12,7],nvclothcookfabricfrommesh:7,dash:9,thereto:2,constrainteth:3,reset:7,have:[9,3,7,5],initializenvcloth:7,need:[1,3,4,5,7,9,12],clothmeshdesc:7,incompat:6,border:9,probabl:[3,7],caus:[3,6,7],rmin:9,strength:7,engin:7,squar:5,lib:[12,10],min:[9,1,3],r_p:9,destroi:7,self:[],centimet:7,mid:9,accuraci:7,note:12,also:[9,1,3,7,5],especi:7,discret:9,take:4,which:[1,5,4,6,7,9,10,3],stretchi:[3,7],combin:[9,1,3,7,5],graviti:7,singl:[],clearinertia:7,even:[9,3,7],begin:[9,1,3,7,5],sure:12,android_ndk_root:12,thi:[1,2,3,4,5,7,8,9,10,11,12],normal:[9,3],multipli:[9,3,7],dxdevic:7,previou:[9,1,3,7],compress:7,what:9,react:[6,7],most:[3,7],beta:6,regular:[9,1],cucontext:7,specifi:[1,3,7],rho:3,pair:[9,1,4,3,7],alpha:9,cap:9,"8x8x8":9,equival:4,worldspac:4,cmakegenerateal:12,r_0:9,r_1:9,particle_invmass:3,later:[5,12,7],cover:1,collisionmask:9,doe:[9,1,4,3,7],settetherconstraintscal:7,runtim:[10,6,7],determin:[9,4,5],hresult:7,occasion:3,constrain:[3,7],axi:[9,1,4],blend:7,microsoft:12,dot:9,slope:9,settodefault:7,radix:1,getcurrentparticl:7,show:[3,7],text:[9,12,3],xcode:[12,6],delta:[9,1,3,7],stiffnessexpon:3,friction:[9,6,7],radii:[9,7],concurr:7,dxdevicecontext:7,unchang:7,threshold:3,callback:7,find:5,setintercollisiondist:4,impact:9,cell:[9,1],onli:[1,4,6,7,9,5],slow:[1,3],ratio:1,execut:[9,12,7],mathrm:3,simulatechunk:7,explain:[9,3],configur:[12,7],solut:[3,12],"2r_0":9,should:[3,12,7,5],computebound:[1,3],experiment:6,suppos:1,factor:[3,7],sierra:6,physx:[3,6,7],folder:12,local:[],dotprevcur:9,count:[9,1,3,7,5],unus:6,variou:12,get:[3,7],pxallocatorcallback:7,stomp:5,express:2,stop:9,fluid:[3,6,7],docreleasebold:[],newradiu:7,bucketmask:1,obviou:4,cannot:[1,4,5,7],phasetypeinfo:7,longest:1,increas:[3,7],sqrconehalflength:9,clothbound:4,target:[3,12,7],bat:12,enabl:[9,12,7],artist:7,a_0a_:9,gust:7,v8a:[12,6],"2m_":9,sum:[9,5],f_l:3,though:[9,1,3],contain:[3,1,12,7,9,5],cudevicegetcount:7,where:[9,1,3,6],valid:[],view:0,set:[1,3,4,5,7,9,12],attachmentposit:7,docreleas:[],"float":[3,7],sear:3,frame:[],displai:7,graphicscontextmanag:7,d3d_driver_type_hardwar:7,see:[9,12],sed:12,einvalid:7,result:[9,3,6,5,7],sqraxishalflength:9,reserv:[2,1,5],improv:[6,7],xxxxx:12,close:1,mergeacceler:9,closer:3,setangularinertia:7,pxerrorcallback:7,collisiondist:1,correctli:9,sphere_cent:3,vari:7,boundari:4,dll:10,written:[5,3],won:9,"2r_1r_0":9,dynam:[6,7],movingaverag:6,between:[9,1,3,7],prebuilt:12,theta:3,awai:[1,4],previous:7,approach:9,across:7,t_2:9,altern:5,triplet:5,extend:9,coeffici:[9,3,7],nvclothdestroyfactori:7,job:12,otherwis:3,solv:[9,3,7],group:7,come:7,inertia:7,addit:[4,3,6,7],mstretchlimit:7,both:[9,3,7],uns:[],last:[5,1,3,7],planesr:7,someth:7,howev:9,equal:[3,7],against:[9,1,4],nearbi:1,etc:7,math:[],instanc:[3,7],equat:[9,3],context:7,let:7,whole:[1,7],multithreadedsolverhelp:6,comment:[9,3],springi:7,simpli:12,point:[9,5,12,7,3],schedul:5,int32_t:7,decrefcount:7,chmod:12,addcloth:[6,7],featur:[0,3,7,10],versionbold:[],"4asr_0":9,sentinel:1,trianglecount:7,assum:9,duplic:[1,5],size:[5,1,3,7],sucessfulli:[],coupl:7,engwiki:9,aarch64:12,decreach:[],damp:[3,7],infinit:9,devic:7,due:[3,6,7],integrateparticl:3,mark:[9,1,4],accumul:9,trigger:7,p_0:[9,3],modif:2,trajectori:9,inv:3,quickli:1,stretchlimitc:3,sphererang:7,particle_position0:3,studio:[12,6],clothfabricphasetyp:7,imag:9,appli:[9,3,7],sqdeltalegnth:9,unnecessarili:9,ani:[2,4,7],assert:[6,7],coordin:[1,7],zero:[3,7],togeth:7,oneminustoi:9,tangenti:9,nvclothcreatefactorydx11:7,getmotionconstraint:7,those:[9,4],"case":[9,12,7,3],look:[9,7],align:[9,3,7],properti:2,mcloth:7,batch:[5,6],air:[3,6,7],log_2:3,defin:[3,7],sln:12,asr_0:9,abov:[1,3,6,7,9,12],error:[3,12,6,7],"2q_0q_1":9,"2r_0r_1":9,anchor:3,loop:[1,5],subsect:9,propag:3,forc:[9,3,7],stiffnessfrequ:3,togglecont:3,helper:[5,7],mcompressionlimit:7,getnumconvex:7,influenc:[3,7],use_dx11:12,physic:[6,7],particle_posit:3,"default":[12,7],itself:7,r_2:9,setsolverfrequ:7,race:5,seen:3,quadrat:9,rid:[],primit:7,mset:3,develop:[0,12],paw:3,perform:[6,7],make:[1,3,5,6,7,9,12],belong:3,cross:9,sqrt:[9,3],"while":[9,3,7],binari:[9,12],report:7,html:12,pad:5,split:9,freed:7,largest:1,dimensionless:7,fill:[9,5,7],conflict:5,higher:7,clear:7,safe:7,http:12,x86:12,t4f:[9,1],again:[9,7],nvclothext:7,effect:7,kit:12,getnorm:7,temporari:4,user:10,mani:[1,3,7],robust:0,"4m_":9,productshortnam:[],implement:[3,7],expand:9,sqrlength:3,defenit:[],lower:[1,4,7],task:10,beginsimul:7,older:6,com:12,usual:[3,7],know:7,without:[2,1,3,7,5],command:12,"_nvidia":[],packman:12,interpol:[9,3],model:[3,6],powf:3,dimension:3,left:[9,3],explan:3,distanc:[],identifi:1,getnumphas:7,a_1:9,a_0:9,deltax:7,collidecon:9,deltaz:7,exclud:12,obtain:[9,1,12],"4th":7,indic:[9,1,4,3,7],mvelxyz:9,shape:[6,7],"2q_1q_0":9,simd:6,touch:9,deltai:7,rest:[9,1,3,7],roughli:9,speed:[3,6],yet:6,ps4:6,mstiff:7,motionconstraint:7,struct:7,easi:[0,7],r_i:9,recip:9,productnameversionbold:[],makefil:12,except:12,littl:0,add:7,divis:3,r13b:12,bank:5,densiti:[3,6,7],input:5,match:3,hat:3,euler:3,r_m:9,bin:[1,12],applic:[0,7],productnamebold:[],sap:9,around:1,format:1,meshdesc:7,currentparticlekei:1,productnamedocreleasebold:[],bia:[1,3,7],game:[0,7],tabl:5,sphere_radiu:3,pop:3,vacuum:7,pxvec4:[3,7],world:[4,7],bit:[9,1,12,7],d3d_feature_level:7,exlus:[],you:[12,7],pxvec3:7,insert:7,logdamp:3,like:[9,5,12,7,3],specif:[3,1,12],arbitrari:[1,7],cdot:[9,1,3],realtim:0,manual:[1,7],stiffnessmultipli:3,xbox:6,api:6,necessari:7,use_cuda:12,corpor:2,continuo:[],resiz:5,inter:[],page:[0,3],depend:[3,1,12,7],calculatefrictionimpuls:[],www:[],right:[9,3,2],often:[5,3,7],deal:4,simplifi:[9,7],spring:7,compat:7,some:[9,4,12,7,3],back:[4,7],certain:12,s_ok:7,descret:[],contin:[],sampl:[12,6],diff:1,home:0,sizeof:7,successfulli:5,librari:[12,6,10],distribut:[2,12],mclothindic:4,scale:6,simdwidth:5,mattachmentvertexoriginalposit:7,avoid:[9,5,6,7],setlinearinertia:7,definit:9,overlap:[9,4],rapidli:7,circ:3,linux64:12,leav:9,condit:[9,3,5],dat:[],complic:7,symbol:3,unwant:7,spherecent:[9,7],core:10,particular:3,object:[4,7],tmin:9,constrainsepar:3,reach:[3,7],locate_win8sdk:12,swcollis:[9,1],agreement:2,symlink:12,c_0p_1:9,broken:7,step:[9,3,7],durat:9,stride:7,offset:[9,1,3],subtract:1,don:[9,1,5],d3d11_sdk_version:7,stage:7,ndk:[12,6],independend:[],particlecount:7,constraint:[],deltatim:7,toolchain:12,createsolv:7,phaseconfig:[3,7],shield:6,simul:6,stretch:[3,7],disclosur:2,cuda:[5,12,6,7],neighbor:1,span:9,dependend:[],t_3:9,underwat:7,t_1:9,disabl:[9,12,6,7],produc:5,d3d_feature_level_11_0:7,routin:9,own:[1,7,10],liveli:7,p_0p_1:9,xyz:[9,3,7],within:[9,1,7],bound:[9,1,4,5],automat:12,particle_position1:3,diagon:5,nullptr:7,getnumspher:7,framer:3,setspher:7,vertexarrai:7,notat:3,ensur:[9,1,3,7,5],mphaseindex:7,destructor:7,precomput:9,your:[12,7],setmotionconstraintscalebia:7,manag:7,els:3,inclus:5,processor:12,triangl:[5,6,7,9,10,11,3],fabric:10,wai:[9,4,3,7,5],area:[3,7],buildprojectsosx:12,support:[12,6,10],rotat:3,depenetr:9,fast:[0,6,7],createfabr:7,avail:1,start:[1,5,6,7,9,3],adjac:5,interfac:[0,6,7],low:0,twice:9,overhead:0,strictli:2,chunk:6,lowest:9,iterationst:3,properli:7,setfluiddens:6,form:3,enough:1,framrat:[],epsilon:[9,1,3],basic:[1,3],refcount:7,oscil:7,a_1a_:9,cloth:6,state:3,link:6,newer:12,scope:7,renam:12,line:[9,12],highest:9,"true":4,bug:6,sdk:[12,6],info:9,path_to_android_ndk:12,a_l:9,numparticl:3,tetherlength:3,cleanup:7,locate_cmak:12,possibl:[1,5,6],whether:12,access:[0,1,4],maximum:[9,3],less:[9,3,7],inaccuraci:3,below:[9,1,3,7],limit:[3,7],arm64:[12,6],unlock:7,cit:9,getnumcapsul:7,csigg:9,problem:[9,3,7],mask:[9,7],motion:[],r_3:9,constant:[9,3],creat:[3,12,7,5],"int":7,flow:[3,6],dure:9,convex:[11,7],dotprevprev:9,doesn:[9,6,7],repres:7,decreas:7,file:12,setrot:7,proport:9,check:[9,1,3,7],flt_max_exp:3,triangler:7,incorrect:6,constrainmot:3,collid:[9,1,3,7],cmake:[12,6],buffer:1,plausibl:7,setdamp:[3,7],nan:7,detail:[9,1,3,7],cuctxdestroi:7,build:[12,6],other:[9,1,4,3,7],capsuleindic:7,generateprojectsosx:12,setphaseconfig:7,test:[1,3,4,6,9,12],generateprojectslinux:12,buildprojectslinux:12,firstkei:1,p_0c_1:9,p_0c_0:9,lowerbound:1,numsweepcel:1,regardless:7,constraintmot:3,center:[9,3,7],vertex:[9,7],"return":7,pxasserthandl:7,getnumplan:7,overlapbound:4,polynomi:9,drag:6,gridscal:1,track:[9,5],q_1:9,q_0:9,halfb:9,nvclothcreatefactorycpu:7,sqrtd:9,cmakegenerateandroid:12,stai:[9,7],reduc:[9,3,7],licensor:2,id3d11devicecontext:7,featurelevelresult:7,cooker:7,directori:12,snippet:7,flag:6,rule:7,them:7,discrimin:9,lift:6,ignor:9,"_product":[],potenti:7,settriangl:7,onc:1,"export":12,adac:[],cpu:[5,6,7],intercollis:4},objtypes:{},objnames:{},filenames:["index","CollisionDetection/SelfCollision","CopyRight/Index","Solver/Index","CollisionDetection/InterCollision","Cooking/TripletScheduler","ReleaseNotes/index","UserGuide/Index","Cooking/Index","CollisionDetection/SphereCapsuleCollision","Modules/Index","CollisionDetection/Index","Compiling/index"],titles:["NvCloth","Self Collision","NVIDIA Copyright Notice","Internal solver function/algorithm documentation","Inter Collision","TripletScheduler","Release Notes","User Guide","Internal cooking documentation","Sphere Capsule collision detection","Modules","Internal collision detection documentation","Compiling"],objects:{},titleterms:{distanc:[3,7],edg:3,rang:1,capsul:9,simd:5,tripletschedul:5,copyright:2,window:12,local:7,adjacencyqueri:5,anim:7,initi:7,grid:1,cook:8,stiff:3,troubleshoot:7,solver:[3,7],dissapear:[],separ:3,common:7,inter:4,compil:12,calculatefrictionimpuls:9,frame:7,intern:[8,11,3],respons:1,tether:[3,7],todo:11,particl:[1,3],scale:7,space:7,broad:4,bla:[],factori:7,integr:3,kei:1,gener:9,usag:7,extens:10,releas:6,log:3,about:0,constraint:[3,7],drag:7,simul:[3,7],motion:7,nvcloth:[0,10],user:7,acceler:[9,1,4],overview:[8,11,1,4,3],modul:[8,11,10],sweep:1,linux:12,guid:7,unit:7,differ:[8,11,4],fabric:[3,7],compon:3,attach:7,more:0,"function":3,notic:2,cloth:7,lift:7,retriev:7,slack:3,setup:[1,7],properti:7,structur:[9,1,4,3],charact:7,learn:0,sort:1,sphere:9,cone:9,invmass:3,disappear:7,self:[1,4],note:6,collis:[11,9,1,4,7],librari:7,android:12,document:[8,11,3],singl:7,mac:12,detect:[11,9,1,4,7],warp:5,phase:4,collideparticl:9,data:[3,7],algorithm:3,part:7,nvidia:2,ccd:9,wind:[3,7]}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{represent:2,all:[1,2,3,4,6,7,9,10,12],code:[6,7,8,2,11,5],edg:[],orthogon:5,skip:[2,7],lack:6,yellow:1,minusa:2,signific:1,sleep:5,per:[1,5,7],capsul:[],skin:[2,7],follow:[5,12,4,7,2,3],calculatepotentialcollid:4,mupper:4,minusk:2,content:[8,11],"const":7,sensit:7,adjacencycount:12,negativescal:2,setselfcollisiondist:1,program:3,gsimd4fon:2,those:[2,4],q_0:2,text:[2,3,5],vcxxwinxx:3,sens:2,setfrict:7,introduc:6,certain:3,sourc:5,everi:[2,1,4],lrg:5,reproduct:9,far:2,offlin:10,strechlimitc:5,vertex:[2,7],assimp:3,volum:[2,4,5,7],friction:[2,6,7],setplan:7,fall:2,veri:[2,4,7],affect:[5,6],ajust:5,brows:0,tri:[1,4],pbw:5,info:2,dampen:7,doesn:[2,6,7],stiff:[],did:6,list:[5,4,12,7,10],prefix:12,iter:[2,4,5,7],readabl:2,"try":7,tunnel:7,race:12,swcollis:[2,1],d_o:2,sqdeltalegnth:2,small:[2,5],setdragcoeffici:7,freed:7,dir:5,setmotionconstraintstiff:7,upper:1,c_j:5,smaller:[1,5,7],p_j:5,unnorm:5,mdeltaxyz:2,natur:7,compens:5,direct:[2,5,7],transform:[4,5,7],batch:[12,6],past:2,particle_invmass:5,second:[2,5],cost:2,design:0,pass:7,download:3,massscal:5,p_t:5,setstiffnessfrequ:5,currentparticlekei:1,index:[3,1,12,7,5],lastkei:1,hide:[],r15c:3,neg:[2,7],section:[2,12,7,5],prevradiu:2,abl:3,brief:10,access:[0,1,4],delet:7,version:3,run:[2,3,7],linux64:3,intersect:[2,1,4,7],newer:3,"new":[5,12,6,7],impuls:[2,5,7],method:[2,6,7],movement:[2,5,7],cull:[2,1,4],mlower:4,intellectu:9,hash:1,mergeacceler:2,locate_cuda:3,cellcount:1,curradiu:2,getsimulationchunkcount:7,never:2,dotcurcur:2,onli:[1,4,6,7,2,12],here:[2,5,7,10],shape:[6,7],tangent:2,sortedindic:4,trunk:3,path:3,along:[2,1,7],vertic:[5,7],p_2:5,sinc:7,valu:[2,1,12,7,5],p_1:[2,5],box:4,x86_64:3,convert:[2,1],graviti:7,shift:7,anymor:6,larger:1,bot:2,precis:7,bitmask:2,r12b:[3,6],setposit:7,pick:[1,5,7],clearmotionconstraint:7,chang:[2,3,6,7],narrow:4,magnitud:2,overrid:6,eshear:7,via:6,sskeletonwidth:2,triplet:12,extra:[5,12],timestep:5,approxim:2,sphereradiu:[2,7],linearli:[2,6],c_1:[2,5],c_0:[2,5],c_2:[2,5],clothfabriccook:7,sr_0:2,integrateparticl:5,instabl:[5,7],instal:3,decrement:12,total:12,unit:[],from:[5,1,2,3,4,6,7,9,10,12],describ:[1,5,7,8,2,11,12],would:[2,6],memori:[4,7],fill:[2,12,7],give:[5,4,7,2,10,12],regist:2,two:[2,1,7],madjac:12,next:[2,1,3,12,5],live:6,solvefabr:5,call:7,shortest:1,taken:[1,7],suppos:1,type:[5,7],tell:7,reorder:12,more:[],sort:[],flat:[2,6],desir:7,settetherconstraintstiff:[5,7],c_i:2,detail:[2,1,5,7],relat:[8,9,10],p_0p_1:2,finit:2,warn:6,packman:3,visual:[3,6],mparticleindic:4,c_t:5,"4ac":2,known:[1,6],ebend:7,hold:7,oldradiu:7,logarithm:5,madjacencyindeci:12,none:6,graphic:7,left:[2,5],stretchlimit:5,local:[],prepar:10,work:[6,7,8,2,11,5],uniqu:12,swcloth:12,remain:[1,5,7],pxquat:7,vertexcount:7,can:[1,5,4,7,2,10,12],particledelta:2,collidespher:2,d3d11:7,root:3,veloc:[2,5,7],tripletschedul:[],control:[3,7],nearest:5,overlapbound:4,process:[3,1,12],lock:7,share:[12,7],sln:3,gsimd4fepsilon:2,high:[5,6],sphere:[],minimum:[2,1,4],proprietari:9,bend:5,want:[1,5,7,10],setvirtualparticl:12,setconvex:7,simul:[],occur:2,getparticl:4,alwai:7,differenti:[5,7],multipl:[5,4,12,6,7],parralel:12,divid:[2,1,12,7,5],divis:5,how:[5,1,12,7],lift:[],low:0,env:3,instead:[1,5,4,7,2,12],q_0q_1:2,config:[5,7],sin:[2,5],updat:[5,7],product:[0,2],collisionshap:7,frac:[2,5],clothdata:1,referenc:12,teleport:[6,7],tetherconstraintstiff:5,max:5,after:[2,4,12,7,5],surfac:[2,5],usabl:2,constraint:[],diagram:[2,1],befor:[2,3,7],mesh:[1,7,10],generatecon:2,buildacceler:2,mai:[5,7],end:[2,3,7,5],data:[],parallel:[3,12],averag:2,stabil:7,alloc:[12,6,7],studio:[3,6],setwindveloc:7,interpol:[2,5],"6th":2,createcloth:7,favorit:3,correspond:[2,7],element:[5,12],issu:[6,7],inform:[5,7],"switch":[6,7],combin:[2,1,12,7,5],allow:[6,7],nvidia:[],exclus:12,attachmentvertic:7,"253x253":1,when:[1,5,6,7,2,12],order:[2,1,12,7,5],wind:[],vc14win64:3,oper:1,p_0c_0:2,help:[5,3,7],v_r:2,routin:2,gradual:7,over:[2,4,7],move:[2,5,6,7],becaus:[2,1,5],meter:7,cross:2,sphere_radiu:5,nv_cloth_delet:7,paper:5,through:[2,12,7],sqrt:[2,5],evert:7,v_l:2,still:[5,12,7],pointer:1,directx:6,paramet:[5,6,7],snippet:7,typedef:6,outer:2,render:7,apex:6,fix:[5,3,6,7],constrainsepar:5,better:[6,7],platform:[5,3,6,7],pend:7,mrestvalu:5,requir:[1,3,7],bypass:10,clothimpl:[5,6],featurelevel:7,might:[5,3,7],mise:6,recip:2,non:[2,1,7],good:[2,7],crash:6,thei:[2,1,7],handl:[2,7,10],"2q_0":2,deiniti:7,sooner:5,number:[6,7],"break":7,mappedrang:7,larg:[1,5,7],now:[1,4,6,7,2,12],discuss:2,bigger:2,makefil:3,somewher:7,name:5,anyth:7,edit:3,simpl:7,solver:[],mphaseindex:7,separ:[],easili:7,mode:6,ratio:1,each:[1,5,4,7,2,12],debug:[3,6],ndk:[3,6],penetr:[2,7],complet:6,mtriplet:12,mean:[5,7],clamp:[2,7],prohibit:9,devrel:3,cudacontext:7,weight:5,replac:[5,7],individu:[1,4,12,7],continu:[2,1,12,7],realli:2,playstat:6,ensur:[2,1,12,7,5],dx11:[3,6,7],"static":[6,7],connect:[5,3,7],someth:7,fluctuat:5,happen:[2,5],out:[12,7],variabl:[2,1,3],getnumcloth:6,won:2,space:[],goe:5,open:3,profil:7,rewrit:[2,5],adjust:[5,7],suitabl:0,rel:[2,1,7],internet:3,hardwar:6,formula:2,gridbia:1,correct:[2,12,6,5,7],red:2,mphase:5,model:[5,6],log2:5,linear:[2,7],insid:[2,3,12,6,7],advanc:7,midpoint:2,inclus:12,selfcollideparticl:5,reason:[1,5],base:[5,1,4,3,7],discrimin:2,removecloth:7,releas:[],org:3,"byte":[1,7],compressionlimitc:5,refer:[2,5,7],bash:3,care:[4,7],setliftcoeffici:7,reusabl:7,r_0r_1:2,thread:7,angl:5,frequenc:[5,7],could:[12,6,7],omit:2,put:3,keep:[1,5,4,7,2,12],recov:[5,7],thing:7,length:[2,1,5,7],enforc:5,place:[3,12],outsid:5,nvcloth:[],retain:9,onto:2,licens:9,first:[1,5,4,7,2,3],origin:[5,7],softwar:9,obviou:4,curesult:7,cuda_success:7,arrai:[5,1,4,12,7],independ:5,scene:[6,7],sometim:7,pop:5,alreadi:[6,7],done:[2,1,4,12,5],least:[1,12,7],setcapsul:[6,7],thick:2,miss:7,primari:2,mpaddedtriplet:12,given:[2,1,12,5],optim:[1,12,6],script:3,exp2:2,interact:0,flag:6,system:7,construct:[2,1,7],toi:2,halfb:2,circl:2,time:[2,12,7,5],gpu:[12,6,7],dt1:5,dt0:5,store:[1,5,4,7,2,12],too:[1,5,7],dampexpon:5,getnumtriangl:7,option:[3,7],endsimul:7,namespac:6,tool:6,copi:[3,12],lower:[1,4,7],plane:[11,2,12,7,5],part:[],enclos:4,mostli:5,quad:[7,10],exactli:[2,5],nvclothcreatefactorycuda:7,than:[2,1,12,7],ehorizont:7,f_d:5,stiffnessc:5,prune:2,provid:[0,1,7,10],remov:[6,7],d3d11createdevic:7,rate:[2,5,7],horizont:[5,7],project:[2,3],matter:7,reus:[2,1,5],includ:[5,3,7,10],were:[2,6],posit:[2,1,5,7],amount:[1,12],dxcontextmanagercallback:7,expf:5,lowest:2,vector:[5,7],comput:2,behavior:[5,6,7],nicer:1,explicit:5,c_0c_1:2,getclothlist:6,ani:[9,4,7],nvclothcookfabricfrommesh:7,dash:2,thereto:9,constrainteth:5,have:[2,12,7,5],tabl:12,need:[5,1,12,4,7,2,3],clothmeshdesc:7,incompat:6,border:2,caus:[5,6,7],rmin:2,strength:7,engin:7,squar:12,lib:[3,10],min:[2,1,5],r_p:2,destroi:7,self:[],especi:[6,7],mid:2,accuraci:7,note:[],also:[2,1,12,7,5],discret:2,take:4,which:[1,5,4,6,7,2,10,12],environ:3,aabb:[1,6],singl:[],clearinertia:7,compat:7,begin:[2,1,12,7,5],sure:3,android_ndk_root:3,thi:[5,1,2,3,4,7,8,9,10,11,12],though:[2,1,5],multipli:[2,5,7],dxdevic:7,previou:[2,1,5,7],compress:7,what:2,react:[6,7],most:[5,7],beta:6,regular:[2,1],cucontext:7,specifi:[1,5,7],rho:5,pair:[2,1,4,5,7],alpha:2,cap:2,ltoi:2,"class":[12,7],worldspac:4,cmakegenerateal:3,intercollis:4,r_0:2,r_1:2,clear:7,later:[3,12,7],cover:1,collisionmask:2,doe:[2,1,4,5,7],settetherconstraintscal:7,runtim:[10,6,7],determin:[2,4,12],occasion:5,constrain:[5,7],impulseaccumul:2,blend:7,sum:[2,12],dot:2,slope:2,settodefault:7,radix:1,getcurrentparticl:7,show:7,opposit:5,xcode:[3,6],beginsimul:7,stiffnessexpon:5,radiu:[2,5,7],getnumcapsul:7,directli:[2,1,4,7,10],concurr:7,dxdevicecontext:7,unchang:7,threshold:5,unfinish:5,find:12,setintercollisiondist:4,impact:2,current:[2,1,5,7,10],id3d11devic:7,slow:[1,5],locat:[12,7],execut:[2,3,7],simulatechunk:7,explain:[2,5],configur:[3,7],solut:[5,3],"2r_0":2,t4f:[2,1],computebound:[1,5],experiment:6,black:2,factor:[5,7],sierra:6,physx:[5,6,7],folder:3,libdev:3,dotprevcur:2,count:[2,1,12,7,5],unus:6,variou:3,get:[5,7],pxallocatorcallback:7,stomp:12,express:9,stop:2,fluid:[5,6,7],newradiu:7,bucketmask:1,getnumplan:7,cannot:[1,4,12,7],phasetypeinfo:7,longest:1,progress:5,increas:[5,7],sqrconehalflength:2,clothbound:4,target:[5,3,7],mvelxyz:2,bat:3,enabl:[2,3,6,7],artist:7,a_0a_:2,gust:7,v8a:[3,6],"2m_":2,f_l:5,setlinearinertia:7,contain:[5,1,12,7,2,3],cudevicegetcount:7,where:[2,1,5,6],view:0,set:[5,1,12,4,7,2,3],sampl:[3,6],sear:5,frame:[],maximum:[2,5],graphicscontextmanag:7,d3d_driver_type_hardwar:7,see:[2,3],sed:3,einvalid:7,result:[2,12,6,5,7],sqraxishalflength:2,reserv:[9,1,12],improv:[6,7],xxxxx:3,particl:[],deriv:2,closer:5,setangularinertia:7,pxerrorcallback:7,collisiondist:1,correctli:2,sphere_cent:5,vari:7,boundari:4,dll:10,enough:1,devicecount:7,"2r_1r_0":2,dynam:[6,7],movingaverag:6,between:[2,1,5,7],prebuilt:3,theta:5,awai:[1,4],settransl:7,approach:2,across:7,altern:12,oscil:7,attachmentposit:7,extend:2,osx64:3,coeffici:[2,5,6,7],createfabr:7,flow:[5,6],condit:[2,12,5],nvclothdestroyfactori:7,job:3,vc14winxx:3,solv:[2,5,7],group:7,come:7,inertia:7,addit:[4,5,6,7],mstretchlimit:7,both:[2,5,7],locate_cmak:3,last:[5,1,12,7],planesr:7,avoid:[2,12,6,7],similar:[2,4,7],howev:2,equal:[5,7],against:[2,1,4],nearbi:1,etc:7,instanc:[5,7],equat:[2,5],context:7,let:7,whole:[1,7],scope:7,multithreadedsolverhelp:6,comment:[2,5],springi:7,simpli:3,point:[2,3,12,7,5],within:[2,1,7],schedul:12,int32_t:7,decrefcount:7,sweep:[],chmod:3,addcloth:[6,7],written:[5,12],cuctxdestroi:7,"4asr_0":2,sentinel:1,trianglecount:7,assum:2,duplic:[1,12],coupl:7,engwiki:2,aarch64:3,simdwidth:12,damp:[5,7],infinit:2,devic:7,invers:[5,7],setspher:7,mark:[2,1,4],accumul:2,trigger:7,p_0:[2,5],modif:9,trajectori:2,dure:2,quickli:1,radii:[2,7],sphererang:7,stride:7,clothfabricphasetyp:7,imag:2,densiti:[5,6,7],search:0,unnecessarili:2,argument:[3,7],assert:[6,7],coordin:[1,7],zero:[5,7],togeth:7,oneminustoi:2,tangenti:2,nvclothcreatefactorydx11:7,getmotionconstraint:7,present:[6,7],"case":[2,3,7,5],look:[2,7],influenc:[5,7],align:[2,5,7],properti:[],mcloth:7,setgrav:7,air:[5,6,7],log_2:5,defin:[5,7],calcul:[1,5,4,6,7,2,12],asr_0:2,mindic:5,error:[5,3,6,7],"2q_0q_1":2,"2r_0r_1":2,anchor:5,loop:[1,12],subsect:2,propag:5,use_dx11:3,stiffnessfrequ:5,togglecont:[],helper:[12,6,7],mcompressionlimit:7,almost:6,getnumconvex:7,made:2,initializenvcloth:7,them:7,physic:[6,7],particle_posit:5,itself:7,r_2:2,setsolverfrequ:7,abov:[1,5,6,7,2,3],quadrat:2,mset:5,develop:[0,3],author:6,perform:[6,7],make:[5,1,12,6,7,2,3],belong:5,x64:6,same:[2,12,7,5,10],"while":[2,5,6,7],binari:[2,3],report:7,html:3,pad:12,split:2,largest:1,automat:3,paw:5,dimensionless:7,probabl:[5,7],start:[1,5,6,7,2,12],conflict:12,higher:7,safe:7,http:3,x86:3,unwant:7,again:[2,7],nvclothext:7,blue:2,effect:7,kit:3,getnorm:7,temporari:4,user:[],mani:[1,5,7],extern:3,robust:0,particle_position1:5,bia:[1,5,7],respons:[],implement:[5,6,7],expand:2,sqrlength:5,usemultipli:5,task:10,undesir:7,older:6,cuctxcreat:7,com:3,usual:[5,7],well:6,know:7,without:[9,1,12,7,5],exampl:[3,12,7],command:3,uint32_t:[12,7],choos:3,everyth:7,powf:5,dimension:5,ubuntu:6,cmakegenerateproject:3,explan:5,distanc:[],identifi:1,getnumphas:7,a_1:2,a_0:2,deltax:7,collidecon:2,deltaz:7,exclud:3,obtain:[2,1,3],"4th":7,indic:[2,1,4,5,7],seen:5,should:[3,12,7,5],particleposit:7,"2q_1q_0":2,licensor:9,touch:2,deltai:7,rest:[2,1,5,7],roughli:2,speed:[5,6],yet:6,ps4:6,mstiff:7,motionconstraint:7,struct:7,easi:[0,7],r_i:2,r_3:2,iterationst:5,had:6,except:3,littl:0,add:7,other:[2,1,4,5,7],r13b:3,bank:12,primit:7,els:5,path_to_android_ndk:3,match:5,hat:5,euler:5,build:[3,6],bin:[1,3],applic:[0,7],numteth:5,sap:2,around:1,format:1,meshdesc:7,fast:[0,6,7],"4m_":2,game:[0,7],cell:[2,1],dxcontextmanagercallbackimpl:7,vacuum:7,pxvec4:[5,7],world:[4,7],bit:[2,1,3,7],a_l:2,you:[3,7],pxvec3:7,insert:7,ignor:2,like:[2,3,12,7,5],specif:[5,1,3],arbitrari:[1,7],cdot:[2,1,5],realtim:0,manual:[1,7],stiffnessmultipli:5,xbox:6,api:6,necessari:7,use_cuda:3,corpor:9,resiz:12,architectur:6,r_m:2,manag:7,depend:[5,1,3,7],right:[9,5,2],old:6,often:[5,12,7],deal:4,simplifi:[2,7],flt_max_exp:5,triangl:[5,6,7,2,10,11,12],numsweepcel:1,some:[2,4,3,7,5],back:[4,7],global:7,s_ok:7,llvm:6,csigg:2,mask:[2,7],diff:1,home:0,sizeof:7,successfulli:12,librari:[],distribut:[9,3],mclothindic:4,scale:[],mattachmentvertexoriginalposit:7,highest:2,size:[5,1,12,7],definit:2,overlap:[2,4],rapidli:7,circ:5,compressionlimit:5,leav:2,"__t100":6,visit:0,complic:7,constraintmot:5,spherecent:[2,7],core:10,particular:5,object:[4,7],tmin:2,reach:[5,7],locate_win8sdk:3,updatesleepst:5,agreement:9,symlink:3,interfac:[0,6,7],c_0p_1:2,broken:7,step:[2,5,7],durat:2,although:5,offset:[2,1,5],renam:3,subtract:1,d3d11_sdk_version:7,stage:7,appli:[2,5,7],about:[],inter:[],callback:7,particlecount:7,applywind:5,deltatim:7,toolchain:3,createsolv:7,shield:6,firstkei:1,page:[0,5],stretch:[5,7],disclosur:9,cuda:[3,12,6,7],neighbor:1,t_2:2,t_3:2,underwat:7,t_1:2,disabl:[2,3,6,7],produc:12,d3d_feature_level_11_0:7,setcentrifugalinertia:7,own:[1,7,10],liveli:7,centimet:7,d3d_feature_level:7,stretchi:[5,7],xyz:[2,5,7],"float":[5,7],bound:[2,1,4,12],particle_position0:5,due:[5,6,7],diagon:12,nullptr:7,been:[2,7],vertexarrai:7,equival:4,framer:5,destructor:7,precomput:2,your:[3,7],setmotionconstraintscalebia:7,sqrtd:2,straightforward:7,accordingli:7,processor:3,span:2,fabric:[],wai:[2,4,12,7,5],area:[5,7],buildprojectsosx:3,support:[3,6,10],rotat:[5,6],depenetr:2,"long":7,"8x8x8":2,avail:1,getnumspher:7,adjac:12,appl:6,restlength:5,editor:3,spring:7,twice:2,overhead:0,strictli:9,chunk:6,"function":[],properli:7,setfluiddens:6,form:5,forc:[2,5,7],epsilon:[2,1,5],basic:[1,5],refcount:7,idea:7,a_1a_:2,cloth:[],state:5,link:6,triangler:7,delta:[2,1,5,7],don:[2,1,12],line:[2,3],level:0,"true":4,bug:6,sdk:[3,6],reset:7,notat:5,numparticl:5,tetherlength:5,input:12,consist:7,possibl:[1,12,6],whether:3,displai:7,directori:3,below:[2,1,5,7],limit:[5,7],arm64:[3,6],unlock:7,cit:2,pxprofilercallback:7,otherwis:5,problem:[2,5,7],even:[2,5,7],motion:[],featur:[0,5,7,10],constant:[2,5],creat:[3,12,7,5],"int":7,descript:10,inv:5,convex:[11,7],dotprevprev:2,stretchlimitc:5,mstiffnessmultipli:7,repres:7,decreas:7,file:3,setrot:7,proport:2,check:[2,1,5,7],piw:5,incorrect:6,constrainmot:5,collid:[2,1,5,7],cmake:[3,6],nx0:3,buffer:1,plausibl:7,setdamp:[5,7],nan:7,green:2,virtual:6,"default":[3,7],cleanup:7,capsuleindic:7,generateprojectsosx:3,normal:[2,5],setphaseconfig:7,test:[2,1,4,3,6],generateprojectslinux:3,buildprojectslinux:3,logdamp:5,p_0c_1:2,multiplierc:5,lowerbound:1,regardless:7,symbol:5,center:[2,5,7],phaseconfig:[5,7],"return":7,pxasserthandl:7,gcc:6,polynomi:2,drag:[],gridscal:1,track:[2,12],q_1:2,less:[2,5,7],previous:7,doubl:[2,5],nvclothcreatefactorycpu:7,cmakegenerateandroid:3,stai:[2,7],reduc:[2,5,7],axi:[2,1,4],id3d11devicecontext:7,featurelevelresult:7,algorithm:[],cooker:7,inaccuraci:5,pseudo:5,indirectli:7,rule:7,microsoft:3,hresult:7,close:1,mass:[2,5,6,7],potenti:7,settriangl:7,onc:1,"export":3,mathrm:5,cpu:[12,6,7],stick:2},objtypes:{},objnames:{},filenames:["index","CollisionDetection/SelfCollision","CollisionDetection/SphereCapsuleCollision","Compiling/index","CollisionDetection/InterCollision","Solver/Index","ReleaseNotes/index","UserGuide/Index","Cooking/Index","CopyRight/Index","Modules/Index","CollisionDetection/Index","Cooking/TripletScheduler"],titles:["NvCloth","Self Collision","Sphere Capsule collision detection","Compiling","Inter Collision","Internal solver function/algorithm documentation","Release Notes","User Guide","Internal cooking documentation","NVIDIA Copyright Notice","Modules","Internal collision detection documentation","TripletScheduler"],objects:{},titleterms:{distanc:[5,7],edg:5,acceler:[2,1,4],capsul:2,simd:12,tripletschedul:12,copyright:9,window:3,local:7,adjacencyqueri:12,anim:7,initi:7,grid:1,cook:8,solver:[5,7],troubleshoot:7,stiff:5,calculatefrictionimpuls:2,separ:5,integr:5,inter:4,compil:3,frame:7,intern:[8,11,5],respons:1,tether:[5,7],todo:11,particl:[1,5],scale:7,space:7,broad:4,factori:7,common:7,kei:1,gener:2,usag:7,extens:10,releas:6,log:5,about:0,constraint:[5,7],mac:3,simul:[5,7],motion:7,nvcloth:[0,10],rang:1,overview:[8,11,1,4,5],modul:[8,11,10],sweep:1,linux:3,guid:7,unit:7,differ:[8,11,4],fabric:[5,7],compon:5,attach:7,warp:12,more:0,"function":5,notic:9,cloth:7,lift:7,retriev:7,slack:5,setup:[1,7],properti:7,structur:[2,1,4,5],charact:7,learn:0,sort:1,sphere:2,cone:2,invmass:5,disappear:7,self:[1,4],note:6,collis:[11,2,1,4,7],librari:7,android:3,document:[8,11,5],singl:7,drag:7,detect:[11,2,1,4,7],user:7,phase:4,collideparticl:2,data:[5,7],algorithm:5,part:7,nvidia:9,ccd:2,wind:[5,7]}}) \ No newline at end of file -- cgit v1.2.3