From 6a6b355866e9c227415ed028966362d3760353de Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Sun, 6 Jan 2019 09:34:48 +0200 Subject: [PATCH] added forces + damping, k factors --- src/hair.cc | 52 +++++++++++++++++++++++++++++++++++++++++----------- src/hair.h | 1 + src/main.cc | 15 +++++++++++---- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/hair.cc b/src/hair.cc index 2431f50..0fc026d 100644 --- a/src/hair.cc +++ b/src/hair.cc @@ -8,6 +8,11 @@ #include "kdtree.h" #include "hair.h" +/* spring constant */ + +#define K_ANC 4.0 +#define DAMPING 1.5 + struct Triangle { Vec3 v[3]; Vec3 n[3]; @@ -122,7 +127,7 @@ bool Hair::init(const Mesh *m, int max_num_spawns, float thresh) for(size_t i=0; ixform = xform; } + +void Hair::update(float dt) +{ + for(size_t i = 0; i < hair.size(); i++) { + /* in local space */ + Vec3 hair_end = hair[i].spawn_pt + hair[i].spawn_dir * hair_length; + Vec3 anchor = xform * hair_end; + + Vec3 force = (anchor - hair[i].pos) * K_ANC; + + Vec3 accel = force; /* mass 1 */ + hair[i].velocity += ((-hair[i].velocity * DAMPING) + accel) * dt; + hair[i].pos += hair[i].velocity * dt; + + dbg_force = force; + } +} diff --git a/src/hair.h b/src/hair.h index 23aff83..6cbf14e 100644 --- a/src/hair.h +++ b/src/hair.h @@ -28,6 +28,7 @@ public: void draw() const; void set_transform(Mat4 &xform); + void update(float dt); }; #endif //PARTICLES_H_ diff --git a/src/main.cc b/src/main.cc index 307f647..54959a8 100644 --- a/src/main.cc +++ b/src/main.cc @@ -11,7 +11,7 @@ #include "mesh.h" #include "hair.h" -#define MAX_NUM_SPAWNS 4 +#define MAX_NUM_SPAWNS 400 #define THRESH 0.5 static bool init(); @@ -120,6 +120,11 @@ static void cleanup() static void display() { + static unsigned long prev_time; + unsigned long msec = glutGet(GLUT_ELAPSED_TIME); + float dt = (float)(msec - prev_time) / 1000.0; + prev_time = msec; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); head_xform = Mat4::identity; @@ -131,14 +136,16 @@ static void display() glTranslatef(0, 0, -cam_dist); glRotatef(cam_phi, 1, 0, 0); glRotatef(cam_theta, 0, 1, 0); - + /* multiplying with the head rot matrix */ + glPushMatrix(); glMultMatrixf(head_xform[0]); - for(size_t i=0; idraw(); } + glPopMatrix(); hair.set_transform(head_xform); + hair.update(dt); hair.draw(); glutSwapBuffers(); @@ -211,7 +218,7 @@ static void motion(int x, int y) if(head_rx > 45) head_rx = 45; if(head_rz < -90) head_rz = -90; - if(head_rz > 90) head_rx = 90; + if(head_rz > 90) head_rz = 30; } } else { -- 1.7.10.4