{"id":1605,"date":"2025-12-21T11:51:09","date_gmt":"2025-12-21T02:51:09","guid":{"rendered":"https:\/\/heyyocg.link\/?p=1605"},"modified":"2025-12-21T11:52:29","modified_gmt":"2025-12-21T02:52:29","slug":"particle-on-meshparticle","status":"publish","type":"post","link":"https:\/\/heyyocg.link\/en\/particle-on-meshparticle\/","title":{"rendered":"Spawning particles from a Static Mesh generated by Niagara"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>If an object is placed in the level, it\u2019s easy to spawn particles from a Static Mesh by using the <strong>Static Mesh Location<\/strong>\u3000module.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"300\" height=\"349\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh01-1.gif\" alt=\"\" class=\"wp-image-1537\"\/><\/figure>\n\n\n\n<p>However, there are many cases where you want to spawn sparks or particles along a Static Mesh that is controlled entirely inside Niagara\u2014such as slashes or helices. In those cases, you can manually adjust the particle positions so they <em>look<\/em> roughly correct, but that approach requires readjustment every time you change the slash direction or scale.<br>For complex meshes like helices, manual adjustment quickly becomes impractical.<\/p>\n\n\n\n<blockquote class=\"twitter-tweet\" data-media-max-width=\"560\"><p lang=\"ja\" dir=\"ltr\">Niagara\u3067\u51fa\u3057\u3066\u308bMesh\u304b\u3089Particle\u3092\u51fa\u3059<br>Slash\u3068\u304bHelix\u306a\u3069\u3067\u4fbf\u5229\u3067\u3001<br>\u5927\u304d\u3055\u3084\u4f4d\u7f6e\u3001\u56de\u8ee2\u304c\u5909\u308f\u3063\u3066\u3082\u81ea\u52d5\u3067\u8ffd\u5f93<br>Particle\u304c\u51fa\u308bMesh\u4e0a\u306e\u7bc4\u56f2\u3092\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3\u3067\u304d\u308b\u3088\u3046\u306b\u3082\u3057\u3066\u3044\u304d\u307e\u3059\uff01<br><br>\u4eca\u5ea6\u306eUE\u30a2\u30c9\u30d9\u30f3\u30c8\u30ab\u30ec\u30f3\u30c0\u30fc\u3067\u7d39\u4ecb\u3057\u307e\u3059\uff5e<a href=\"https:\/\/twitter.com\/hashtag\/UE5?src=hash&amp;ref_src=twsrc%5Etfw\">#UE5<\/a> <a href=\"https:\/\/twitter.com\/hashtag\/Niagara?src=hash&amp;ref_src=twsrc%5Etfw\">#Niagara<\/a> <a href=\"https:\/\/t.co\/uyQ1ocTZYY\">pic.twitter.com\/uyQ1ocTZYY<\/a><\/p>&mdash; HeyYo (@yo_hanashima) <a href=\"https:\/\/twitter.com\/yo_hanashima\/status\/1999826772733624758?ref_src=twsrc%5Etfw\">December 13, 2025<\/a><\/blockquote> <script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n\n\n\n<p>The method introduced in this article allows particles to automatically spawn from the mesh, even if the mesh\u2019s position or scale changes.<\/p>\n\n\n\n<p>Additionally, as shown in the video above, I\u2019ll also explain:<\/p>\n\n\n\n<ul>\n<li>How to give particles velocity aligned with the mesh orientation<\/li>\n\n\n\n<li>How to use the source mesh\u2019s UVs to spawn particles only from specific areas of a slash or helix<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">A Quick Announcement<\/h2>\n\n\n\n<p>Before getting into the explanation, let me briefly promote something.<\/p>\n\n\n\n<p>I\u2019ve released a course on <strong>Coloso<\/strong> that dives deep into using Niagara and Materials to create advanced VFX expressions.<br>Rather than just building examples, the course explains the underlying theory and mechanisms, with the goal of helping you internalize knowledge that can be broadly applied.<\/p>\n\n\n\n<p>If you\u2019re interested, please check it out!<\/p>\n\n\n\n<p><a href=\"https:\/\/bit.ly\/ColosoxHeyYo\">Mastering the Mechanics of Advanced Niagara &amp; Material VFX<\/a><\/p>\n\n\n\n<blockquote class=\"twitter-tweet\" data-media-max-width=\"560\"><p lang=\"en\" dir=\"ltr\">Hi all! <br>The Eng Sub version of my class &quot;Mastering the Mechanics of Advanced Niagara &amp; Material VFX&quot; will be up for pre-order on Coloso(<a href=\"https:\/\/twitter.com\/colosoglobal?ref_src=twsrc%5Etfw\">@colosoglobal<\/a>) soon!<br><br>Use the link below for a $55 coupon! (Valid for 48 hours)<br><br>Link: <a href=\"https:\/\/t.co\/WonHmK4SSJ\">https:\/\/t.co\/WonHmK4SSJ<\/a> <a href=\"https:\/\/t.co\/BuAYcu8cBQ\">pic.twitter.com\/BuAYcu8cBQ<\/a><\/p>&mdash; HeyYo (@yo_hanashima) <a href=\"https:\/\/twitter.com\/yo_hanashima\/status\/1999464264872984837?ref_src=twsrc%5Etfw\">December 12, 2025<\/a><\/blockquote> <script async src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n\n\n\n<h1 class=\"wp-block-heading\">Environment<\/h1>\n\n\n\n<p>UE5.5.4<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Overall Workflow<\/h2>\n\n\n\n<ol>\n<li>Use <strong>Static Mesh Location<\/strong> to spawn particles from the target Static Mesh<\/li>\n\n\n\n<li>Use <strong>Particle Attribute Reader<\/strong> to retrieve position, scale, and rotation data from the mesh particle<\/li>\n\n\n\n<li>Adjust particle spawn positions using the retrieved data<\/li>\n\n\n\n<li>Emit particles along the shape of the source mesh<\/li>\n\n\n\n<li>Filter particle spawn locations using the source mesh\u2019s UVs<\/li>\n<\/ol>\n\n\n\n<p>We\u2019ll go through these steps using a simple example.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Practice<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">0. Preparation<\/h2>\n\n\n\n<p>First, create an emitter that spawns a single mesh.<br>We\u2019ll use a mesh commonly used for slash effects.<\/p>\n\n\n\n<figure class=\"wp-block-image size-medium\"><img decoding=\"async\" width=\"300\" height=\"176\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-2-300x176.png\" alt=\"\" class=\"wp-image-1540\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-2-300x176.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-2-768x452.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-2.png 811w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/figure>\n\n\n\n<p>Simply set this mesh in a <strong>Mesh Renderer<\/strong>, and spawn one particle using <strong>Spawn Burst Instantaneous<\/strong>.<br>Name this emitter <strong>Mesh<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"772\" height=\"550\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-5.png\" alt=\"\" class=\"wp-image-1543\" style=\"aspect-ratio:1.4036363636363636;width:491px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-5.png 772w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-5-300x214.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-5-768x547.png 768w\" sizes=\"(max-width: 772px) 100vw, 772px\" \/><\/figure>\n\n\n\n<p>Next, create another emitter for the particles spawned from the mesh.<br>Add it using <strong>Add Minimal Emitter<\/strong>, set:<\/p>\n\n\n\n<ul>\n<li>Spawn Rate: 100<\/li>\n\n\n\n<li>Sprite Size: 3<\/li>\n<\/ul>\n\n\n\n<p>Name this emitter <strong>Particle<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"712\" height=\"579\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-4.png\" alt=\"\" class=\"wp-image-1542\" style=\"aspect-ratio:1.229706390328152;width:492px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-4.png 712w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-4-300x244.png 300w\" sizes=\"(max-width: 712px) 100vw, 712px\" \/><\/figure>\n\n\n\n<p>That completes the setup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Spawning Particles with Static Mesh Location<\/h2>\n\n\n\n<p>In the <strong>Particle<\/strong> emitter, add <strong>Static Mesh Location<\/strong>, and set the <strong>Default Mesh<\/strong> to the slash mesh spawned by the <strong>Mesh<\/strong> emitter.<\/p>\n\n\n\n<p>Since the source mesh will not change in this case, set <strong>Source Mode<\/strong> to <strong>Default Mesh Only<\/strong>.<br>If left at the default setting, attaching this Niagara System to another Static Mesh would cause the particle source mesh to change to the parent mesh\u2014this prevents that.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"834\" height=\"583\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-6.png\" alt=\"\" class=\"wp-image-1544\" style=\"aspect-ratio:1.430531732418525;width:496px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-6.png 834w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-6-300x210.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-6-768x537.png 768w\" sizes=\"(max-width: 834px) 100vw, 834px\" \/><\/figure>\n\n\n\n<p>For clarity, set the particle material to a simple <strong>Unlit Translucent<\/strong> material that only reflects <strong>Particle Color<\/strong>, and set the color to red.<\/p>\n\n\n\n<p>Now particles will randomly spawn across the surface of the slash mesh.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"463\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwdqwdwqfqw.jpg\" alt=\"\" class=\"wp-image-1549\" style=\"aspect-ratio:1.8401727861771058;width:578px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwdqwdwqfqw.jpg 852w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwdqwdwqfqw-300x163.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwdqwdwqfqw-768x417.jpg 768w\" sizes=\"(max-width: 852px) 100vw, 852px\" \/><\/figure>\n\n\n\n<p>However, if you modify the mesh particle\u2019s scale, position, or rotation, the particles spawned via Static Mesh Location will still be based on the default mesh transform\u2014causing visible offsets.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"927\" height=\"622\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/cqwfcqwfqwf.jpg\" alt=\"\" class=\"wp-image-1551\" style=\"aspect-ratio:1.4903536977491962;width:581px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/cqwfcqwfqwf.jpg 927w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/cqwfcqwfqwf-300x201.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/cqwfcqwfqwf-768x515.jpg 768w\" sizes=\"(max-width: 927px) 100vw, 927px\" \/><figcaption class=\"wp-element-caption\">(Example: rotating the mesh particle)<\/figcaption><\/figure>\n\n\n\n<p>Our goal is to make particle spawn positions automatically follow changes in the mesh particle\u2019s scale, position, and rotation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Retrieving Mesh Position, Scale, and Rotation with Particle Attribute Reader<\/h2>\n\n\n\n<p>To access particle data controlled by another emitter, we use <strong>Particle Attribute Reader<\/strong>.<\/p>\n\n\n\n<p>This was covered in a previous article, so if you\u2019re unfamiliar with it, please read this first:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-heyyo-cg wp-block-embed-heyyo-cg\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"a2FCEnHyR1\"><a href=\"https:\/\/heyyocg.link\/en\/ue4-26-niagara-advanced-particle-attribute-reader-basic\/\">Niagara Advanced Guide &#8211; Particle Attribute Reader<\/a><\/blockquote><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Niagara Advanced Guide &#8211; Particle Attribute Reader&#8221; &#8212; HeyYo CG\" src=\"https:\/\/heyyocg.link\/en\/ue4-26-niagara-advanced-particle-attribute-reader-basic\/embed\/#?secret=XvGEzypEOg#?secret=a2FCEnHyR1\" data-secret=\"a2FCEnHyR1\" width=\"500\" height=\"282\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>First, create a <strong>Particle Attribute Reader<\/strong> as an <strong>Emitter Attribute<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"812\" height=\"205\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-016.jpg\" alt=\"\" class=\"wp-image-1554\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-016.jpg 812w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-016-300x76.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-016-768x194.jpg 768w\" sizes=\"(max-width: 812px) 100vw, 812px\" \/><\/figure>\n\n\n\n<p>Add it to <strong>Emitter Spawn<\/strong>, and set <strong>Emitter Binding<\/strong> to the name of the emitter you want to read from\u2014in this case, <strong>Mesh<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"871\" height=\"287\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dggsgswgewg.jpg\" alt=\"\" class=\"wp-image-1555\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dggsgswgewg.jpg 871w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dggsgswgewg-300x99.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dggsgswgewg-768x253.jpg 768w\" sizes=\"(max-width: 871px) 100vw, 871px\" \/><\/figure>\n\n\n\n<p>Next, create a <strong>Scratch Pad Module<\/strong> in <strong>Particle Spawn<\/strong> and name it <strong>ApplyMeshTransform<\/strong>.<br>Inside this module, we\u2019ll retrieve the mesh\u2019s position, scale, and rotation, and apply them to the particle position.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"360\" height=\"145\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wdqggggewf.jpg\" alt=\"\" class=\"wp-image-1559\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wdqggggewf.jpg 360w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wdqggggewf-300x121.jpg 300w\" sizes=\"(max-width: 360px) 100vw, 360px\" \/><\/figure>\n\n\n\n<p>Add Particle Attribute Reader input to <strong>Map Get<\/strong> node.<\/p>\n\n\n\n<p>We want the following attributes:<\/p>\n\n\n\n<ul>\n<li>Position: <code>Position<\/code> (Position type)<\/li>\n\n\n\n<li>Scale: <code>Scale<\/code> (Vector3 type)<\/li>\n\n\n\n<li>Rotation: <code>MeshOrientation<\/code> (Quaternion type)<\/li>\n<\/ul>\n\n\n\n<p>For each, add a corresponding <strong>Get &lt;Type&gt; by Index<\/strong> node and set the Attribute name accordingly.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"752\" height=\"615\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwqfqwfqwf.jpg\" alt=\"\" class=\"wp-image-1556\" style=\"aspect-ratio:1.2227642276422763;width:543px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwqfqwfqwf.jpg 752w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwqfqwfqwf-300x245.jpg 300w\" sizes=\"(max-width: 752px) 100vw, 752px\" \/><\/figure>\n\n\n\n<p>Since the mesh emitter spawns only one particle via Spawn Burst Instantaneous, its <strong>Particle Index<\/strong> is <code>0<\/code>.<\/p>\n\n\n\n<p>The Particle Index corresponds to the <strong>Execution Index<\/strong>, which is assigned sequentially starting from 0.<br>Because only one mesh particle exists, its Execution Index is 0.<\/p>\n\n\n\n<p>With this, we can retrieve the mesh\u2019s position, scale, and rotation.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Adjusting Particle Spawn Position Using Retrieved Data<\/h2>\n\n\n\n<p>Position, scale, and rotation together are commonly referred to as a <strong>Transform<\/strong>.<br>You\u2019ll recognize this from the Transform values shown in the Details panel when selecting an object in the level.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"644\" height=\"115\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwfqfqfq.jpg\" alt=\"\" class=\"wp-image-1557\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwfqfqfq.jpg 644w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwfqfqfq-300x54.jpg 300w\" sizes=\"(max-width: 644px) 100vw, 644px\" \/><\/figure>\n\n\n\n<p>To apply this transform to particle positions, we use <strong>Apply Local Transform<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"546\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1024x546.png\" alt=\"\" class=\"wp-image-1558\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1024x546.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-300x160.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-768x410.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1536x819.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul>\n<li>Connect the original particle position to <strong>InputVector<\/strong><\/li>\n\n\n\n<li>Set:\n<ul>\n<li>Position \u2192 Translate<\/li>\n\n\n\n<li>Scale \u2192 Scale<\/li>\n\n\n\n<li>MeshOrientation \u2192 Rotate<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>This transforms the particle position by applying the mesh transform.<\/p>\n\n\n\n<p>For <strong>InputVector<\/strong>, use the particle\u2019s original Position (via Map Get).<br>Although a conversion node from Position to Vector is created automatically, this is just for large-world support and can be ignored here.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"498\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ffefqqwqffff-1024x498.jpg\" alt=\"\" class=\"wp-image-1560\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ffefqqwqffff-1024x498.jpg 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ffefqqwqffff-300x146.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ffefqqwqffff-768x374.jpg 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ffefqqwqffff.jpg 1050w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Finally, use <strong>Map Set<\/strong> to write the output back to <strong>Position<\/strong>.<\/p>\n\n\n\n<p>Don\u2019t forget to assign the Particle Attribute Reader input in the Scratch Pad Module.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"188\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1.png\" alt=\"\" class=\"wp-image-1561\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1.png 889w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1-300x63.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-1-768x162.png 768w\" sizes=\"(max-width: 889px) 100vw, 889px\" \/><\/figure>\n\n\n\n<p>At this point, there are two important considerations.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Note \u2460: Use Local Space<\/h3>\n\n\n\n<p>Because scale and rotation depend heavily on the pivot position, both the mesh and particle emitters must use <strong>Local Space<\/strong>, with the Niagara System\u2019s position as the pivot.<\/p>\n\n\n\n<p>Enable <strong>Local Space<\/strong> in the Emitter Properties for both emitters.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"645\" height=\"163\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wfwfwfaaa.jpg\" alt=\"\" class=\"wp-image-1562\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wfwfwfaaa.jpg 645w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wfwfwfaaa-300x76.jpg 300w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Note \u2461: Set the Scale Properly<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"766\" height=\"188\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-3.png\" alt=\"\" class=\"wp-image-1563\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-3.png 766w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-3-300x74.png 300w\" sizes=\"(max-width: 766px) 100vw, 766px\" \/><\/figure>\n\n\n\n<p>Even if the mesh particle\u2019s <strong>Mesh Scale Mode<\/strong> is set to <em>Unset<\/em>, the mesh still appears at scale 1 visually\u2014but the Particle Attribute Reader will not retrieve the correct scale value.<\/p>\n\n\n\n<p>Make sure the scale is explicitly set.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"722\" height=\"149\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwfwefwefwggg.jpg\" alt=\"\" class=\"wp-image-1564\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwfwefwefwggg.jpg 722w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwfwefwefwggg-300x62.jpg 300w\" sizes=\"(max-width: 722px) 100vw, 722px\" \/><\/figure>\n\n\n\n<p>Once configured, particles will correctly spawn on the mesh surface even when its position, scale, or rotation changes.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-4 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"301\" height=\"218\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh04.gif\" alt=\"\" class=\"wp-image-1567\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"301\" height=\"218\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh02-1.gif\" alt=\"\" class=\"wp-image-1568\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"301\" height=\"218\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh03.gif\" alt=\"\" class=\"wp-image-1566\"\/><\/figure>\n<\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>This completes the base setup for spawning particles from a Static Mesh generated in Niagara.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Emitting Particles Along the Mesh Shape<\/h2>\n\n\n\n<p>Now let\u2019s look at some practical extensions.<\/p>\n\n\n\n<p>First, emitting particles along the shape of the mesh.<br>For slash effects, you may want particles to fly opposite the motion trail or in the direction of the slash. This method is ideal for that.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"363\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh05-1.gif\" alt=\"\" class=\"wp-image-1571\"\/><\/figure>\n\n\n\n<p>Using the <strong>UV direction<\/strong> of the mesh works well here.<\/p>\n\n\n\n<p>In the slash example above, it applies velocity along the two directions:<\/p>\n\n\n\n<ul>\n<li>Red direction = V direction<\/li>\n\n\n\n<li>Blue direction = U direction<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"739\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dqqfqfqw-1024x739.jpg\" alt=\"\" class=\"wp-image-1572\" style=\"aspect-ratio:1.3856562922868743;width:504px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dqqfqfqw-1024x739.jpg 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dqqfqfqw-300x216.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dqqfqfqw-768x554.jpg 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dqqfqfqw.jpg 1074w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Let\u2019s implement this step by step.<\/p>\n\n\n\n<p>First, display a UV checker on the mesh.<br>The red arrow indicates the V direction, and the blue arrow indicates the U direction.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"604\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggrgwegewweg-1024x604.jpg\" alt=\"\" class=\"wp-image-1573\" style=\"aspect-ratio:1.695364238410596;width:510px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggrgwegewweg-1024x604.jpg 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggrgwegewweg-300x177.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggrgwegewweg-768x453.jpg 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggrgwegewweg.jpg 1147w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>You might wonder how to retrieve UV directions\u2014but <strong>Static Mesh Location already provides them<\/strong>.<\/p>\n\n\n\n<p>When using Static Mesh Location, the following attributes are automatically generated:<\/p>\n\n\n\n<ul>\n<li><code>SampledTangent<\/code> \u2192 U direction<\/li>\n\n\n\n<li><code>SampledBitangent<\/code> \u2192 V direction<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"540\" height=\"288\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggegwqw.jpg\" alt=\"\" class=\"wp-image-1574\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggegwqw.jpg 540w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fggegwqw-300x160.jpg 300w\" sizes=\"(max-width: 540px) 100vw, 540px\" \/><\/figure>\n\n\n\n<p>When the emitter is in Local Space, these vectors represent the mesh\u2019s UV directions in local space.<\/p>\n\n\n\n<p>However, just like Position, these vectors must also be transformed using the mesh particle\u2019s transform. So we\u2019ll handle this inside <strong>ApplyMeshTransform<\/strong>.<\/p>\n\n\n\n<p>Add <strong>Tangent<\/strong> and <strong>Bitangent<\/strong> vector inputs to Map Get, and apply <strong>Apply Local Transform<\/strong> to them just like Position.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"554\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wwqeqweqdfq-1024x554.jpg\" alt=\"\" class=\"wp-image-1575\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wwqeqweqdfq-1024x554.jpg 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wwqeqweqdfq-300x162.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wwqeqweqdfq-768x415.jpg 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/wwqeqweqdfq.jpg 1080w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Store the outputs in new particle attributes:<\/p>\n\n\n\n<ul>\n<li><code>MeshTangent<\/code><\/li>\n\n\n\n<li><code>MeshBitangent<\/code><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"802\" height=\"645\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-7.png\" alt=\"\" class=\"wp-image-1576\" style=\"aspect-ratio:1.2434108527131782;width:567px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-7.png 802w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-7-300x241.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-7-768x618.png 768w\" sizes=\"(max-width: 802px) 100vw, 802px\" \/><\/figure>\n\n\n\n<p>To convert a Local attribute into a Particle attribute, connect it in Map Set, then right-click and choose <strong>Change Namespace \u2192 Particle<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"564\" height=\"708\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-017.jpg\" alt=\"\" class=\"wp-image-1577\" style=\"aspect-ratio:0.7966101694915254;width:405px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-017.jpg 564w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/K-017-239x300.jpg 239w\" sizes=\"(max-width: 564px) 100vw, 564px\" \/><\/figure>\n\n\n\n<p>Set the Tangent and Bitangent inputs to:<\/p>\n\n\n\n<ul>\n<li><code>SampledTangent<\/code><\/li>\n\n\n\n<li><code>SampledBitangent<\/code><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"182\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-8-1024x182.png\" alt=\"\" class=\"wp-image-1578\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-8-1024x182.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-8-300x53.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-8-768x136.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-8.png 1030w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Now we have UV directions that correctly follow the mesh\u2019s transform.<\/p>\n\n\n\n<p>To use them as velocity:<\/p>\n\n\n\n<ul>\n<li>Add <strong>Add Velocity<\/strong><\/li>\n\n\n\n<li>Set Velocity to <code>MeshTangent<\/code><\/li>\n\n\n\n<li>Adjust <strong>Velocity Speed Scale<\/strong><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"226\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwqffff.jpg\" alt=\"\" class=\"wp-image-1580\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwqffff.jpg 889w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwqffff-300x76.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fqwqffff-768x195.jpg 768w\" sizes=\"(max-width: 889px) 100vw, 889px\" \/><\/figure>\n\n\n\n<p>Particles will now fly along the mesh\u2019s U direction.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"363\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh06.gif\" alt=\"\" class=\"wp-image-1579\"\/><\/figure>\n\n\n\n<p>Using <code>MeshBitangent<\/code> instead sends particles along the V direction.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"363\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh07.gif\" alt=\"\" class=\"wp-image-1581\"\/><\/figure>\n\n\n\n<p>By combining two Add Velocity modules and adjusting their speed scales, you can freely control particle motion along the mesh shape.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"958\" height=\"490\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwefwegggg.jpg\" alt=\"\" class=\"wp-image-1582\" style=\"aspect-ratio:1.9551020408163264;width:633px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwefwegggg.jpg 958w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwefwegggg-300x153.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/fwefwegggg-768x393.jpg 768w\" sizes=\"(max-width: 958px) 100vw, 958px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"363\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh08.gif\" alt=\"\" class=\"wp-image-1583\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">5. Filtering Particle Spawn Locations Using UVs<\/h2>\n\n\n\n<p>Next is another very practical technique: filtering particle spawn locations using the mesh\u2019s UVs.<\/p>\n\n\n\n<p>In slash effects, only part of the mesh usually represents the visible trail.<br>If particles spawn from the entire mesh, they will appear in invisible areas and look unnatural.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"363\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh09.gif\" alt=\"\" class=\"wp-image-1584\"\/><\/figure>\n\n\n\n<p>Rather than restricting spawn positions directly on the mesh (which requires special mesh setup), we instead:<\/p>\n\n\n\n<ul>\n<li>Spawn particles across the entire mesh<\/li>\n\n\n\n<li>Immediately kill particles whose UVs fall outside a specified range<\/li>\n<\/ul>\n\n\n\n<p>This is a common technique, also used for particle dissolves.<\/p>\n\n\n\n<p>Create another <strong>Scratch Pad Module<\/strong> and name it <strong>FilterByUV<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"637\" height=\"387\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwqdqdfqf.jpg\" alt=\"\" class=\"wp-image-1585\" style=\"aspect-ratio:1.6459948320413436;width:390px;height:auto\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwqdqdfqf.jpg 637w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/dwqdqdfqf-300x182.jpg 300w\" sizes=\"(max-width: 637px) 100vw, 637px\" \/><\/figure>\n\n\n\n<p>Since the slash flows along the V direction, we\u2019ll filter using V (the same logic applies for U).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"264\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-9-1024x264.png\" alt=\"\" class=\"wp-image-1586\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-9-1024x264.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-9-300x77.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-9-768x198.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-9.png 1344w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Inside the module:<\/p>\n\n\n\n<ul>\n<li>Add Map Get inputs:\n<ul>\n<li><code>MeshUV<\/code> (Vector2)<\/li>\n\n\n\n<li><code>V Threshold Min<\/code> (float)<\/li>\n\n\n\n<li><code>V Threshold Max<\/code> (float)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Set up logic so that the particle\u2019s <strong>Alive<\/strong> attribute is <code>True<\/code> only when:<\/p>\n\n\n\n<p><code>V Threshold Min &lt; MeshUV.y &lt; V Threshold Max<\/code><\/p>\n\n\n\n<p>If <strong>Alive<\/strong> becomes False, the particle is killed in that frame.<\/p>\n\n\n\n<p>Set <code>MeshUV<\/code> to <code>SampledUV<\/code>, which is automatically provided by Static Mesh Location.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1006\" height=\"163\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/eqfefggsxvdfd.jpg\" alt=\"\" class=\"wp-image-1587\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/eqfefggsxvdfd.jpg 1006w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/eqfefggsxvdfd-300x49.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/eqfefggsxvdfd-768x124.jpg 768w\" sizes=\"(max-width: 1006px) 100vw, 1006px\" \/><\/figure>\n\n\n\n<p>Animate <code>V Threshold Min<\/code> and <code>V Threshold Max<\/code> to match the slash motion.<br>In this example, the slash moves from V = 1 to V = 0, so both thresholds animate from 1 to 0, with Max slightly delayed to define a visible range.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"743\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/feqffqfqbbb-1024x743.jpg\" alt=\"\" class=\"wp-image-1588\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/feqffqfqbbb-1024x743.jpg 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/feqffqfqbbb-300x218.jpg 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/feqffqfqbbb-768x558.jpg 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/feqffqfqbbb.jpg 1146w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Important note:<\/strong><br>The Curve Index must use the slash\u2019s normalized age. The default <code>NormalizedAge<\/code> refers to the particle\u2019s own lifetime, which is not suitable here.<\/p>\n\n\n\n<p>Since the slash lifetime matches the system lifetime (1 second), we use <strong>NormalizedLoopAge<\/strong> from the System attributes.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"427\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-10-1024x427.png\" alt=\"\" class=\"wp-image-1589\" srcset=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-10-1024x427.png 1024w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-10-300x125.png 300w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-10-768x320.png 768w, https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/image-10.png 1183w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>If lifetimes differ, you\u2019ll need to adjust the curve timing or the CurveIndex value accordingly.<\/p>\n\n\n\n<p>Finally, increase the Spawn Rate to 200 since many particles will be killed.<\/p>\n\n\n\n<p>With this setup, particles spawn cleanly along the visible slash trail.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"501\" height=\"363\" src=\"https:\/\/heyyocg.link\/wp-content\/uploads\/2025\/12\/ParticleOnMesh10.gif\" alt=\"\" class=\"wp-image-1590\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Spawning particles from Static Meshes generated in Niagara becomes extremely versatile when combined with these two additional techniques.<\/p>\n\n\n\n<p>While this approach uses Scratch Pad Modules and slightly more advanced Niagara features, I hope you\u2019ll find that it\u2019s not as difficult as it might seem once you try it yourself.<\/p>\n\n\n\n<p>If you\u2019re interested in deeper explanations\u2014such as more detailed breakdowns of tangents and underlying theory\u2014those are covered extensively in my course:<\/p>\n\n\n\n<p><a href=\"https:\/\/bit.ly\/ColosoxHeyYo\">Mastering the Mechanics of Advanced Niagara &amp; Material VFX<\/a><\/p>\n\n\n\n<p>Once again, my takeaway is the same as always:<br><em>Niagara is amazing\u2014you can do so many things with it.<\/em><\/p>\n\n\n\n<p>With that, Merry Christmas, and have a great CG life! \ud83c\udf84\u2728<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction If an object is placed in the level, it\u2019s easy to spawn particles from a Static Mesh by using the Static Mesh Location\u3000module. However, there are many cases where you want to spawn sparks or particles along a Static Mesh that is controlled entirely inside Niagara\u2014such as slashes or helices. In those cases, you [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1592,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","_mi_skip_tracking":false,"footnotes":"","_locale":"en_US","_original_post":"https:\/\/heyyocg.link\/?p=1531"},"categories":[17,31],"tags":[32,15,30],"modified_by":"yohanashima","_links":{"self":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts\/1605"}],"collection":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/comments?post=1605"}],"version-history":[{"count":4,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts\/1605\/revisions"}],"predecessor-version":[{"id":1610,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/posts\/1605\/revisions\/1610"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/media\/1592"}],"wp:attachment":[{"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/media?parent=1605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/categories?post=1605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/heyyocg.link\/wp-json\/wp\/v2\/tags?post=1605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}