From 374b1d31b0fa9980d662d45b59551398b3618d3f Mon Sep 17 00:00:00 2001 From: Sebastian Gaida <gaida@ca-digit.com> Date: Tue, 22 Jun 2021 15:02:55 +0200 Subject: [PATCH] [#69] added gravity points and other forces --- .../particle_simulation/shaders/comp1.spv | Bin 2112 -> 5272 bytes .../particle_simulation/shaders/shader1.comp | 46 ++++++++++++++++-- projects/particle_simulation/src/main.cpp | 10 ++-- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/projects/particle_simulation/shaders/comp1.spv b/projects/particle_simulation/shaders/comp1.spv index c82562d6735289dd7f7ba2dbeb2243817034d47d..386bd33749f3e09b1fa3bf76fff23812fd7f87c1 100644 GIT binary patch literal 5272 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 RNF3CM{l~z>0OEtv0RUI43Sa;L literal 2112 zcmZQ(Qf6mhU}WH8;AL=UfB-=TCI&_Z1_o{hHZbk(6YQf`T#}+^Vrl?V!N<T1qQG+e z3~UUn3=9k`3=9mpiJ5sI32p`k1_1^(u$UkN1A_wt$OZ^zW?*JuVqjo6#0b*E$>8o2 z?-=A1Uz}QySd>_j8eg1|n37r)pP!VKnp{#0Qo{vO<L>Y8?&BJtTu=~STvC~n8lRJy zml~gvS(KVwl3A7tQpbU$E;BDVr!)mw0V@Lw*gY^evNA9;a4;}1WTr4MurhEkfZUv( z6YrjrpOl#6nOBydoLG{XpXceq0Fq~A5Mp3p2uLg{$xO~k1^JPUfekDMVi)8WXMz-i z*f4QW_~m4#rG{kYqNoS?y(~2+KRL6c5?MVcL<<sAQZn<><Bh;}vNMP<Ffb&QrlqA8 z#b@RrSq`!TBnQ%uECKS97)TJTpOrzHfq@}8Kd-nXF%J}!3?O|VF_4m?)Z&7~^1Oij zVg|T4$jvFKIVFiuM}y3h1u14=U~p$(0f!MNoMadn7(5stVFHp?1`$YNAag)sJV;_7 ze}lvXki<ZK28n^p1DP+(0CEchg92C$3)uf4qs75|RyZG|2PE#!zzh}xnFG=f^1Bj9 z0_t86UlGa&xfkYln0}ZTvU@>hg4BWB3o_FUoDUcnBpDbOgc+E?X;+Z}l!_U^Y*7Xl z1~vwWn?Y77Ft9MNGcbTLNL-wOg@F_5FOWMy@?6mT01~%mU||69LE#E=hc?taP}srD z<AtgRnJ31;%m4~QP#A&C2IVghA7r*1G)=<9V6-d)GXp4WL1|bH8fG9q$StA_5PyKu z6UZ$fJ}BHk{s;LD6!svyU~U8PB|r{iU|;~b6~vc<x=)UQ1)Sz!_JYg@#VyF6pfClQ z58{K;6i5stFUP<D4j+&oKzvYqf$RqHLFR*KO{je$3``7KP<uh*`e1Pf2arBco&lK& zvKz!Vh58G`2blwMryW!b#0P~XC~t$xCK%rp>JJ?THn5vOaSu`h5(i;323ByKgUULP z)u1r{!N3GA|3H2N#XG1>0nv^OtPG%d<AbIjP<+}#<CdR+fdM3L2Q7m@e3%?4oq@~% z=?8_4JOcv*D7-*n3{nH~Hz+<p;*JdL4507=rFl@Cf#L<EA6YFZt%Ky78Cb#TMumZa z0VD=81Eyb<fq?;CKgew$agchDy`b<?V_*Q6nJ|6oNcuo>$o6V5Fff4RcQCL*<BWj; zBnFDh?+nZgx}X4LU|{&gz`~%-z`&rxzyKBlg(rv&vr`YvPEZ8|b1O&=WGBe2AaPK7 zfax=Y>tkgAr43_fID*0mqz05OOc)p#K;j_(fYOT@l7B$@L25x}gTz5<e=;z^-3W3& z$Q)3(m_zM?@hzZyn7Nin=7Quv=7Q9M++fAPzyOkm#kV!oogjaK)PUmKhJk?rBo5+( z?6XBP-yX?)kQ^wTgVch|2c>V2d>;cV1BmYkt&c%wHbTXm7#J8p?f}Wb-0X~GCdhvv UH-o|gBo0#lmw}PNf`O3%06Wx|(f|Me diff --git a/projects/particle_simulation/shaders/shader1.comp b/projects/particle_simulation/shaders/shader1.comp index eea7fe7b..7b58b55f 100644 --- a/projects/particle_simulation/shaders/shader1.comp +++ b/projects/particle_simulation/shaders/shader1.comp @@ -1,7 +1,7 @@ #version 450 core #extension GL_ARB_separate_shader_objects : enable -layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in; +layout(local_size_x = 256) in; struct Particle { @@ -21,14 +21,54 @@ layout( push_constant ) uniform constants{ float deltaTime; }; +vec3 attraction(vec3 pos, vec3 attractPos) +{ + vec3 delta = attractPos - pos; + const float damp = 0.5; + float dDampedDot = dot(delta, delta) + damp; + float invDist = 1.0f / sqrt(dDampedDot); + float invDistCubed = invDist*invDist*invDist; + return delta * invDistCubed * 0.0035; +} + +vec3 repulsion(vec3 pos, vec3 attractPos) +{ + vec3 delta = attractPos - pos; + float targetDistance = sqrt(dot(delta, delta)); + return delta * (1.0 / (targetDistance * targetDistance * targetDistance)) * -0.000035; +} + +const int n = 3; +vec3 gravity = vec3(0,-9.8,0); +vec3 gravityPoint[n] = vec3[n](vec3(-0.5, 0.5, 0),vec3(0.5, 0.5, 0),vec3(0, -0.5, 0)); + void main() { uint id = gl_GlobalInvocationID.x; inParticle[id].lifeTime -= deltaTime; + vec3 pos = inParticle[id].position; + vec3 vel = inParticle[id].velocity; if(inParticle[id].lifeTime < 0.f) { inParticle[id].lifeTime = 3.f; - inParticle[id].position = respawnPos; + pos = vec3(0); } +// inParticle[id].position += deltaTime * -normalize(max(2 - distance(inParticle[id].position,respawnPos),0.0) * respawnPos - inParticle[id].position); + + for(int i = 0; i < n; i++) + { + pos += deltaTime * deltaTime * normalize(max(2 - distance(pos,gravityPoint[i]),0.1) * gravityPoint[i] - pos); + } + +// vec3 delta = respawnPos - pos; +// float targetDistane = sqrt(dot(delta,delta)); +// vel += repulsion(pos, respawnPos) * 0.05; + + + if((pos.x < -1.0) || (pos.x > 1.0) || (pos.y < -1.0) || (pos.y > 1.0)|| (pos.z < -1.0) || (pos.z > 1.0)) + vel = (-vel * 0.1) + attraction(pos, respawnPos) * 12; + + pos += normalize(vel) * deltaTime; + inParticle[id].position = pos; - inParticle[id].position = (inParticle[id].position + deltaTime * inParticle[id].velocity); + inParticle[id].velocity = vel; } diff --git a/projects/particle_simulation/src/main.cpp b/projects/particle_simulation/src/main.cpp index e4c4bc9a..17104ddf 100644 --- a/projects/particle_simulation/src/main.cpp +++ b/projects/particle_simulation/src/main.cpp @@ -201,8 +201,8 @@ int main(int argc, const char **argv) { uint32_t camIndex1 = cameraManager.addCamera(vkcv::camera::ControllerType::TRACKBALL); cameraManager.getCamera(camIndex0).setPosition(glm::vec3(0, 0, -2)); - cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, 0.0f)); - cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, -1.0f)); + cameraManager.getCamera(camIndex1).setPosition(glm::vec3(0.0f, 0.0f, -2.0f)); + cameraManager.getCamera(camIndex1).setCenter(glm::vec3(0.0f, 0.0f, 0.0f)); while (window.isWindowOpen()) { window.pollEvents(); @@ -218,19 +218,19 @@ int main(int argc, const char **argv) { auto end = std::chrono::system_clock::now(); float deltatime = 0.000001 * static_cast<float>( std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() ); start = end; - particleSystem.updateParticles(deltatime); +// particleSystem.updateParticles(deltatime); cameraManager.update(deltatime); std::vector<glm::mat4> mvp; mvp.clear(); - mvp.push_back( cameraManager.getCamera(0).getMVP()); + mvp.push_back( cameraManager.getCamera(1).getMVP()); auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics); glm::vec4 pushData = glm::vec4(particleSystem.getRespawnPos(),deltatime); vkcv::PushConstantData pushConstantDataCompute( &pushData, sizeof(glm::vec4)); - uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/64.f)),1,1}; + uint32_t computeDispatchCount[3] = {static_cast<uint32_t> (std::ceil(particleSystem.getParticles().size()/256.f)),1,1}; core.recordComputeDispatchToCmdStream(cmdStream, computePipeline, computeDispatchCount, -- GitLab