<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>3D Library</title>
<link>https://balyberdin.com/library/</link>
<description>A curated library of useful motion design insights, tips and tricks for quick reference and practical guidance</description>
<author></author>
<language>en</language>
<generator>Aegea 11.3 (v4134)</generator>

<itunes:subtitle>A curated library of useful motion design insights, tips and tricks for quick reference and practical guidance</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>About IOR Material List</title>
<guid isPermaLink="false">16</guid>
<link>https://balyberdin.com/library/all/ior-list/</link>
<pubDate>Fri, 04 Jul 2025 11:40:44 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/ior-list/</comments>
<description>
&lt;p&gt;Even though I don’t create photorealistic renders, I often look up IOR values for glass, metal, and other materials. But the databases I find are not always user-friendly, or worse, just incorrect.&lt;/p&gt;
&lt;p&gt;To fix that, I spent over 55 hours and built my own, using only reliable sources:&lt;br /&gt;
💎 &lt;a href="https://balyberdin.com/tools/ior-list/"&gt;IOR Material List&lt;/a&gt;&lt;/p&gt;
&lt;div class="half-img no-radius"&gt;&lt;div class="e2-text-picture"&gt;
&lt;a href="https://balyberdin.com/tools/ior-list/" class="e2-text-picture-link"&gt;
&lt;img src="https://balyberdin.com/library/pictures/ior_list_13_min.png" width="1800" height="1200" alt="ior list for 3d designers" /&gt;
&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To make it easy to use, I added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smart search by name, synonyms, value, and category&lt;br /&gt;
You can find &lt;f&gt;saltwater&lt;/f&gt; by typing &lt;f&gt;sea&lt;/f&gt;, &lt;f&gt;1.34&lt;/f&gt; or &lt;f&gt;liquid&lt;/f&gt;&lt;/li&gt;
&lt;li&gt;A source link for each material&lt;br /&gt;
So you can check exactly where the value came from&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;One-click copy for any value&lt;/li&gt;
&lt;li&gt;Labels with ★ for the 20 most common materials&lt;/li&gt;
&lt;li&gt;CSV file with a full dataset of 120+ materials&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To keep things accurate, I had to add one more feature:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Separate table for metals with complex IOR values&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="half-img no-radius"&gt;&lt;div class="e2-text-picture"&gt;
&lt;a href="https://balyberdin.com/tools/ior-list/" class="e2-text-picture-link"&gt;
&lt;img src="https://balyberdin.com/library/pictures/ior_metals_03_min.png" width="1801" height="1200" alt="ior list of metals with complex iors for 3d designers" /&gt;
&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;To explain why I had to split the materials into two tables, let’s dive into the optics for a bit.&lt;/p&gt;
&lt;h2&gt;What is IOR?&lt;/h2&gt;
&lt;p&gt;In 3D, we use index of refraction to control how strong the refraction looks. But physically speaking, it measures how much light slows down when entering a material.&lt;/p&gt;
&lt;p&gt;For example, water has an IOR of &lt;f&gt;1.33&lt;/f&gt;. That means light travels about 25% slower in water than in a vacuum.&lt;/p&gt;
&lt;p&gt;Here’s why:&lt;br /&gt;
We use the speed of light in a vacuum as the baseline. It has an IOR of &lt;f&gt;1&lt;/f&gt;.&lt;br /&gt;
To find how much light slows down, we divide &lt;f&gt;1&lt;/f&gt; by the material’s IOR.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;f&gt;1 / 1.33 ≈ 0.75&lt;/f&gt;: light in water keeps only 75% of its speed&lt;/li&gt;
&lt;li&gt;&lt;f&gt;1 − 0.75 = 0.25&lt;/f&gt;: that’s 25% slower&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The higher the IOR, the slower the light, and the stronger the refraction.&lt;/p&gt;
&lt;h2&gt;Why does light bend when it slows down?&lt;/h2&gt;
&lt;p&gt;Here’s an easy way to picture it.&lt;/p&gt;
&lt;p&gt;Imagine roller skating on smooth pavement. Suddenly, your right foot hits grass and slows down. But your left foot keeps rolling, and your whole body starts to turn.&lt;/p&gt;
&lt;div class="half-img"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/ior_analogy_01@loop.mp4#t=0.001" width="1800" height="900" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;div&gt;&lt;p&gt;Light behaves the same way. When it hits a denser material at an angle, one side of the wave slows down first, causing it to change direction.&lt;/p&gt;
&lt;h2&gt;Why can’t IOR be below 1?&lt;/h2&gt;
&lt;p&gt;IOR less than &lt;f&gt;1&lt;/f&gt; would mean light goes faster than in vacuum when entering the material. That only happens in rare cases like x-rays or plasma, but not in everyday materials. That’s why:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A single IOR value below 1 is never physically accurate for materials we use in 3D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of course, unrealistic material settings are totally fine when they support artistic vision, but they just don’t belong in a physically accurate list.&lt;/p&gt;
&lt;h2&gt;Simple IOR for common materials&lt;/h2&gt;
&lt;p&gt;Most materials like glass or water interact with light in a simple way. Light just passes through with almost no absorption, and we only need to describe how much it bends.&lt;/p&gt;
&lt;p&gt;A single value is enough for that: the refractive index, &lt;f&gt;&lt;i&gt;n&lt;/i&gt;&lt;/f&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ice: &lt;f&gt;&lt;i&gt;n&lt;/i&gt; = 1.31&lt;/f&gt;&lt;br /&gt;
Light slows slightly, minor refraction&lt;/li&gt;
&lt;li&gt;Diamond: &lt;f&gt;&lt;i&gt;n&lt;/i&gt; = 2.42&lt;/f&gt;&lt;br /&gt;
Light slows more, stronger refraction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In reality, red, green and blue wavelengths bend slightly differently. This effect is called dispersion. But since the difference is usually small, we typically use the &lt;f&gt;&lt;i&gt;n&lt;/i&gt;&lt;/f&gt; value only for green light, simply because it sits near the center of the visible spectrum.&lt;/p&gt;
&lt;h2&gt;Complex IOR for metals&lt;/h2&gt;
&lt;p&gt;Metals behave in a more complex way. Light doesn’t pass through them. Instead, most of it reflects, and the rest gets absorbed.&lt;/p&gt;
&lt;p&gt;To describe this behavior, a single IOR value is not enough. Instead, we use a complex IOR, made of two parts:&lt;br /&gt;
&lt;f&gt;&lt;i&gt;n&lt;/i&gt;&lt;/f&gt; (real part) — controls brightness and color of reflections in combination with &lt;f&gt;&lt;i&gt;κ&lt;/i&gt;&lt;/f&gt;&lt;br /&gt;
&lt;f&gt;&lt;i&gt;κ&lt;/i&gt;&lt;/f&gt; (imaginary part) — controls how much light gets absorbed&lt;/p&gt;
&lt;p&gt;Plus, metals reflect red, green, and blue light differently. That’s what gives them their color tint, like the yellow of gold. To capture this, we need a separate &lt;f&gt;&lt;i&gt;n, κ&lt;/i&gt;&lt;/f&gt; pair for each channel. That’s why it’s also called RGB IOR.&lt;/p&gt;
&lt;div class="no-radius"&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://balyberdin.com/library/pictures/complex_ior_gold_02.png" width="1800" height="310" alt="complex ior for gold" /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;In metals, light doesn’t travel through the material, so &lt;f&gt;&lt;i&gt;n&lt;/i&gt;&lt;/f&gt; doesn’t describe speed inside the material. It only affects how the reflection looks. That’s why &lt;f&gt;&lt;i&gt;n&lt;/i&gt;&lt;/f&gt; can be below &lt;f&gt;1&lt;/f&gt; in metals, but only as part of a complex IOR with &lt;f&gt;&lt;i&gt;κ&lt;/i&gt;&lt;/f&gt;.&lt;/p&gt;
&lt;p&gt;Technically, we could also use complex IOR values for non-transparent materials like wood or plastic, since they also absorb light. But their absorption is so minimal that one IOR value is accurate enough.&lt;/p&gt;
&lt;h2&gt;How to use complex IOR?&lt;/h2&gt;
&lt;p&gt;For most projects, RGB IOR is overkill. Usually it’s enough to set &lt;f&gt;Metalness&lt;/f&gt; to &lt;f&gt;1&lt;/f&gt; and pick the base and specular colors. For accurate colors, use values &lt;a href="https://physicallybased.info/"&gt;from Physically Based&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But if you want to be precise:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Check how your renderer works with RGB IOR:
&lt;ul&gt;
  &lt;li&gt;Redshift: use the &lt;f&gt;&lt;a href="https://help.maxon.net/c4d/en-us/#../Subsystems/Default/Content/html/IOR_To_Metal_Tints.html"&gt;IOR to Metal Tints&lt;/a&gt;&lt;/f&gt; node&lt;/li&gt;
  &lt;li&gt;Octane: set &lt;f&gt;Metallic Reflection Mode&lt;/f&gt; to &lt;f&gt;&lt;a href="https://docs.otoy.com/cinema4d/MetallicMaterial.html"&gt;RGB IOR&lt;/a&gt;&lt;/f&gt;&lt;/li&gt;
  &lt;li&gt;Cycles: in the &lt;f&gt;Metallic BSDF&lt;/f&gt; shader, set &lt;f&gt;Fresnel Type&lt;/f&gt; to &lt;f&gt;&lt;a href="https://docs.blender.org/manual/en/latest/render/shader_nodes/shader/metallic.html"&gt;Physical Conductor&lt;/a&gt;&lt;/f&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Find a metal in the IOR list&lt;/li&gt;
&lt;li&gt;Copy the RGB values for &lt;f&gt;&lt;i&gt;n&lt;/i&gt;&lt;/f&gt; and &lt;f&gt;&lt;i&gt;κ&lt;/i&gt;&lt;/f&gt;, and paste them in the same order as shown in the table&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It’s surprising how much complexity hides behind a simple value we use so often. That’s exactly why I built this database and wrote this article. To simplify workflows and shed light on what IOR actually means.&lt;/p&gt;
&lt;p&gt;If you want to dive deeper into the optics, I recommend these great videos by 3Blue1Brown. I partly used them as sources for this article:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/KTzGBJPuJwM?si=SGA66FsYH1AAkI3U"&gt;Visualizing Feynman’s lecture on the refractive index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/Cz4Q4QOuoo8?si=XWfDdlg1KkLSSYwE"&gt;Answering viewer questions about refraction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you’d like to suggest materials to add, feel free to reach out. I’m always looking to improve the list.&lt;/p&gt;
</description>
</item>

<item>
<title>About Metronome &amp; FPS to BPM Converter</title>
<guid isPermaLink="false">11</guid>
<link>https://balyberdin.com/library/all/metronome/</link>
<pubDate>Tue, 10 Jun 2025 23:39:04 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/metronome/</comments>
<description>
&lt;p&gt;As a 3D artist, I often need tools that simply don’t exist. So I started creating my own!&lt;/p&gt;
&lt;p&gt;When I work on animation without music, I need a rhythm. To find it, I usually search “metronome 120 BPM” on YouTube, download the click track, and use it. After doing this over 10 times, it started to feel clunky.&lt;/p&gt;
&lt;p&gt;So I decided to build my own metronome, since I needed it regularly and it was relatively simple to make:&lt;br /&gt;
💓 &lt;a href="https://balyberdin.com/tools/metronome/"&gt;Metronome &amp; FPS to BPM Converter&lt;/a&gt;&lt;/p&gt;
&lt;div class="half-img"&gt;&lt;div class="e2-text-picture"&gt;
&lt;a href="https://balyberdin.com/tools/metronome/" class="e2-text-picture-link"&gt;
&lt;img src="https://balyberdin.com/library/pictures/metronome_04_min.png" width="1498" height="1154" alt="metronome for animators and fps to bpm converter" /&gt;
&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Of course, lots of web metronomes already exist. But I built mine specifically for animation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wide BPM range: Generate click tracks from 30 to 300 BPM&lt;/li&gt;
&lt;li&gt;One-click download: Get a 1-minute WAV file with your chosen BPM instantly&lt;/li&gt;
&lt;li&gt;FPS to BPM converter: Input your frame rate and get BPMs that align perfectly. For example, at 30 FPS, 120 BPM gives you a beat every 15 frames&lt;/li&gt;
&lt;li&gt;Frame-perfect timing: Beats begin exactly at frame 0, not a random frame like many YouTube videos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One less workaround in my workflow, and hopefully yours too. I’ll keep building tools for problems that bug me enough to fix and sharing them to help others.&lt;/p&gt;
</description>
</item>

<item>
<title>Display Custom Material Controls: Cinema 4D, Redshift</title>
<guid isPermaLink="false">9</guid>
<link>https://balyberdin.com/library/all/c4d-custom-material-controls/</link>
<pubDate>Sun, 30 Mar 2025 22:48:53 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/c4d-custom-material-controls/</comments>
<description>
&lt;p&gt;When working with complex Redshift materials, it’s often useful to expose a few selected settings in the &lt;f&gt;Attribute Manager&lt;/f&gt; to have them easily accessible in one place.&lt;/p&gt;
&lt;div class="half-img"&gt;&lt;div class="e2-text-picture"&gt;
&lt;img src="https://balyberdin.com/library/pictures/c4d_custom_controls_03_min.jpg" width="892" height="718" alt="cinema 4d custom material controls" /&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It’s actually quite easy to set up, but the process isn’t very intuitive. Here’s a quick animation and a step-by-step breakdown of how to do it using a &lt;f&gt;Group&lt;/f&gt; node and the &lt;f&gt;Start Node&lt;/f&gt; setting.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/c4d_custom_controls_03_optim.mp4#t=0.001" width="1920" height="1080" controls alt="cinema 4d custom material controls" /&gt;

&lt;/div&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Create a Redshift material and open the &lt;f&gt;Node Editor&lt;/f&gt;&lt;/li&gt;
&lt;li&gt;Create a &lt;f&gt;Group&lt;/f&gt; node — this will be your container for all custom inputs&lt;/li&gt;
&lt;li&gt;Right-click the &lt;f&gt;Group&lt;/f&gt; node and select &lt;f&gt;Add Input → Add New Input&lt;/f&gt;&lt;/li&gt;
&lt;li&gt;Double-click the input to rename it to the parameter you want to control (in my case, IOR)&lt;/li&gt;
&lt;li&gt;Right-click the new input and select &lt;f&gt;Edit Port&lt;/f&gt;&lt;/li&gt;
&lt;li&gt;Set the &lt;f&gt;Data Type&lt;/f&gt; you need. Choose &lt;f&gt;Float&lt;/f&gt; for numbers. Close the window when done&lt;/li&gt;
&lt;li&gt;Double-click the &lt;f&gt;Group&lt;/f&gt; node to open it&lt;/li&gt;
&lt;li&gt;Drag the dot next to the input name into an empty space on the grid. In the popup that appears, choose &lt;f&gt;Add New Output&lt;/f&gt;&lt;/li&gt;
&lt;li&gt;Go back to the main material and connect the new output port from the &lt;f&gt;Group&lt;/f&gt; node to the parameter you want to control (for example, IOR on the RS Material)&lt;/li&gt;
&lt;li&gt;In the &lt;f&gt;Node Editor&lt;/f&gt;, select the &lt;f&gt;Group&lt;/f&gt; node and go to &lt;f1&gt;Node → Start Node&lt;/f1&gt; in the top menu.&lt;br /&gt;
This will make your custom controls appear in the &lt;f&gt;Attribute Manager&lt;/f&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, whenever you select the material in the &lt;f&gt;Material Manager&lt;/f&gt;, the &lt;f&gt;Attributes&lt;/f&gt; tab will show your custom material settings instead of the default Redshift ones.&lt;/p&gt;
&lt;p&gt;Using this approach, you can add additional inputs to the same &lt;f&gt;Group&lt;/f&gt; node, experiment with different data types (Float, Color, Vector, Bool, etc.), and create a clean, reusable, and user-friendly control panel for your Redshift materials.&lt;/p&gt;
</description>
</item>

<item>
<title>Organize Your Scene with Custom Icons: Cinema 4D</title>
<guid isPermaLink="false">8</guid>
<link>https://balyberdin.com/library/all/c4d-icons/</link>
<pubDate>Sat, 01 Mar 2025 00:52:04 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/c4d-icons/</comments>
<description>
&lt;p&gt;A great way to keep your projects organized in Cinema 4D is not just to group objects into nulls, but to assign custom icons to them. When each null has a unique icon for cameras, lights, and other elements, the scene becomes clearer and easier to navigate.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://balyberdin.com/library/pictures/before-after-c4d-icons.png" width="638" height="339" alt="cinema 4d custom icons" /&gt;
&lt;/div&gt;
&lt;h2&gt;Assign icons to null objects&lt;/h2&gt;
&lt;p&gt;Setting this up is simple:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Create null objects for different groups: geometry, cameras, lights, etc.&lt;/li&gt;
  &lt;li&gt;Go to &lt;a href="https://developers.maxon.net/docs/py/2025_1_0/modules/c4d.bitmaps/RESOURCEIMAGE.html"&gt;the Maxon icons page&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Search for an icon that fits your needs and copy its &lt;f&gt;Integer Value&lt;/f&gt; (this is the icon’s ID)
  &lt;li&gt;Select the null and paste the &lt;f&gt;ID&lt;/f&gt; into the &lt;f&gt;Basic → Icon&lt;/f&gt; field
&lt;img src="https://balyberdin.com/library/pictures/c4d-change-id-colour.jpg" style="max-width: 100%; height: auto;"&gt;
  &lt;li&gt;Assign colors to the nulls to make the separation between groups clearer&lt;/li&gt;
&lt;li&gt;Repeat for all nulls to create a well-organized, visually clear scene&lt;/li&gt;
&lt;p&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;h2&gt;Bonus tip: save this setup as your default scene&lt;/h2&gt;
&lt;p&gt;Instead of starting with an empty project every time you open Cinema 4D, set up your scene once and save it as your default startup file:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Arrange your scene with labeled nulls, assigned icons, and colors&lt;/li&gt;
&lt;li&gt;Go to &lt;f&gt;Window → Customization → Save as Default Scene&lt;/f&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, every time you start a new project, you’ll have a clean, well-organized scene ready to go!&lt;/p&gt;
</description>
</item>

<item>
<title>After Effects Expressions Cheat Sheet</title>
<guid isPermaLink="false">4</guid>
<link>https://balyberdin.com/library/all/ae-expressions/</link>
<pubDate>Sun, 24 Nov 2024 17:44:02 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/ae-expressions/</comments>
<description>
&lt;p&gt;I’ve put together a list of After Effects expressions that simplify my workflow. You won’t find basics like &lt;f&gt;loopOut()&lt;/f&gt; or &lt;f&gt;wiggle (.4,6)&lt;/f&gt; here, but nothing overly complex either.&lt;/p&gt;
&lt;p&gt;Most of these expressions are taken from the web and adapted to fit my needs, with only a few being entirely my own. I’ve included links to credit the authors where relevant.&lt;/p&gt;
&lt;h2&gt;Adaptive Text Box&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-text_02_@loop.mp4#t=0.001" width="1280" height="560" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Auto-resize the shape layer bounding box to the text length.&lt;/p&gt;
&lt;p&gt;Create a rectangle shape and add a text layer above it.&lt;br /&gt;
Apply this expression to the &lt;f&gt;Size&lt;/f&gt; parameter of the shape layer:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;margin_width = 60;
margin_height = 40;

text_width = thisComp.layer(index-1).sourceRectAtTime().width;
text_height = thisComp.layer(index-1).sourceRectAtTime().height;

box_width = text_width + margin_width*2;
box_height = text_height + margin_height*2;

[box_width, box_height]&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://creativecow.net/forums/thread/changing-shape-layers-size-width-due-to-text-width/"&gt;© Kalleheikki Kannisto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For multi-line text, apply this additional expression to the &lt;f&gt;Position&lt;/f&gt; of the shape layer. This automatically aligns the shape’s position with the text.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;x = value[0];
y = content(&amp;quot;Rectangle 1&amp;quot;).content(&amp;quot;Rectangle Path 1&amp;quot;).size[1]/2;
[x,y]&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Animated Wiggle&lt;/h2&gt;
&lt;p&gt;Easily animate wiggle using two sliders: one controls the frequency, and the other controls the amplitude. For the best results, animate only amplitude.&lt;/p&gt;
&lt;p&gt;Add two &lt;f&gt;Slider Controls&lt;/f&gt; to the layer and apply this expression:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;w_freq = effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;);
w_amplitude = effect(&amp;quot;Slider Control 2&amp;quot;)(&amp;quot;Slider&amp;quot;);

wiggle(w_freq,w_amplitude)&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Looping Wiggle&lt;/h2&gt;
&lt;p&gt;With this expression, wiggle starts and ends at the same point.&lt;/p&gt;
&lt;p&gt;If it doesn’t loop correctly, it’s likely because the loop time is too short for wiggle to return to the starting point. Just increase &lt;f&gt;loopTime&lt;/f&gt; or &lt;f&gt;freq&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;freq = 1;
amp = 65;

startTime = 0; // Loop start time
loopTime = 3; // Loop duration in seconds

t = (time+startTime) % loopTime;
wiggle1 = wiggle(freq, amp, 1, 0.5, t);
wiggle2 = wiggle(freq, amp, 1, 0.5, t - loopTime);

linear(t, 0, loopTime, wiggle1, wiggle2)&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="http://www.motionscript.com/design-guide/looping-wiggle.html"&gt;© Dan Ebberts&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Pin Shape Layer to One Side&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_size-2_02_@loop.mp4#t=0.001" width="1280" height="560" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Keep one of the shape’s sides fixed while adjusting the &lt;f&gt;Size&lt;/f&gt;.&lt;/p&gt;
&lt;p&gt;Apply this expression to the &lt;f&gt;Position&lt;/f&gt; of a shape layer:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;pinTo = &amp;quot;left&amp;quot;; // top, bottom, right or left
chosenShape = content(&amp;quot;Rectangle 1&amp;quot;).content(&amp;quot;Rectangle Path 1&amp;quot;);

if (pinTo == &amp;quot;top&amp;quot;){
     x = chosenShape.position[0];
     y = chosenShape.position[1]+chosenShape.size[1]/2;
}

else if (pinTo == &amp;quot;bottom&amp;quot;){
     x = chosenShape.position[0];
     y = chosenShape.position[1]-chosenShape.size[1]/2;
}

else if (pinTo == &amp;quot;right&amp;quot;){
     x = chosenShape.position[0]-chosenShape.size[0]/2
     y = chosenShape.position[1]
}

else if (pinTo == &amp;quot;left&amp;quot;){
     x = chosenShape.position[0]+chosenShape.size[0]/2;
     y = chosenShape.position[1]
}

[x,y]&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Rolling Circle and Square Rig&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_rolling_rig_02_@loop.mp4#t=0.001" width="1280" height="560" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;h3&gt;Rolling Circle&lt;/h3&gt;
&lt;p&gt;Apply this to the &lt;f&gt;Rotation&lt;/f&gt; and animate the &lt;f&gt;Position&lt;/f&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;transform.position[0]-(content(&amp;quot;Ellipse 1&amp;quot;).content(&amp;quot;Ellipse Path 1&amp;quot;).size[0]/2)-transform.position[0]/2&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Rolling Square&lt;/h3&gt;
&lt;p&gt;This expression works with shapes, layers and compositions.&lt;/p&gt;
&lt;p&gt;Apply the expression to the &lt;f&gt;Position&lt;/f&gt;. Add a &lt;f&gt;Slider Control&lt;/f&gt; to the same layer. Animate the &lt;f&gt;Rotation&lt;/f&gt;. If the square doesn’t roll correctly, adjust the &lt;f&gt;Slider Control&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;targetLayer = thisLayer;
squareSize = targetLayer.sourceRectAtTime().width;
squareDiag = (Math.sqrt(2)*squareSize)/2/3.5;

try{
    squareOffset = effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;);
}

catch(err) {
    squareOffset = 0;
}


rot=transform.rotation;
scl=transform.scale[0]/100;
w=(squareSize/2)*scl;
r=(degreesToRadians(rot))*2;
t=transform.position;

[t[0]+w*rot/45,t[1]-(Math.abs((squareDiag+squareOffset)*Math.sin(r)))*scl];&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://youtu.be/sVg8jnajLSk"&gt;Based on Mikey Borup’s expression&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Stepped Rotation&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_rotator_03_@loop.mp4#t=0.001" width="1280" height="670" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;An alternative to &lt;f&gt;time*n&lt;/f&gt;. Instead of a smooth rotation, it creates a stepped movement. I usually use it to animate clock hands, gears or other similar mechanisms.&lt;/p&gt;
&lt;p&gt;Apply to the &lt;f&gt;Rotation&lt;/f&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;angle = 15; // Rotation angle per second
rotateDuration = 10; // Duration of rotation in frames

rotateDurationFr = rotateDuration/(1/thisComp.frameDuration);

wholeSecond = Math.floor(time);
startAngle = wholeSecond * angle;
ease(time, wholeSecond, wholeSecond + rotateDurationFr, startAngle, startAngle + angle)&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://creativecow.net/forums/thread/clock-second-hand-ticking/"&gt;© Xinlai Ni&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Advanced Stepped Rotation&lt;/h2&gt;
&lt;p&gt;A more customizable version of the stepped rotation expression.&lt;/p&gt;
&lt;p&gt;Apply to the &lt;f&gt;Rotation&lt;/f&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;angle = 15; // Rotation angle per second
rotateDuration = 6; // Duration of rotation in frames
timeStop = 5; // Stop duration between rotations
offset = 0; // Offset of the initial frame 

fr = timeToFrames(time)+offset;

cycle = timeStop+rotateDuration;
n = Math.floor(fr/cycle);
cur_phase = fr-n*cycle;

if((cur_phase)&amp;gt;timeStop){
angle*n+(cur_phase-timeStop)*angle/rotateDuration;
}
else{
angle*n;
}&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://aexpressions.ru/expressions/circular/analogue-clock/"&gt;© aexpressions&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Maintain Scale When Parented&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_maintain-scale_02_@loop.mp4#t=0.001" width="1280" height="670" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When you parent one object to another and scale the parent, both layers will scale. This expression prevents the child layer from scaling and only moves it by position.&lt;/p&gt;
&lt;p&gt;Apply to the layer’s &lt;f&gt;Scale&lt;/f&gt;, which should have a constant size:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;s = [];
ps = parent.transform.scale.value;
for (i = 0; i &amp;lt; ps.length; i++){
s[i] = value[i]*100/ps[i];
}
s&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1a3ArTUHAJwVi-ObZofvz6IfrKbSGSENlaTIRTs8pAJU/edit?pageId=116871612094468624414#gid=0"&gt;© JR Canest&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Checkbox Switcher&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_switcher_02_@loop.mp4#t=0.001" width="1020" height="490" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Toggle any value with a checkbox.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Checkbox Control&lt;/f&gt; to the layer with the expression.&lt;br /&gt;
Apply this expression to a parameter you want to control:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;if (effect(&amp;quot;Checkbox Control&amp;quot;)(1) == 0) 0 else 100&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Shape Layer Loop&lt;/h2&gt;
&lt;p&gt;Standard &lt;f&gt;loopOut()&lt;/f&gt; doesn’t work with shape layers, but this expression does.&lt;/p&gt;
&lt;p&gt;Apply to the &lt;f&gt;Path&lt;/f&gt; of the shape layer:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;try{
pingPong = false; // Set to true if pingPong is needed

timeStart = thisProperty.key(1).time;
duration = thisProperty.key(thisProperty.numKeys).time-timeStart;
quant=Math.floor((time-timeStart)/duration);

if(quant&amp;lt;0) quant = 0

if(quant%2 == 1 &amp;amp;&amp;amp; pingPong == true){
t = 2*timeStart+ (quant+1)*duration - time;
}

else{
t = time-quant*duration;
}
}
catch(err){
t = time;
}
thisProperty.valueAtTime(t)&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://aexpressions.ru/expressions/loop/loopout-path-ping-pong/"&gt;© aexpressions&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Range Mapper&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_range-mapper_03_@loop.mp4#t=0.001" width="1150" height="560" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Remap input values to a different output range.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Slider Control&lt;/f&gt; to a layer with expression and apply this to any parameter:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;input = effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;);

inputLow = 0;
inputHigh = 100;
outputLow = 450;
outputHigh = 650;

linear(input,inputLow,inputHigh,outputLow,outputHigh)&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://creativecow.net/forums/thread/range-mapping-expression/"&gt;© Dan Ebberts&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Maintain Stroke Width When Scaling&lt;/h2&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp_stroke-scale_02_@loop.mp4#t=0.001" width="1280" height="670" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Keep a constant stroke width when scaling a shape.&lt;/p&gt;
&lt;p&gt;Apply this to the &lt;f&gt;Stroke Width&lt;/f&gt; of the shape layer:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;value / length(toComp([0,0]), toComp([0.7071,0.7071])) || 0.001;&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://battleaxe.tumblr.com/post/101945073972/maintain-stroke-weight-expression"&gt;© Adam Plouff&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Counters&lt;/h2&gt;
&lt;p&gt;A collection of 6 counter expressions for various use cases. All of these counters are basically text layers linked to slider controls, which can be keyframed.&lt;/p&gt;
&lt;h3&gt;1. Simple Counter&lt;/h3&gt;
&lt;div class="quarter-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-counter_simple_03_@loop.mp4#t=0.001" width="700" height="140" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Displays numbers with a fixed decimal place.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Slider Control&lt;/f&gt; to your text layer, it will control the counter. Apply expression to the &lt;f&gt;Source Text&lt;/f&gt;. Change the number of decimal places by adjusting the &lt;f&gt;toFixed(2)&lt;/f&gt; parameter.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;parseFloat(effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;)).toFixed(2)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;2. Comma Separator Counter&lt;/h3&gt;
&lt;div class="quarter-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-counter_comma_03_@loop.mp4#t=0.001" width="700" height="140" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Replaces the decimal point with a comma. If you happen to need a similar setup with more customization, it’s &lt;a href="http://keyframed.tv/how-to-format-a-slider-control-value-as-money-in-after-effects/"&gt;right here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Slider Control&lt;/f&gt; and apply expression to the &lt;f&gt;Source Text&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;c = parseFloat(effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;)).toFixed(2);
c.toString().replace(&amp;quot;.&amp;quot;, &amp;quot;,&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3. Counter with Additional Symbols&lt;/h3&gt;
&lt;div class="quarter-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-counter_symbols_03_@loop.mp4#t=0.001" width="700" height="140" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Adds symbols like &lt;f&gt;+&lt;/f&gt; or &lt;f&gt;%&lt;/f&gt; to the number.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Slider Control&lt;/f&gt; and apply expression to the &lt;f&gt;Source Text&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;&amp;quot;+&amp;quot;+parseFloat(effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;)).toFixed(2)+&amp;quot;%&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;4. Counter with Leading Zeros&lt;/h3&gt;
&lt;div class="quarter-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-counter_zeros_03_@loop.mp4#t=0.001" width="700" height="140" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Displays numbers like &lt;f&gt;001&lt;/f&gt; instead of &lt;f&gt;1&lt;/f&gt;.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Slider Control&lt;/f&gt; and apply expression to the &lt;f&gt;Source Text&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;zerosAmount = 3;

var slider = effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;);

function padStart(string, targetLength, character) {
string = (string instanceof String) ? string : string.toString();
targetLength = targetLength &amp;gt;&amp;gt; 0;
character = character || ' ';

while (string.length &amp;lt; targetLength) {
string = character + string;
}

return string;
};

if (slider &amp;gt;= 0) {
zeroAmount = zerosAmount + 1;
paddedString = padStart(parseFloat(slider.value).toFixed(0), zerosAmount, '0');
}

else {
paddedString = '-0'+padStart(parseFloat(slider.value).toFixed(0)*-1, zerosAmount, '0');
}

paddedString;&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://community.adobe.com/t5/after-effects/how-to-create-a-counting-number-but-starting-with-zeros/td-p/10632356"&gt;Based on Tomas Sinkunas’ expression&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;5. Digit Grouping Counter&lt;/h3&gt;
&lt;div class="quarter-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-counter_grouping_03_@loop.mp4#t=0.001" width="700" height="140" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Adds spacing to group digits, turning &lt;f&gt;30000&lt;/f&gt; into &lt;f&gt;30 000&lt;/f&gt;.&lt;/p&gt;
&lt;p&gt;Add a &lt;f&gt;Slider Control&lt;/f&gt; and apply expression to the &lt;f&gt;Source Text&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;num = parseFloat(effect(&amp;quot;Slider Control&amp;quot;)(&amp;quot;Slider&amp;quot;)).toFixed(0);
str = isNaN(num) ? &amp;quot;&amp;quot; : (num * 1 + &amp;quot;&amp;quot;);
str.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://creativecow.net/forums/thread/number-expression-with-decimals/"&gt;© Tomas Bumbulevičius&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;6. Large Number Counter:&lt;/h3&gt;
&lt;div class="quarter-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-counter_large_03_@loop.mp4#t=0.001" width="700" height="140" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For values above 1,000,000, use &lt;f&gt;Angle Control&lt;/f&gt; instead of a &lt;f&gt;Slider Control&lt;/f&gt;.&lt;/p&gt;
&lt;p&gt;Add an &lt;f&gt;Angle Control&lt;/f&gt; and apply expression to the &lt;f&gt;Source Text&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;number = Math.round(effect(&amp;quot;Angle Control&amp;quot;)(&amp;quot;Angle&amp;quot;)/360);

n=&amp;quot;&amp;quot; + number;
s=&amp;quot;&amp;quot;;
for(i=0, l=n.length; i&amp;amp;#60;l;  i++){
    if(s &amp;amp;&amp;amp; s!=&amp;quot;-&amp;quot; &amp;amp;&amp;amp; (l-i)%3 ==0)
                s+=&amp;quot; &amp;quot;; 
        s += n[i];
}
s;&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://chunkmotion.design/resources/after-effects-expressions/"&gt;© Chunk Motion&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Various Mini Expressions&lt;/h2&gt;
&lt;p&gt;And finally, 4 useful mini-expressions that often come in handy.&lt;/p&gt;
&lt;h3&gt;1. Link to Layer Above or Below&lt;/h3&gt;
&lt;div class="half-video"&gt;&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/en_exp-index-1_02_@loop.mp4#t=0.001" width="900" height="560" autoplay muted loop playsinline alt="" /&gt;

&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It’s not a complete expression, but only part of it. Instead of linking one layer to another using its name, it is sometimes more convenient to link to a layer above or below the layer with the expression.&lt;/p&gt;
&lt;p&gt;In the example, I link the box’s layer position to any layer above. To parent to a layer below instead, use &lt;f&gt;index+1&lt;/f&gt;.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;thisComp.layer(index-1)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;2. Constantly Accelerating Rotation&lt;/h3&gt;
&lt;p&gt;Add this to &lt;f&gt;Rotation&lt;/f&gt; for progressively faster spins:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;time*time*time*time&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;3. Keyframes with &lt;f&gt;time*n&lt;/f&gt;&lt;/h3&gt;
&lt;p&gt;Add constant motion while still allowing keyframes.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;value+time*11&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://youtu.be/rsW4fwscwKI?t=193"&gt;© Ben Marriott&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;4. Link Gradient Ramp to Layer&lt;/h3&gt;
&lt;p&gt;Prevent a gradient ramp from shifting when moving the layer. Apply to the &lt;f&gt;Start&lt;/f&gt; and &lt;f&gt;End&lt;/f&gt; of the gradient.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;toComp(value)&lt;/code&gt;&lt;/pre&gt;&lt;p class="foot"&gt;&lt;a href="https://aexpressions.ru/expressions/misc/link-ramp-to-layer/"&gt;© aeexpressions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;That’s it! This collection includes 23 expressions I use regularly.&lt;br /&gt;
&lt;a href="https://balyberdin.gumroad.com/l/ae-expressions"&gt;📁 The project file&lt;/a&gt; with all of them is available for free.&lt;/p&gt;
</description>
</item>

<item>
<title>Fix Noise Loop: Cinema 4D Redshift</title>
<guid isPermaLink="false">3</guid>
<link>https://balyberdin.com/library/all/fix-noise-loop/</link>
<pubDate>Wed, 23 Oct 2024 01:29:45 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/fix-noise-loop/</comments>
<description>
&lt;p&gt;When you create a Redshift material with &lt;f&gt;Maxon Noise&lt;/f&gt;, sometimes the loop doesn’t work. Here are two steps to solve the problem.&lt;/p&gt;
&lt;h2&gt;Disable Time Behavior&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Go to &lt;f&gt;Render Settings&lt;/f&gt; (Ctrl+B)&lt;/li&gt;
&lt;li&gt;Switch to &lt;f&gt;Advanced&lt;/f&gt; mode&lt;/li&gt;
&lt;li&gt;Go to &lt;f&gt;Redshift → System → Legacy&lt;/f&gt; and disable &lt;f1&gt;Time Behavior&lt;/f1&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-video"&gt;
&lt;video src="https://balyberdin.com/library/video/Fix-Noise-Looping_v3_min@loop.mp4#t=0.001" width="2130" height="1290" autoplay muted loop playsinline alt="Cinema 4D Redshift time behavior loop" /&gt;

&lt;/div&gt;
&lt;h2&gt;Check Loop Period&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Ensure that the FPS in both &lt;f&gt;Project Settings&lt;/f&gt; (Ctrl + D) and &lt;f&gt;Render Settings&lt;/f&gt; (Ctrl + B) match&lt;/li&gt;
&lt;li&gt;The &lt;f&gt;Loop Period&lt;/f&gt; for the noise is calculated in seconds. So it should equal the total number of frames divided by the FPS. For example, if your timeline has 60 frames and your FPS is 30, the &lt;f&gt;Loop Period&lt;/f&gt; should be 2 seconds.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After these adjustments, your noise should loop correctly.&lt;/p&gt;
&lt;p&gt;Bonus tip: Since the first and last frames are identical in a loop, you can render one frame less to avoid repeating the same frame and achieve a smoother transition.&lt;/p&gt;
</description>
</item>

<item>
<title>Fix Extrude Shading Issues: Cinema 4D</title>
<guid isPermaLink="false">2</guid>
<link>https://balyberdin.com/library/all/fix-extrude-shading/</link>
<pubDate>Fri, 30 Aug 2024 00:20:27 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/fix-extrude-shading/</comments>
<description>
&lt;p&gt;The &lt;f&gt;Phong Tag&lt;/f&gt; can sometimes create strange artifacts or defects, especially noticeable when using &lt;f&gt;Extrude&lt;/f&gt; with caps.&lt;/p&gt;
&lt;p&gt;To fix shading issues, switch the &lt;f&gt;Phong Tag&lt;/f&gt; from &lt;f&gt;Uniform&lt;/f&gt; to &lt;f1&gt;Angle and Area Weighted&lt;/f1&gt; or &lt;f1&gt;Square Area Weighted&lt;/f1&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://balyberdin.com/library/pictures/Extrude-Phong-Uniform-vs-Angle_v7_min.png" width="1520" height="1050" alt="fix extrude shading cinema 4d" /&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Intro</title>
<guid isPermaLink="false">1</guid>
<link>https://balyberdin.com/library/all/intro/</link>
<pubDate>Thu, 29 Aug 2024 23:38:26 +0200</pubDate>
<author></author>
<comments>https://balyberdin.com/library/all/intro/</comments>
<description>
&lt;p&gt;When I’m working in Cinema 4D, I frequently find myself googling solutions to problems or refreshing my memory on how to do something.&lt;/p&gt;
&lt;p&gt;Sometimes the answer is right in the first search result, but other times I end up watching two-hour videos or digging through dead forums in Google’s cache to find an answer to what seems like a simple question. And when I do find a solution, at best, I share it in a work chat, where it reaches just a few people.&lt;/p&gt;
&lt;p&gt;So, I decided to create this library to compile useful tips and tricks that can make life easier.&lt;/p&gt;
</description>
</item>


</channel>
</rss>