ipc-toolkit : Les requêtes de collision comme frontière de bibliothèque
ipc-toolkit fournit des composants géométriques pour la simulation avec contacts. Ce fork contient maillages de collision, candidats, détection continue et énergies de contact. Une simulation externe conserve la gestion du temps et de la résolution.
Langages du dépôtC++ 94.46%5
Parts calculées à partir des octets GitHub Linguist.
| Langage | % | Octets |
|---|---|---|
| C++ | 2 400 346 | |
| CMake | 75 800 | |
| Python | 53 463 | |
| Cuda | 9 561 | |
| Dockerfile | 2 051 |
Aperçu
Pourquoi il existe
Boîte à outils d'ingénierie pour la gestion du contact et de la friction dans les simulations par éléments finis.
Cas d’usage
Mécanique du contact continu non linéaire pour moteurs physiques.
Démarrage
Ces commandes viennent de la documentation du dépôt. Elles n’ont pas été exécutées pendant cette revue.
pip install ipctkpip install git+https://github.com/ipc-sim/ipc-toolkitpip install .python -c "import ipctk"mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DIPC_TOOLKIT_BUILD_PYTHON=ON ..
make -j$(nproc)Références du dépôt
Extraits des guides du dépôt, dans leur langue d’origine. Les liens ouvrent la version du code consultée.
Prérequis et premier essai
Quick Start
README.md
Installation
python/README.md
Installation
docs/PYPI_README.md
Développement et contributions
Contributing
README.md
This project is open to contributors! Contributions can come in the form of feature requests, bug fixes, documentation, tutorials, and the like. We highly recommend filing an Issue first before submitting a Pull Request. Simply fork this repository and make a Pull Request! We would appreciate:
- Implementation of new features
- Bug Reports
- Documentation
- Testing
Contributing
docs/PYPI_README.md
This project is open to contributors! Contributions can come in the form of feature requests, bug fixes, documentation, tutorials, and the like. We highly recommend filing an Issue first before submitting a Pull Request. Simply fork this repository and make a Pull Request! We would appreciate:
- Implementation of new features
- Bug Reports
- Documentation
- Testing
Contributing
docs/CONTRIBUTING.md
Documentation source
README.mdpython/README.mddocs/PYPI_README.mddocs/CONTRIBUTING.mddocs/source/developers/contributing.rstdocs/source/tutorials/getting_started.rst
6 documents lus parmi 6 candidats.
Fonctions et composants 2
- Géométrie et requêtes de collision
- ipc.hpp prend un CollisionMesh et des positions pour vérifier les intersections ou un déplacement sans collision. Les phases large et étroite ont des paramètres explicites avec valeurs par défaut, séparant candidats et tests détaillés.
- Calculs de contact
- L’arborescence sépare distance, barrière, friction, tangente et potentiels. Ces composants alimentent les objectifs et dérivées de l’appelant, sans intégrer automatiquement toute une scène physique.
Architecture
Les composants et leurs liens restent lisibles en texte. Le diagramme ajoute une vue interactive.
- Simulation externe
- Maillage et déplacement des sommets
- Candidats de phase large
- Détection continue précise
- Résultat de collision
Liens vérifiés dans le dépôt.
Mermaid Diagramme interactif (chargement à l’ouverture)
Vue générale des composants et des échanges vérifiés dans le dépôt.

flowchart LR
n0["Simulation externe"]
n1["Maillage et déplacement des sommets"]
n2["Candidats de phase large"]
n3["Détection continue précise"]
n4["Résultat de collision"]
n0 --> n1
n1 --> n2
n2 --> n3
n3 --> n4
n4 --> n0
Version texte du diagramme
- Simulation externe → Maillage et déplacement des sommets
- Maillage et déplacement des sommets → Candidats de phase large
- Candidats de phase large → Détection continue précise
- Détection continue précise → Résultat de collision
- Résultat de collision → Simulation externe
Suivre un parcours dans le code
Suivez is_step_collision_free depuis sa déclaration. Le résultat répond à une requête géométrique pour un déplacement proposé. L’appelant décide comment cela change son pas, sa recherche linéaire ou sa résolution de contact.
Algorithme
Problème
Décider si un CollisionMesh aux positions de sommets données s’intersecte, ou si un déplacement proposé reste sans collision, pour qu’un simulateur avec contacts interroge la géométrie sans posséder toute la boucle temporelle.
Entrées
Un CollisionMesh plus les positions de sommets courantes (et éventuellement proposées) ; les stratégies CCD large et étroite sont des paramètres explicites avec valeurs par défaut.
Sorties
Réponses d’intersection ou de pas sans collision, plus des quantités de contact (distances, barrières, aides de friction) consommées par l’objectif de l’appelant — pas une résolution de scène complète.
Pseudocode (source)
given mesh M, positions x, optional next positions x'
if has_intersections(M, x): report contact candidates
if not is_step_collision_free(M, x, x'): reject or shorten step
else: assemble contact energies/derivatives for the caller’s solver- 1. Construire ou accepter un maillage de collision
La bibliothèque attend un CollisionMesh qui sépare la géométrie de l’état de simulation de l’appelant.
- 2. Candidats en phase large
Les paires candidates sont découvertes avec une stratégie de phase large explicite avant les tests étroits coûteux.
- 3. CCD / intersection en phase étroite
Les points d’entrée de ipc.hpp testent les intersections à une configuration ou si un déplacement reste sans collision.
- 4. Quantités de contact pour le solveur
Les modules distance, barrière, friction et associés fournissent valeurs et dérivées ; la simulation externe conserve la gestion du temps.
Aucune complexité asymptotique n’est publiée dans les en-têtes inspectés de ce fork ; le coût dépend de la taille du maillage, de la phase large et des réglages CCD choisis par l’appelant.
Types et structure des fichiers
140 types déclarés, dont 12 dans l’aperçu des relations de base.
Diagramme des types
classDiagram
direction TB
class ta4ad2d054a1a["CXXFunctionGenerator"] {
__init__()
signature()
__call__()
}
class t0935cb7a441b["CXXGradientGenerator"] {
__init__()
}
class t1aec9e647746["CXXJacobianGenerator"] {
__init__()
}
class t6c43b7865a81["CXXHessianGenerator"] {
__init__()
}
class t05fe515aed0d["Inertia"] {
__init__()
__call__()
gradient()
hessian()
}
class tcb5b8ab75455["PyBarrier"] {
first_derivative()
second_derivative()
units()
}
class te947d03a9485["PyBroadPhase"] {
name()
build()
clear()
detect_vertex_vertex_candidates()
}
class ta8c42662e683["PyNarrowPhaseCCD"] {
point_point_ccd()
point_edge_ccd()
point_triangle_ccd()
edge_edge_ccd()
}
class tb0adabdf7fe2["PyNonlinearTrajectory"] {
max_distance_from_linear()
}
class tc83b025ce434["PyIntervalNonlinearTrajectory"] {
max_distance_from_linear()
}
class t9ee9c14a4b05["PairHash"] {
<<struct>>
}
class t5a3d1613cb4b["SparseCanCollide"] {
SparseCanCollide()
}
ta4ad2d054a1a <|-- t0935cb7a441b
ta4ad2d054a1a <|-- t1aec9e647746
t1aec9e647746 <|-- t6c43b7865a81
class b7bd3eedf5849["Barrier"] {
<<unresolved_base>>
}
b7bd3eedf5849 <|-- tcb5b8ab75455
class b80b43ba1bca8["BroadPhase"] {
<<unresolved_base>>
}
b80b43ba1bca8 <|-- te947d03a9485
class b1ced31ba20e0["NarrowPhaseCCD"] {
<<unresolved_base>>
}
b1ced31ba20e0 <|-- ta8c42662e683
class b9fe354f68d01["NonlinearTrajectory"] {
<<unresolved_base>>
}
b9fe354f68d01 <|-- tb0adabdf7fe2
class b28bdf016fc91["IntervalNonlinearTrajectory"] {
<<unresolved_base>>
}
b28bdf016fc91 <|-- tc83b025ce434
Les bases non résolues restent identifiées; les signatures complètes ne sont pas reconstruites.
Index des types
CXXFunctionGenerator(class) ·notebooks/generate_cpp_code.py:56Méthodes dans l’aperçu :
__init__, signature, __call__.CXXGradientGenerator(class) ·notebooks/generate_cpp_code.py:81Méthodes dans l’aperçu :
__init__.Bases déclarées :
CXXFunctionGenerator.CXXJacobianGenerator(class) ·notebooks/generate_cpp_code.py:88Méthodes dans l’aperçu :
__init__.Bases déclarées :
CXXFunctionGenerator.CXXHessianGenerator(class) ·notebooks/generate_cpp_code.py:98Méthodes dans l’aperçu :
__init__.Bases déclarées :
CXXJacobianGenerator.Inertia(class) ·python/examples/solver.py:15Méthodes dans l’aperçu :
__init__, __call__, gradient, hessian.PyBarrier(class) ·python/src/barrier/barrier.cpp:7Méthodes dans l’aperçu :
first_derivative, second_derivative, units.Bases déclarées :
Barrier.PyBroadPhase(class) ·python/src/broad_phase/broad_phase.cpp:8Méthodes dans l’aperçu :
name, build, clear, detect_vertex_vertex_candidates.Bases déclarées :
BroadPhase.PyNarrowPhaseCCD(class) ·python/src/ccd/narrow_phase_ccd.cpp:7Méthodes dans l’aperçu :
point_point_ccd, point_edge_ccd, point_triangle_ccd, edge_edge_ccd.Bases déclarées :
NarrowPhaseCCD.PyNonlinearTrajectory(class) ·python/src/ccd/nonlinear_ccd.cpp:7Méthodes dans l’aperçu :
max_distance_from_linear.Bases déclarées :
NonlinearTrajectory.PyIntervalNonlinearTrajectory(class) ·python/src/ccd/nonlinear_ccd.cpp:17Méthodes dans l’aperçu :
max_distance_from_linear.Bases déclarées :
IntervalNonlinearTrajectory.PairHash(struct) ·python/src/collision_mesh.cpp:10SparseCanCollide(class) ·python/src/collision_mesh.cpp:26Méthodes dans l’aperçu :
SparseCanCollide.
Référence
463 / 463 fichiers admissibles lus (646 dans l’arbre); 0 trop volumineux, 0 échec de lecture et 74 diagnostic de syntaxe.
Ce que couvre l’analyse
Les dossiers connus de dépendances et de compilation, les fichiers d’identifiants et les binaires sont exclus. La collecte couvre les README, les manifestes reconnus et les fichiers source pris en charge.
Les statistiques Linguist couvrent l’ensemble du dépôt et peuvent inclure d’autres langages.
Carte des fichiers
flowchart TD
root["ipc-toolkit"]
f0["CMakeLists.txt"]
root --> f0
f1["src/ipc/ipc.cpp"]
root --> f1
f2["src/ipc/ipc.hpp"]
root --> f2
f3["README.md"]
root --> f3
f4["pyproject.toml"]
root --> f4
f5["setup.py"]
root --> f5
f6["notebooks/find_ipctk.py"]
root --> f6
f7["notebooks/generate_cpp_code.py"]
root --> f7
f8["notebooks/parula.py"]
root --> f8
f9["notebooks/utils.py"]
root --> f9
f10["python/CMakeLists.txt"]
root --> f10
f11["python/README.md"]
root --> f11
f12["python/_find_ipctk.py"]
root --> f12
f13["tests/CMakeLists.txt"]
root --> f13
f14["python/examples/find_ipctk.py"]
root --> f14
f15["python/examples/lbvh.py"]
root --> f15
Fichiers à lire 3
Références
Fiche projet
Article associé : IPC Toolkit : une bibliothèque de contacts pour les simulations.