{"id":4195,"date":"2018-07-13T18:46:33","date_gmt":"2018-07-13T10:46:33","guid":{"rendered":"http:\/\/www.bookcard.net\/wordpress\/?p=4195"},"modified":"2018-10-14T21:18:04","modified_gmt":"2018-10-14T13:18:04","slug":"opengl_explosion","status":"publish","type":"post","link":"https:\/\/www.bookcard.net\/wordpress\/opengl_explosion\/","title":{"rendered":"OpenGL\u4e4b\u7c92\u5b50\u7206\u70b8\u7279\u6548"},"content":{"rendered":"<figure id=\"attachment_4196\" aria-describedby=\"caption-attachment-4196\" style=\"width: 1024px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/07\/OpenGL_Explosion.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-4196\" src=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/07\/OpenGL_Explosion.jpg\" alt=\"\" width=\"1024\" height=\"768\" srcset=\"https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/07\/OpenGL_Explosion.jpg 1024w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/07\/OpenGL_Explosion-300x225.jpg 300w, https:\/\/www.bookcard.net\/wordpress\/wp-content\/uploads\/2018\/07\/OpenGL_Explosion-768x576.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption id=\"caption-attachment-4196\" class=\"wp-caption-text\">OpenGL\u4e4b\u7c92\u5b50\u7206\u70b8\u7279\u6548<\/figcaption><\/figure>\n<p>\u904a\u6232\u4e2d\u6700\u5e38\u898b\u300e\u7206\u70b8\u300f\u7279\u6548.\u6700\u5e38\u898b\u505a\u6cd5\u662f\u4f7f\u7528<u>\u300e<a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_particle\/\">\u7c92\u5b50\u7cfb\u7d71<\/a>\u300f<\/u>\u6a21\u64ec\u300e\u7206\u70b8\u300f.\u4f60\u5927\u7d04\u9700\u8981:<\/p>\n<ol>\n<li>\u9ed1\u5e95\u767d\u5713\u4f4d\u5716\u300ebmp\u300f\u5982\u4e0a\u5716<\/li>\n<li>\u7206\u70b8\u7279\u6548\u97f3\u983b\u300ewav\u300f<\/li>\n<li>\u300e<a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_particle\/\">\u7c92\u5b50\u7cfb\u7d71<\/a>\u300f<\/li>\n<li>\u300e<a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_billboard\/\">\u5ee3\u544a\u724c<\/a>\u300f<\/li>\n<\/ol>\n<p>\u5176\u5be6\u6240\u6709\u300e\u7206\u70b8\u300f\u7279\u6548\u90fd\u662f\u5713\u5fc3\u7d0b\u7406\u4f4d\u5716.\u53ea\u662f\u5b83\u4f7f\u7528\u300e<a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_billboard\/\">\u5ee3\u544a\u724c<\/a>\u300f\u6280\u8853\u8b93\u5176\u6b63\u5c0d\u8457\u4f60\u5373\u300e\u76f8\u6a5f\u300f. \u6e32\u67d3\u70ba\u7d05\u8272\u4e26\u8b93\u5176\u96a8\u6642\u9593\u300e\u4e0b\u589c\u300f\u300e\u8b8a\u6697\u300f\u300e\u7e2e\u5c0f\u300f\u76f4\u81f3\u6d88\u4ea1.\u4e4b\u524d\u6a21\u64ec\u300e<a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_particle\/\">\u98c4\u96ea<\/a>\u300f\u7279\u6548\u6642\u4f7f\u7528\u4e09\u7d1a\u7cfb\u7d71.\u9019\u6b21\u6211\u5c07\u7c92\u5b50\u7d50\u69cb\u5927\u5927\u7c21\u5316.\u5176\u4ee3\u78bc\u6211\u90fd\u5728\u6a21\u64ec\u300e\u7206\u70b8\u300f\u7279\u6548\u4e2d\u5be6\u73fe.W<\/p>\n<p>\u7c92\u5b50\u7d50\u69cb\u9ad4<\/p>\n<p>typedef struct PARTICLE_TYP {<\/p>\n<p>VECTOR3D pos;\/\/ \u4f4d\u7f6e<\/p>\n<p>VECTOR3D pos_prev;\/\/ \u4e4b\u524d\u4f4d\u7f6e<\/p>\n<p>VECTOR3D velocity;\/\/ \u901f\u5ea6\u8207\u65b9\u5411<\/p>\n<p>VECTOR3D acceleration;\/\/ \u52a0\u901f\u5ea6<\/p>\n<p>float\u00a0\u00a0\u00a0 energy;\/\/ \u751f\u547d\u9031\u671f(\u79d2)<\/p>\n<p>float size;\/\/ \u5c3a\u5bf8<\/p>\n<p>float size_delta;\/\/\u589e\u91cf<\/p>\n<p>float weight;\/\/ \u91cd\u91cf<\/p>\n<p>float wdight_delta;\/\/ \u91cd\u91cf\u589e\u91cf<\/p>\n<p>float color[4];\/\/ \u984f\u8272<\/p>\n<p>float color_delta[4];\/\/ \u984f\u8272\u589e\u91cf<\/p>\n<p>}PARTICLE,*PARTICLE_PTR;<\/p>\n<p>\u7206\u70b8\u7279\u6548\u7d50\u69cb\u9ad4<\/p>\n<p>typedef struct EXPLOSION_TPY {<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 state;\/\/\u00a0 \u72c0\u614b<\/p>\n<p>PARTICLE_PTR array;\/\/ \u6578\u7d44<\/p>\n<p>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 count;\/\/ \u7c92\u5b50\u6578\u91cf\/\u7206\u70b8\u91cf<\/p>\n<p>VECTOR3D\u00a0\u00a0\u00a0\u00a0 origin;\/\/ \u539f\u9ede<\/p>\n<p>VECTOR3D\u00a0\u00a0\u00a0\u00a0 velocity;\/\/ \u901f\u5ea6\u8207\u65b9\u5411<\/p>\n<p>VECTOR3D\u00a0\u00a0\u00a0\u00a0 variation;\/\/ \u901f\u5ea6\u8b8a\u91cf<\/p>\n<p>VECTOR3D\u00a0\u00a0\u00a0\u00a0 acceleration;\/\/ \u52a0\u901f\u5ea6<\/p>\n<p>float\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0energy;\/\/ \u751f\u547d\u9031\u671f(\u79d2)<\/p>\n<p>float\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 size;\/\/ \u5c3a\u5bf8 5.0f<\/p>\n<p>float\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 size_variation ;\/\/ \u5c3a\u5bf8\u8b8a\u91cf 2.0f<\/p>\n<p>float\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 spread;\/\/ \u7206\u70b8\u50b3\u64ad\u7bc4\u570d<\/p>\n<p>float\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 color[4];\/\/ \u984f\u8272<\/p>\n<p>VECTOR2D\u00a0\u00a0\u00a0\u00a0 texture_coord[4];\/\/ \u7d0b\u7406\u5ea7\u6a19<\/p>\n<p>}EXPLOSION,*EXPLOSION_PTR;<\/p>\n<p>\u751f\u6210\u300e\u7206\u70b8\u300f\u7279\u6548\u51fd\u5f0f<\/p>\n<p>count:\u7206\u70b8\u91cf\u5927\u7d041-10\u5373\u53ef.<\/p>\n<p>pos:\u4f4d\u7f6e<\/p>\n<p>spread: \u7206\u70b8\u50b3\u64ad\u7bc4\u570d 0.1\u5373\u53ef<\/p>\n<p>void Build_Explosion(EXPLOSION_PTR explosion,int count,VECTOR3D_PTR pos,float spread){<\/p>\n<p>explosion-&gt;state = MODEL3D_STATE_ACTIVE;<\/p>\n<p>explosion-&gt;count = count; \/\/ \u7c92\u5b50\u6578\u91cf<\/p>\n<p>explosion-&gt;array = (PARTICLE_PTR)malloc(sizeof(PARTICLE)*count);\/\/ \u5206\u914d\u7a7a\u9593<\/p>\n<p>explosion-&gt;spread = spread;\/\/ \u50b3\u64ad<\/p>\n<p>explosion-&gt;size\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 = 5.0f;\/\/ \u5c3a\u5bf8<\/p>\n<p>explosion-&gt;size_variation = 2.0f;\/\/ \u5c3a\u5bf8\u8b8a\u91cf<\/p>\n<p>explosion-&gt;energy = 1.5f + FRAND_RANGE1() \/ 2.0f;\/\/ \u751f\u547d\u9031\u671f(\u79d2)<\/p>\n<p>Init_VECTOR3D(&amp;explosion-&gt;origin, pos-&gt;x, pos-&gt;y, pos-&gt;z);\/\/ \u6e90\u9ede<\/p>\n<p>Init_VECTOR3D(&amp;explosion-&gt;velocity, 0.0f, 2.0f, 0.0f);\/\/ \u901f\u5ea6<\/p>\n<p>Init_VECTOR3D(&amp;explosion-&gt;variation, 4.0f, 4.0f, 4.0f);\/\/ \u8b8a\u91cf<\/p>\n<p>Init_VECTOR3D(&amp;explosion-&gt;acceleration, 0.0f, -5.0f, 0.0f);\/\/ \u52a0\u901f\u5ea6<\/p>\n<p>PARTICLE_PTR particle;\/\/ \u7c92\u5b50<\/p>\n<p>for (int i = 0; i &lt; count; ++i){<\/p>\n<p>particle = &amp;explosion-&gt;array[i];\/\/ \u7c92\u5b50<\/p>\n<p>Buid_Explosion(explosion, particle);\/\/\u751f\u6210\u7c92\u5b50\u300e\u7206\u70b8\u300f\u7279\u6548<\/p>\n<p>}<\/p>\n<p><a href=\"https:\/\/www.bookcard.net\/wordpress\/directsound3d\/\">Set_Pos_DirectSound<\/a>(&amp;explosion_sound3D, pos-&gt;x, pos-&gt;y, pos-&gt;z);\/\/ \u8a2d\u7f6e\u97f3\u6e90\u4f4d\u7f6e<\/p>\n<p><a href=\"https:\/\/www.bookcard.net\/wordpress\/directsound3d\/\">Play_DirectSound<\/a>(&amp;explosion_sound3D, false);\/\/\u64ad\u653e\u97f3\u983b\u6578\u64da<\/p>\n<p>}<\/p>\n<p>\u751f\u6210\u7206\u70b8\u7c92\u5b50\u51fd\u5f0f<\/p>\n<p>void Buid_Explosion(EXPLOSION_PTR explosion, PARTICLE_PTR\u00a0 particle){<\/p>\n<p>\/\/ \u5728\u767c\u5c04\u5340\u96a8\u6a5f\u4f4d\u7f6e\u751f\u6210\u7c92\u5b50<\/p>\n<p>particle-&gt;pos.x = explosion-&gt;origin.x + FRAND_RANGE1() * explosion-&gt;spread;\/\/ \u50b3\u64ad<\/p>\n<p>particle-&gt;pos.y = explosion-&gt;origin.y + FRAND_RANGE1() * explosion-&gt;spread;<\/p>\n<p>particle-&gt;pos.z = explosion-&gt;origin.z + FRAND_RANGE1() * explosion-&gt;spread;<\/p>\n<p>\/\/\u7d66\u7c92\u5b50\u96a8\u6a5f\u901f\u5ea6<\/p>\n<p>particle-&gt;velocity.x += FRAND_RANGE1() * explosion-&gt;velocity.x;<\/p>\n<p>particle-&gt;velocity.y += FRAND_RANGE1() * explosion-&gt;velocity.y;<\/p>\n<p>particle-&gt;velocity.z += FRAND_RANGE1() * explosion-&gt;velocity.z;<\/p>\n<p>\/\/ \u52a0\u901f\u5ea6<\/p>\n<p>particle-&gt;acceleration = explosion-&gt;acceleration;<\/p>\n<p>\/\/ \u751f\u547d\u9031\u671f<\/p>\n<p>particle-&gt;energy = 1.5f + FRAND_RANGE1() \/ 2.0f;<\/p>\n<p>\/\/ \u984f\u8272<\/p>\n<p>particle-&gt;color[0] = 1.0f;<\/p>\n<p>particle-&gt;color[1] = 0.5f + FRAND_RANGE1() * 0.5f;<\/p>\n<p>particle-&gt;color[2] = 0.0f;<\/p>\n<p>particle-&gt;color[3] = 1.0f;<\/p>\n<p>\/\/ \u984f\u8272\u589e\u91cf<\/p>\n<p>particle-&gt;color_delta[0] = 0.0f;<\/p>\n<p>particle-&gt;color_delta[1] = -(particle-&gt;color[1] \/ 2.0f) \/ particle-&gt;energy;<\/p>\n<p>particle-&gt;color_delta[2] = 0.0f;<\/p>\n<p>particle-&gt;color_delta[3] = -1.0f \/ particle-&gt;energy;<\/p>\n<p>\/\/ \u8a2d\u7f6e\u7c92\u5b50\u7684\u5927\u5c0f<\/p>\n<p>particle-&gt;size = explosion-&gt;size + FRAND_RANGE1() * explosion-&gt;size_variation;<\/p>\n<p>particle-&gt;size_delta = -particle-&gt;size \/ particle-&gt;energy;<\/p>\n<p>}<\/p>\n<p>\u91cb\u653e\u300e\u7206\u70b8\u300f\u7279\u6548\u51fd\u5f0f<\/p>\n<p>void Free_Explosion(EXPLOSION_PTR explosion){<\/p>\n<p>if (explosion-&gt;array != NULL)<\/p>\n<p>free(explosion-&gt;array);<\/p>\n<p>explosion-&gt;state = MODEL3D_STATE_NULL;<\/p>\n<p>memset(explosion, 0, sizeof(EXPLOSION));\/\/ \u6e05\u7a7a<\/p>\n<p>}<\/p>\n<p>\u66f4\u65b0\u300e\u7206\u70b8\u300f\u7279\u6548\u51fd\u5f0f<\/p>\n<p>deltaTime:\u6642\u9593\u9593\u9694<\/p>\n<p>void Update_Explosion(EXPLOSION_PTR explosion, float deltaTime){<\/p>\n<p>PARTICLE_PTR particle;\/\/ \u7c92\u5b50<\/p>\n<p>for (int i = 0; i &lt; explosion-&gt;count; ){<\/p>\n<p>particle = &amp;explosion-&gt;array[i];\/\/ \u7c92\u5b50<\/p>\n<p>\/\/ \u57fa\u65bc\u6642\u9593\u548c\u901f\u5ea6\u66f4\u65b0\u7c92\u5b50\u7684\u4f4d\u7f6e<\/p>\n<p>particle-&gt;pos = particle-&gt;pos + particle-&gt;velocity * deltaTime;<\/p>\n<p>particle-&gt;velocity = particle-&gt;velocity + particle-&gt;acceleration * deltaTime;<\/p>\n<p>particle-&gt;energy = particle-&gt;energy &#8211; deltaTime;<\/p>\n<p>particle-&gt;size += particle-&gt;size_delta * deltaTime;<\/p>\n<p>particle-&gt;color[3] += particle-&gt;color_delta[3] * deltaTime;<\/p>\n<p>particle-&gt;color[1] += particle-&gt;color_delta[1] * deltaTime;<\/p>\n<p>\/\/ \u5c07\u6700\u5f8c\u4e00\u500b\u7c92\u5b50\u79fb\u52d5\u5230\u7576\u524d\u4f4d\u7f6e,\u4e26\u6e1b\u5c11\u8a08\u6578.<\/p>\n<p>if (particle-&gt;energy &lt;= 0.0)<\/p>\n<p>explosion-&gt;array[i] = explosion-&gt;array[&#8211;explosion-&gt;count];<\/p>\n<p>else<\/p>\n<p>++i;<\/p>\n<p>}<\/p>\n<p>if (explosion-&gt;count == 0)<\/p>\n<p>Free_Explosion(explosion); \/\/ \u91cb\u653e<\/p>\n<p>}<\/p>\n<p>\u6e32\u67d3\u300e\u7206\u70b8\u300f\u7279\u6548\u7d0b\u7406\u51fd\u5f0f<\/p>\n<p>void Render_Explosion2(EXPLOSION_PTR explosion, <a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_billboard\/\">BILLBOARD_PTR billboard<\/a>){<\/p>\n<p>float viewMatrix[16];<\/p>\n<p>VECTOR3D right, up, pos;<\/p>\n<p>GLfloat size;<\/p>\n<p>right = billboard-&gt;right;<\/p>\n<p>up = billboard-&gt;up;<\/p>\n<p>\/\/ \u58d3\u5165\u7576\u524d\u5c6c\u6027<\/p>\n<p>glPushAttrib(GL_ALL_ATTRIB_BITS);<\/p>\n<p>glDisable(GL_DEPTH_TEST);<\/p>\n<p>glEnable(GL_BLEND);<\/p>\n<p>glBlendFunc(GL_SRC_ALPHA, GL_DST_ALPHA);<\/p>\n<p>glEnable(GL_TEXTURE_2D);<\/p>\n<p>glBindTexture(GL_TEXTURE_2D, explosion_texture.ID);<\/p>\n<p>glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);<\/p>\n<p>glBegin(GL_QUADS);<\/p>\n<p>for (int i = 0; i &lt; explosion-&gt;count; ++i){<\/p>\n<p>PARTICLE_PTR particle = &amp;explosion-&gt;array[i];\/\/ \u7c92\u5b50<\/p>\n<p>size = particle-&gt;size \/ 2;<\/p>\n<p>pos = particle-&gt;pos;<\/p>\n<p>glColor4fv(particle-&gt;color);<\/p>\n<p>glTexCoord2f(0.0, 0.0); glVertex3fv((pos + (right + up) * -size).M);<\/p>\n<p>glTexCoord2f(1.0, 0.0); glVertex3fv((pos + (right &#8211; up) * size).M);<\/p>\n<p>glTexCoord2f(1.0, 1.0); glVertex3fv((pos + (right + up) * size).M);<\/p>\n<p>glTexCoord2f(0.0, 1.0); glVertex3fv((pos + (up &#8211; right) * size).M);<\/p>\n<p>}<\/p>\n<p>glEnd();<\/p>\n<p>glDisable(GL_TEXTURE_2D);<\/p>\n<p>glDisable(GL_BLEND);<\/p>\n<p>glEnable(GL_DEPTH_TEST);<\/p>\n<p>glPopAttrib();\/\/ \u5f48\u51fa\u7576\u524d\u5c6c\u6027<\/p>\n<p>}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u904a\u6232\u4e2d\u6700\u5e38\u898b\u300e\u7206\u70b8\u300f\u7279\u6548.\u6700\u5e38\u898b\u505a\u6cd5\u662f\u4f7f\u7528\u300e\u7c92\u5b50\u7cfb\u7d71\u300f\u6a21\u64ec\u300e\u7206\u70b8\u300f.\u4f60\u5927\u7d04\u9700\u8981: \u9ed1\u5e95\u767d\u5713\u4f4d\u5716\u300ebmp\u300f\u5982\u4e0a\u5716 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.bookcard.net\/wordpress\/opengl_explosion\/\" class=\"more-link\">\u7e7c\u7e8c\u95b1\u8b80 <span class=\"screen-reader-text\">OpenGL\u4e4b\u7c92\u5b50\u7206\u70b8\u7279\u6548<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[62],"tags":[50],"class_list":["post-4195","post","type-post","status-publish","format-standard","hentry","category-opengl","tag-opengl","entry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/comments?post=4195"}],"version-history":[{"count":1,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4195\/revisions"}],"predecessor-version":[{"id":4197,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/posts\/4195\/revisions\/4197"}],"wp:attachment":[{"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/media?parent=4195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/categories?post=4195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bookcard.net\/wordpress\/wp-json\/wp\/v2\/tags?post=4195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}