Skip to content

Commit 2cdc08d

Browse files
added constraint energy computation logging to debug window
1 parent d4a7b39 commit 2cdc08d

File tree

4 files changed

+104
-15
lines changed

4 files changed

+104
-15
lines changed

src/ImGuiWindow.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ void DebugWindow::displayXPBDParameters(
204204

205205
float& alpha = scene.getAlpha();
206206
float alpha_min = 0.0f;
207-
if (scene.getName() == "Test Scene 2") alpha_min = 0.1f;
207+
if (scene.getName() == "Test Scene 2") alpha_min = 0.1f; // TODO: create icosphere with a lot of triangles
208208
float alpha_max = 1.0f;
209209
ImGui::Text("Compliance:");
210210
ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x - 1);
@@ -346,6 +346,13 @@ void DebugWindow::displaySceneObjects(
346346
continue;
347347
}
348348

349+
float distanceEnergy = object->getDistanceConstraintEnergy();
350+
ImGui::Text("Distance Constraint Energy: %.2f J", distanceEnergy);
351+
352+
float volumeEnergy = object->getVolumeConstraintEnergy();
353+
ImGui::Text("Volume Constraint Energy: %.2f J", volumeEnergy);
354+
ImGui::Dummy(ImVec2(0.0f, 5.0f));
355+
349356
displayVertexTransforms(i, object);
350357
displayPolygonMode(i, object);
351358
displayNormalShaders(i, object);

src/Object.hpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
#include "Light.hpp"
1515
#include "Texture.hpp"
1616

17-
class Object
18-
{
17+
class Object {
1918
public:
2019
Object() = default;
2120
Object(
@@ -47,6 +46,12 @@ class Object
4746
Mesh& getMesh() { return m_mesh; }
4847
const std::vector<float>& getMass() const { return m_M; }
4948

49+
float getDistanceConstraintEnergy() const { return m_distanceEnergy; }
50+
void setDistanceConstraintEnergy(float energy) { m_distanceEnergy = energy; }
51+
52+
float getVolumeConstraintEnergy() const { return m_volumeEnergy; }
53+
void setVolumeConstraintEnergy(float energy) { m_volumeEnergy = energy; }
54+
5055
void resetVertexTransforms();
5156

5257
void setProjectionViewUniforms(const Shader& shader);
@@ -60,6 +65,7 @@ class Object
6065
static void setVertexNormalShader(const Shader& shader) { s_vertexNormalShader = shader; }
6166
static void setFaceNormalShader(const Shader& shader) { s_faceNormalShader = shader; }
6267

68+
6369
private:
6470
std::string m_name;
6571
Transform m_transform;
@@ -79,4 +85,7 @@ class Object
7985
std::vector<Transform> m_vertexTransforms;
8086
std::vector<float> m_M;
8187

88+
float m_distanceEnergy;
89+
float m_volumeEnergy;
90+
8291
};

src/Scene.cpp

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,25 @@ void Scene::solveMouseConstraints(
473473
}
474474
}
475475

476+
float Scene::computeConstraintEnergy(
477+
float alpha,
478+
const std::vector<Constraint>& constraints,
479+
const std::vector<glm::vec3>& x
480+
)
481+
{
482+
if (alpha == 0.0f) {
483+
return 0.0f;
484+
}
485+
486+
float totalEnergy = 0.0f;
487+
for (const auto& constraint : constraints) {
488+
float C = constraint(x);
489+
totalEnergy += (0.5f / alpha) * (C * C);
490+
}
491+
492+
return totalEnergy;
493+
}
494+
476495
void Scene::solveDistanceConstraints(
477496
std::vector<glm::vec3>& x,
478497
const std::vector<glm::vec3>& posDiff,
@@ -503,6 +522,17 @@ void Scene::solveDistanceConstraints(
503522
}
504523
}
505524

525+
void Scene::computeDistanceConstraintEnergy(
526+
Object& object,
527+
const std::vector<glm::vec3>& x,
528+
float alpha,
529+
const Mesh::DistanceConstraints& distanceConstraints
530+
)
531+
{
532+
float energy = computeConstraintEnergy(alpha, distanceConstraints.C, x);
533+
object.setDistanceConstraintEnergy(energy);
534+
}
535+
506536
void Scene::solveVolumeConstraints(
507537
std::vector<glm::vec3>& x,
508538
const std::vector<glm::vec3>& posDiff,
@@ -536,6 +566,17 @@ void Scene::solveVolumeConstraints(
536566
updateConstraintPositions(x, deltaX);
537567
}
538568

569+
void Scene::computeVolumeConstraintEnergy(
570+
Object& object,
571+
const std::vector<glm::vec3>& x,
572+
float alpha,
573+
const Mesh::VolumeConstraints& volumeConstraints
574+
)
575+
{
576+
float energy = computeConstraintEnergy(alpha, volumeConstraints.C, x);
577+
object.setVolumeConstraintEnergy(energy);
578+
}
579+
539580
// TODO : fixme
540581
void Scene::solveEnvCollisionConstraints(
541582
std::vector<glm::vec3>& x,
@@ -650,18 +691,6 @@ void Scene::applyXPBD(
650691
);
651692
}
652693

653-
// Environment Collision constraints
654-
if (m_enableEnvCollisionConstraints) {
655-
solveEnvCollisionConstraints(
656-
x,
657-
posDiff,
658-
M,
659-
alphaTilde,
660-
gamma,
661-
perEnvCollisionConstraints
662-
);
663-
}
664-
665694
// Distance constraints
666695
if (m_enableDistanceConstraints) {
667696
solveDistanceConstraints(
@@ -672,6 +701,13 @@ void Scene::applyXPBD(
672701
gamma,
673702
distanceConstraints
674703
);
704+
705+
computeDistanceConstraintEnergy(
706+
object,
707+
x,
708+
m_alpha,
709+
distanceConstraints
710+
);
675711
}
676712

677713
// Volume constraints
@@ -684,6 +720,25 @@ void Scene::applyXPBD(
684720
gamma,
685721
volumeConstraints
686722
);
723+
724+
computeVolumeConstraintEnergy(
725+
object,
726+
x,
727+
m_alpha,
728+
volumeConstraints
729+
);
730+
}
731+
732+
// Environment Collision constraints
733+
if (m_enableEnvCollisionConstraints) {
734+
solveEnvCollisionConstraints(
735+
x,
736+
posDiff,
737+
M,
738+
alphaTilde,
739+
gamma,
740+
perEnvCollisionConstraints
741+
);
687742
}
688743

689744
// Update positions and velocities

src/Scene.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ class Scene
8484
float deltaTime_s
8585
);
8686

87+
float computeConstraintEnergy(
88+
float alpha,
89+
const std::vector<std::function<float(const std::vector<glm::vec3>&)>>& constraintFunctions,
90+
const std::vector<glm::vec3>& x
91+
);
92+
8793
bool& enableDistanceConstraints() { return m_enableDistanceConstraints; }
8894
void solveDistanceConstraints(
8995
std::vector<glm::vec3>& x,
@@ -93,6 +99,12 @@ class Scene
9399
float gamma,
94100
const Mesh::DistanceConstraints& distanceConstraints
95101
);
102+
void computeDistanceConstraintEnergy(
103+
Object& object,
104+
const std::vector<glm::vec3>& x,
105+
float alpha,
106+
const Mesh::DistanceConstraints& distanceConstraints
107+
);
96108

97109
bool& enableVolumeConstraints() { return m_enableVolumeConstraints; }
98110
void solveVolumeConstraints(
@@ -103,6 +115,12 @@ class Scene
103115
float gamma,
104116
const Mesh::VolumeConstraints& volumeConstraints
105117
);
118+
void computeVolumeConstraintEnergy(
119+
Object& object,
120+
const std::vector<glm::vec3>& x,
121+
float alpha,
122+
const Mesh::VolumeConstraints& volumeConstraints
123+
);
106124

107125
bool& enableEnvCollisionConstraints() { return m_enableEnvCollisionConstraints; }
108126
void solveEnvCollisionConstraints(

0 commit comments

Comments
 (0)