PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
Constraints.h
1#ifndef PBAT_SIM_CONTACT_CONSTRAINTS_H
2#define PBAT_SIM_CONTACT_CONSTRAINTS_H
3
4#include "pbat/HostDevice.h"
6#include "pbat/math/linalg/mini/BinaryOperations.h"
7#include "pbat/math/linalg/mini/Matrix.h"
8
9namespace pbat::sim::contact {
33template <
34 math::linalg::mini::CMatrix TMatrixP,
35 math::linalg::mini::CMatrix TMatrixNTB,
36 math::linalg::mini::CMatrix TMatrixX1,
37 math::linalg::mini::CMatrix TMatrixX2,
38 math::linalg::mini::CMatrix TMatrixX3,
39 math::linalg::mini::CMatrix TMatrixBary,
40 math::linalg::mini::CMatrix TMatrixC>
41PBAT_HOST_DEVICE void TriangleEnvironmentConstraint(
42 TMatrixP const& P,
43 TMatrixNTB const& NTB,
44 TMatrixX1 const& X1,
45 TMatrixX2 const& X2,
46 TMatrixX3 const& X3,
47 TMatrixBary const& bary,
48 TMatrixC& C)
49{
50 static_assert(TMatrixP::kRows == 3 and TMatrixP::kCols == 1, "P must be 3x1");
51 static_assert(TMatrixNTB::kRows == 3 and TMatrixNTB::kCols == 3, "NTB must be 3x3");
52 static_assert(TMatrixX1::kRows == 3 and TMatrixX1::kCols == 1, "X1 must be 3x1");
53 static_assert(TMatrixX2::kRows == 3 and TMatrixX2::kCols == 1, "X2 must be 3x1");
54 static_assert(TMatrixX3::kRows == 3 and TMatrixX3::kCols == 1, "X3 must be 3x1");
55 static_assert(TMatrixBary::kRows == 3 and TMatrixBary::kCols == 1, "bary must be 3x1");
56 static_assert(TMatrixC::kRows == 3 and TMatrixC::kCols == 1, "C must be 3x1");
57 using ScalarType = typename TMatrixP::ScalarType;
58 using Vec3 = math::linalg::mini::SVector<ScalarType, 3>;
59 // C(x) = [N T B]^T ([x_i x_j x_k] bary - P)
60 Vec3 X = bary(0) * X1 + bary(1) * X2 + bary(2) * X3;
61 C = NTB.Transpose() * (X - P);
62}
63
85template <
93 math::linalg::mini::CMatrix TMatrixGradCT>
95 TMatrixP const& P,
96 TMatrixNTB const& NTB,
97 TMatrixX1 const& X1,
98 TMatrixX2 const& X2,
99 TMatrixX3 const& X3,
100 TMatrixBary const& bary,
101 TMatrixC& C,
102 TMatrixGradCT& gradCT)
103{
104 static_assert(TMatrixGradCT::kRows == 9 and TMatrixGradCT::kCols == 3, "gradCT must be 9x3");
106 TriangleEnvironmentConstraint(P, NTB, X1, X2, X3, bary, C);
107 // \nabla_{x_i,x_j,x_k} C_c = \beta \otimes NTB[:,c]
109 [&]<auto c>() {
111 [&]<auto i>() {
112 gradCT.Col(c).template Slice<3, 1>(i * 3, 0) = bary(i) * NTB.Col(c);
113 });
114 });
115}
116} // namespace pbat::sim::contact
117
118#endif // PBAT_SIM_CONTACT_CONSTRAINTS_H
Compile-time for loops.
Definition Matrix.h:121
Definition Concepts.h:14
constexpr void ForRange(F &&f)
Compile-time for loop over a range of values.
Definition ConstexprFor.h:55
Namespace for contact detection algorithms.
Definition Constraints.cpp:3
PBAT_HOST_DEVICE void TriangleEnvironmentConstraintAndGradient(TMatrixP const &P, TMatrixNTB const &NTB, TMatrixX1 const &X1, TMatrixX2 const &X2, TMatrixX3 const &X3, TMatrixBary const &bary, TMatrixC &C, TMatrixGradCT &gradCT)
Computes constraint and its gradient.
Definition Constraints.h:94
PBAT_HOST_DEVICE void TriangleEnvironmentConstraint(TMatrixP const &P, TMatrixNTB const &NTB, TMatrixX1 const &X1, TMatrixX2 const &X2, TMatrixX3 const &X3, TMatrixBary const &bary, TMatrixC &C)
Computes the constraint .
Definition Constraints.h:41