From 15dd6cafbddb9fc7602690f6c45381333936a320 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 12 Nov 2012 17:31:07 -0800 Subject: [PATCH] Work in progress on field/ball interaction --- .../UserInterfaceState.xcuserstate | Bin 98898 -> 99083 bytes main.cpp | 14 ++--- particle.cpp | 52 +++++++++++++----- particle.h | 1 + 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate b/interface.xcodeproj/project.xcworkspace/xcuserdata/philip.xcuserdatad/UserInterfaceState.xcuserstate index c6b054ad3dc6ce046093b101dc83ddfbf9e020f3..7f7bb244fffdb9c9c784aa06962122e08f953684 100644 GIT binary patch delta 30062 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 diff --git a/main.cpp b/main.cpp index 305fdd2d92..205a5473cf 100644 --- a/main.cpp +++ b/main.cpp @@ -89,12 +89,12 @@ Hand myHand(HAND_RADIUS, glm::vec3(0,1,1)); // My hand (used to manipulate things in world) glm::vec3 box(WORLD_SIZE,WORLD_SIZE,WORLD_SIZE); -ParticleSystem balls(10, +ParticleSystem balls(1000, box, false, // Wrap? - 0.0, // Noise - 0.3, // Size scale - 0.0 // Gravity + 0.02, // Noise + 0.3, // Size scale + 0.0 // Gravity ); @@ -112,7 +112,7 @@ ParticleSystem balls(10, #define RENDER_FRAME_MSECS 10 #define SLEEP 0 -#define NUM_TRIS 200000 +#define NUM_TRIS 10 struct { float vertices[NUM_TRIS * 3]; // float normals [NUM_TRIS * 3]; @@ -616,7 +616,7 @@ void display(void) if (display_hand) myHand.render(); - // balls.render(); + balls.render(); // Render the world box render_world_box(); @@ -781,7 +781,7 @@ void idle(void) field_simulate(1.f/FPS); myHead.simulate(1.f/FPS); myHand.simulate(1.f/FPS); - // balls.simulate(1.f/FPS); + balls.simulate(1.f/FPS); if (!step_on) glutPostRedisplay(); last_frame = check; diff --git a/particle.cpp b/particle.cpp index 88ea0c96c7..96727a2dca 100644 --- a/particle.cpp +++ b/particle.cpp @@ -27,7 +27,7 @@ ParticleSystem::ParticleSystem(int num, int i, element; bounds = box; count = num; - wrapBounds = wrap; + wrapBounds = false; noise = noiselevel; gravity = setgravity; scale = setscale; @@ -38,6 +38,11 @@ ParticleSystem::ParticleSystem(int num, particles[i].position.y = randFloat()*box.y; particles[i].position.z = randFloat()*box.z; + // Constrain to a small box in center + //particles[i].position.x = randFloat()+box.x/2.0; + //particles[i].position.y = randFloat()+box.y/2.0; + //particles[i].position.z = randFloat()+box.z/2.0; + particles[i].velocity.x = 0; particles[i].velocity.y = 0; particles[i].velocity.z = 0; @@ -45,7 +50,7 @@ ParticleSystem::ParticleSystem(int num, particles[i].parent = 0; particles[i].link *= 0; - element = rand()%NUM_ELEMENTS; + element = 1; //rand()%NUM_ELEMENTS; particles[i].element = element; if (element == 0) particles[i].color = color0; @@ -53,7 +58,7 @@ ParticleSystem::ParticleSystem(int num, else if (element == 2) particles[i].color = color2; else if (element == 3) particles[i].color = color3; - particles[i].radius = radii[element]*scale; + particles[i].radius = 0.10; //radii[element]*scale; particles[i].isColliding = false; @@ -79,10 +84,10 @@ void ParticleSystem::render() { for (unsigned int i = 0; i < count; ++i) { glPushMatrix(); glTranslatef(particles[i].position.x, particles[i].position.y, particles[i].position.z); - if (particles[i].isColliding) glColor3f(particles[i].color.x * 0.7, - particles[i].color.y * 0.7, - particles[i].color.z * 0.7); - else glColor3f(particles[i].color.x, particles[i].color.y, particles[i].color.z); + if (particles[i].numSprung == 0) glColor3f(1,1,1); + else if (particles[i].numSprung == 1) glColor3f(0,1,0); + else if (particles[i].numSprung == 2) glColor3f(1,1,0); + else if (particles[i].numSprung >= 3) glColor3f(1,0,0); glutSolidSphere(particles[i].radius, 15, 15); glPopMatrix(); } @@ -110,20 +115,27 @@ void ParticleSystem::simulate (float deltaTime) { particles[i].velocity.y -= gravity*deltaTime; // Drag: decay velocity - particles[i].velocity *= 0.99; + const float CONSTANT_DAMPING = 0.1; + particles[i].velocity *= (1.f - CONSTANT_DAMPING*deltaTime); // Add velocity from field //Field::addTo(particles[i].velocity); //particles[i].velocity += Field::valueAt(particles[i].position); // Add noise - const float RAND_VEL = 3.0; + const float RAND_VEL = 0.05; if (noise) { - if (randFloat() < noise*deltaTime) { + if (1) { particles[i].velocity += glm::vec3((randFloat() - 0.5)*RAND_VEL, (randFloat() - 0.5)*RAND_VEL, (randFloat() - 0.5)*RAND_VEL); } + if (randFloat() < noise*deltaTime) { + particles[i].velocity += glm::vec3((randFloat() - 0.5)*RAND_VEL*100, + (randFloat() - 0.5)*RAND_VEL*100, + (randFloat() - 0.5)*RAND_VEL*100); + + } } } else { particles[i].position = particles[particles[i].parent].position + particles[i].link; @@ -137,11 +149,14 @@ void ParticleSystem::simulate (float deltaTime) { // Check for collision with other balls float separation; const float HARD_SPHERE_FORCE = 100.0; - const float SPRING_FORCE = 0.1; - float spring_length = 3*radii[1]; + const float SPRING_FORCE = 10.0; + const float SPRING_DAMPING = 0.5; + float spring_length = 0.5; //2*radii[1]; + float spring_range = spring_length * 1.2; float contact; particles[i].isColliding = false; + particles[i].numSprung = 0; for (j = 0; j < count; j++) { if ((j != i) && @@ -150,14 +165,17 @@ void ParticleSystem::simulate (float deltaTime) { contact = particles[i].radius + particles[j].radius; // Hard Sphere Scattering + if (separation < contact) { particles[i].velocity += glm::normalize(particles[i].position - particles[j].position)*deltaTime*HARD_SPHERE_FORCE*(contact - separation); particles[i].isColliding = true; } // Spring Action - if ((particles[i].element == 1) && (separation < spring_length*2)) { - particles[i].velocity += glm::normalize(particles[i].position - particles[j].position)*deltaTime*SPRING_FORCE*(spring_length - separation); + if ((particles[i].element == 1) && (separation < spring_range)) { + particles[i].velocity += glm::normalize(particles[i].position - particles[j].position)*deltaTime*SPRING_FORCE*(spring_length - separation); + particles[i].velocity *= (1.f - SPRING_DAMPING*deltaTime); + particles[i].numSprung++; } // Link! @@ -194,14 +212,20 @@ void ParticleSystem::simulate (float deltaTime) { // Bounce at bounds if (particles[i].position.x > bounds.x || particles[i].position.x < 0.f) { + if (particles[i].position.x > bounds.x) particles[i].position.x = bounds.x; + else particles[i].position.x = 0.f; particles[i].velocity.x *= -1; } if (particles[i].position.y > bounds.y || particles[i].position.y < 0.f) { + if (particles[i].position.y > bounds.y) particles[i].position.y = bounds.y; + else particles[i].position.y = 0.f; particles[i].velocity.y *= -1; } if (particles[i].position.z > bounds.z || particles[i].position.z < 0.f) { + if (particles[i].position.z > bounds.z) particles[i].position.z = bounds.z; + else particles[i].position.z = 0.f; particles[i].velocity.z *= -1; } } diff --git a/particle.h b/particle.h index 6e55feebbf..3c2a74de30 100644 --- a/particle.h +++ b/particle.h @@ -34,6 +34,7 @@ private: int parent; float radius; bool isColliding; + int numSprung; } *particles; unsigned int count;