Instead of performing collision detection with a sphere, I now calculate
the dot product between the normal and the hair and if it's negative (=>
the hair falls inside the head) we calc the projection of the hair on
the head and find the new position from that.
hair[i].velocity += ((-hair[i].velocity * DAMPING) + accel) * dt;
Vec3 new_pos = hair[i].pos + hair[i].velocity * dt;
hair[i].velocity += ((-hair[i].velocity * DAMPING) + accel) * dt;
Vec3 new_pos = hair[i].pos + hair[i].velocity * dt;
- hair[i].pos = new_pos; //= handle_collision(new_pos);
+ /* collision detection with the head */
+ Vec3 normal = xform.upper3x3() * hair[i].spawn_dir;
+ Vec3 root = xform * hair[i].spawn_pt;
+ Vec3 dir = new_pos - root;
+
+ normal.normalize();
+
+ /* angle that will cause the hair to be rendered inside the head */
+ float d = dot(dir, normal);
+ if(d < 0) {
+ new_pos += -d * normal;
+ }
+
+ hair[i].pos = handle_collision(new_pos);
static float cam_theta, cam_phi = 25, cam_dist = 8;
static float head_rz, head_rx; /* rot angles x, z axis */
static Mat4 head_xform;
static float cam_theta, cam_phi = 25, cam_dist = 8;
static float head_rz, head_rx; /* rot angles x, z axis */
static Mat4 head_xform;
-static CollSphere coll_sphere; /* sphere used for collision detection */
+//static CollSphere coll_sphere; /* sphere used for collision detection */
int main(int argc, char **argv)
{
int main(int argc, char **argv)
{
- coll_sphere.radius = 1.0;
- coll_sphere.center = Vec3(0, 0.6, 0.53);
+// coll_sphere.radius = 1.0;
+// coll_sphere.center = Vec3(0, 0.6, 0.53);
if(!hair.init(mesh_head, MAX_NUM_SPAWNS, THRESH)) {
fprintf(stderr, "Failed to initialize hair\n");
return false;
}
if(!hair.init(mesh_head, MAX_NUM_SPAWNS, THRESH)) {
fprintf(stderr, "Failed to initialize hair\n");
return false;
}
- hair.add_collider(&coll_sphere);
+// hair.add_collider(&coll_sphere);