AREA Blogs Feedhttp://area.autodesk.com/AREA is an Autodesk online community for 2D and 3D artists -- with free tutorials and downloads, movie and image galleries, professional industry artist interviews and job posting boards. AREA members also have access to Product-specific discussion forums, and blogs by Autodesk Media & Entertainment Software Product Developers.Sun, 14 Feb 2016 18:56:52 UTCMAXscript: saving and loading batch render jobsMaxStation<p>In the forum post&nbsp;<span style="line-height: 1.5em;"><a href="http://forums.autodesk.com/t5/3ds-max-3ds-max-design-general/copy-batch-render-jobs-into-another-max-file/m-p/6023414#M110973">Copy batch render jobs into another max file?</a>&nbsp;the question was asked if you can save the jobs from one scene and load these in another scene using MAXScript. And you can, there are all the necessary functions available in the&nbsp;</span><a href="http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_23E161BA_0FD0_4C88_8407_CA63D929D499_htm" style="line-height: 1.5em;">Interface: batchRenderMgr</a>.</p> <p>Download the scripts here:&nbsp;<a href="/userdata/blogs/maxstation/nicolas/batchloadsave.zip" style="line-height: 1.5em; color: white;">batchloadsave.zip</a></p> <p></p> <p>Batchrendersave.ms checks whether there are any batch render jobs in the scene and if so asks where to save the file. It then goes through the jobs and saves their properties. Some it can just save, for others it will check whether or not they have a value and only save them if they have one.</p> <p>Batchrenderload.ms gets the filename to load the settings from, asks whether or not to save the jobs in the current scene (if there are any), then loops through the lines in the text file: createing a new job every time it seems a "camera=" line and modifiies its settings using the values from the other lines.</p> <p></p> <p><strong>Some of the functions used:</strong></p> <ul> <li>batchRenderMgr.numViews - to get the number of jobs</li> <li>messagebox - to tell the user something</li> <li>getSaveFileName - let's the user enter a filename to save to</li> <li>createfile - create a file to write into</li> <li>batchRenderMgr.GetView - get a single job</li> <li>getopenfilename&nbsp;- let's the user select a filename to open</li> <li>batchRenderMgr.DeleteView - delete a job</li> <li>GetNodeByName - get a node by its name</li> <li>batchRenderMgr.CreateView - create a job</li> </ul> <p></p> <p><strong>A finally couple of things i ran into:</strong></p> <p>Camera node vs camera name. I'm saving the camera name in the text file but to create a new job i need the camera node itself. GetNodeByName does the trick.</p> <p>You can't rename a view if that name is already in use, it gives a "-- Runtime error: The parameter is invalid." error. I didn't want to go through all views to check if it already existed so used try and catch to print out when the rename failed.</p> <p>You don't have to use a camera when creating a job, you can use the viewport (but why would you want to do that?). Luckily if I pass undefined to the&nbsp;batchRenderMgr.CreateView it's happy.</p> <p>&nbsp;</p>Tue, 09 Feb 2016 12:57:35 UTChttp://area.autodesk.com/blogs/maxstation/n307-maxscript-saving-and-loading-batch-render-jobsEmulating a Particle System using MCGChristopher Diggins<p><span style="line-height: 1.5em;">In the M&amp;E division at Autodesk we have periodical hackathons where entire groups are given the opportunity to work on projects of our chosing for two-three days. We are then given the opportunity to showcase our work to the entire division and receive feedback from our leadership. I love this, because I get to work together with some really smart people on some interesting ideas.&nbsp;</span></p> <p>On<span style="line-height: 1.5em;">e of my hackathon projects last year, which I worked on with Kelvin Zelt, was to develop a simple particle system with MCG. Kelvin dubbed it project "Sprinkles". We managed to get a demo to work quite decently by using MCG as-is without any changes. We also found ways to make the core MCG evaluation much faster via lazy evaluation of arrays, but I'll save that for another post.&nbsp;</span></p> <p><span style="line-height: 1.5em;">In the Montreal Autodesk office at 10 Rue Duke, we have been hiring a lot of interns. This program is a huge success, and <strong><a href="http://careers.autodesk.com/careers/intern-and-new-grad-jobs">I encourage students to check out the listings</a></strong>. In fact several recent hires have come from the intern program. &nbsp;On the MCG team over the last year I have gotten to work with Kevin Derler, Marc-Antoine Nadeau, and Remi Cosette-Roberge. It has been a great experience for me, and they seem to have enjoyed it as well!&nbsp;</span></p> <p><span style="line-height: 1.5em;">Recently Remi took the particle project to another level: encapsulating a lot of the behavior in compounds and multi-threading the graph evaluation. &nbsp;</span></p> <p><span style="line-height: 1.5em;">https://www.youtube.com/watch?v=-NNu6amC3i4</span></p> <p><span style="line-height: 1.5em;">Because this was done using 3ds Max 2016,&nbsp;</span><span style="line-height: 1.5em;">I thought I would share it with you is as both an inspirational use of MCG, and a tutorial for some advanced concepts such as:</span></p> <ul> <li><span style="line-height: 1.5em;">Parallel pseudo-random number generation - see "RandInt" and "RandFloat"</span></li> <li><span style="line-height: 1.5em;">Using Ray Trace scene to quickly compute collision&nbsp;</span></li> <li><span style="line-height: 1.5em;">Caching to manage ray trace sceen&nbsp;</span></li> <li><span style="line-height: 1.5em;">Using simulation graphs to have predicatable results</span><span style="line-height: 1.5em;">&nbsp;</span></li> <li><span style="line-height: 1.5em;">Encapsulating complex behavior in compounds and using functions to describe behavior (e.g. particle construction, destruction, and updating).&nbsp;</span></li> </ul> <p><span style="line-height: 1.5em;">This MCG tool is not a real particle system, it is just a geometry objec that it generates a TriMesh that consists camera facing squares with UV coordinates, and vertex colors. Neither Remi or I are particularly good users of 3ds Max (though Remi has more skills than me already) so hopefully someone can share a better example!&nbsp;</span></p> <p><span style="line-height: 1.5em;">Here is the <strong><a href="/userdata/blogs/chris/MCGParticles.zip" mce_href="/userdata/blogs/chris/MCGParticles.zip">tool and a couple of sample 3ds Max files.</a></strong> You will need 3ds Max 2016, with at least SP1 installed. I hope you find it fun and useful! &nbsp;&nbsp;</span></p>Sat, 06 Feb 2016 13:21:39 UTChttp://area.autodesk.com/blogs/chris/emulating-a-particle-system-using-mcgStingray Intro Videosp1ut0nium<p>Hey everyone!</p> <p></p> <p>I'm back! I know I haven't blogged in a very long time. I get so caught up in making videos and what not that I forget to. But I'm back with three new videos from my Twitch.TV stream on using Stingray. You can watch them on Youtube now, as I am exporting all my live streams from now on.&nbsp;</p> <p></p> <p>Follow me on Twitch @: <a href="http://www.twitch.tv/matthewdoyle" title="Follow Matthew on Twitch.TV">Twitch.tv/MatthewDoyle<br /></a><span style="line-height: 1.5em;">Or Youtube @: </span><a href="https://www.youtube.com/user/MatthewDoyleArt" title="Follow Matthew on Youtube" style="line-height: 1.5em;">Youtube.com/MatthewDoyleArt&nbsp;</a></p> <p></p> <p></p> <p><a href="https://www.youtube.com/watch?v=MiDE53pab4k" title="Stingray - 20 Minute Overview">Stingray - 20 Minute Overview</a></p> <p>https://www.youtube.com/watch?v=MiDE53pab4k</p> <p><a href="https://www.youtube.com/watch?v=-zJSx8Ryc7E" title="Stingray - Intro to Lua">Stingray - Intro to Lua</a></p> <p>https://www.youtube.com/watch?v=-zJSx8Ryc7E</p> <p><a href="https://www.youtube.com/watch?v=moDD3cpVMsA" title="Stingray - Vehicle PhysX Intro">Stingray - Vehicle PhysX Intro</a></p> <p>https://www.youtube.com/watch?v=moDD3cpVMsA</p>Fri, 05 Feb 2016 21:06:20 UTChttp://area.autodesk.com/blogs/matthew/stingray-intro-videosThe Art of Fluid AnimationCory Mogk<p><a href="https://autodeskresearch.com/people/jos-stam">Jos Stam</a> wrote a book on <a href="https://www.crcpress.com/The-Art-of-Fluid-Animation/Stam/9781498700207">the Art of Fluid Animation</a> and I was lucky enough to help with the cover art using the 2D Fluids solver in Maya :)</p> <p><img src="/userdata/blogs/cory/fluidAnimationBook.jpg" width="429" height="648" /></p> <p>It's a really cool book - not your typical math, science or computer graphics book - and often reads like a rock 'n'roll biography.</p> <p><a href="https://autodeskresearch.com/blog/why-write-book-about-animating-fluids">In Jos' words</a>&nbsp;from his blog on the <a href="https://autodeskresearch.com/">Autodesk Research</a> site:</p> <p style="padding-left: 30px;"><em>Fluids are cool and they are everywhere. Think of tears, honey, hot showers, waterfalls, mud, lava and so on and so on&hellip; and fire and air and rocks. What? The last three ones surely aren&rsquo;t fluids you might think of. But they are fluids as well and that is the beauty of the study of fluids. A fluid is anything really that changes its shape over time in a seamless manner. Even cooler is that their slick meandering over time can be described using fancy mathematics.</em></p> <p style="padding-left: 30px;"><em>The book is a very personal view of my understanding and my contributions to fluid animation. I tried to make this book engaging and fun to read. I tried to communicate my passion for Art, Mathematics and Computer Programming. I hope it will appeal to a wide audience. Enjoy.</em></p> <p>If you're in Toronto, you can <a href="https://autodeskresearch.com/news/art-fluid-animation-tech-talk">hear Jos speak about fluids and his book this Thursday</a>&nbsp;at the local SIGGRAPH chapter meeting.</p> <p><img src="/userdata/blogs/cory/TECH-TALKS-JAN2016_JOS-STAM.jpg" width="720" height="522" /></p>Tue, 02 Feb 2016 21:32:46 UTChttp://area.autodesk.com/blogs/cory/the-art-of-fluid-animationWorld Space Effectsmcgblog<p>In many cases, procedural effects rely on the world space position, rotation, and scale of other objects in the scene.&nbsp;<span style="line-height: 1.5em;">For example, you might want to hang wires between the vertices of two separate objects, or you might want to model a plant using point helpers in the scene. In this post, we&rsquo;ll cover how to achieve these kinds of effects using MCG.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/01.png" width="1507" height="1006" /></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/01_1.jpg" width="1000" height="1000" /></p> <p>Let&rsquo;s start by understanding the concepts of &ldquo;local space&rdquo; and &ldquo;world space&rdquo;, and how they relate to MCG. Open the Max Creation Graph Editor, create the following graph, and save it as SpaceTest.maxtool. In the graph below, we&rsquo;re using the IgnoreSecond and Sequence operators to create a box mesh, and to print its vertex positions.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/02.png" width="1920" height="1079" /></p> <p>To see it in action, go to the &ldquo;Create Tab &gt; Max Creation Graph &gt; SpaceTest&rdquo;, and click on the grid to create a SpaceTest cube. When you move it, rotate it, or scale it in the scene, you&rsquo;ll notice that the position of each vertex is printed to the MaxScript Listener (&ldquo;Scripting &gt; MAXScript Listener&rdquo;).</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/03.png" width="1280" height="804" /></p> <p>Here, we see that the cube&rsquo;s &ldquo;Local Space Vertices&rdquo; are always defined in the same way, namely that they surround the local point [0,0,0]. What&rsquo;s more, we have enough information inside the graph to calculate the &ldquo;World Space Vertices&rdquo;, which correspond to the position of each vertex relative to the scene&rsquo;s origin.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/04.png" width="1535" height="975" /></p> <p>Before we move on, let&rsquo;s break down some important terms we&rsquo;ll be using as we continue this post:</p> <ol> <li><span style="line-height: 1.5em;">The term &ldquo;<strong>space</strong>&rdquo; is interchangeable with: &ldquo;coordinate system&rdquo;, &ldquo;coordinates&rdquo;, &ldquo;frame of reference&rdquo;, and &ldquo;basis&rdquo;. You might encounter those last two terms in math-oriented articles on Wikipedia.</span></li> <li><span style="line-height: 1.5em;">The concept of &ldquo;<strong>local space</strong>&rdquo; can be visualized as the MCG tool&rsquo;s coordinate system. In the example above, the box&rsquo;s vertices are always defined in relation to the same local point: [0,0,0], regardless of how the cube is eventually positioned in the scene. In fact, the most important thing to remember from this tutorial is that <span style="text-decoration: underline;">the mesh created by an MCG geometry (or an MCG modifier) must always be defined in relation to its local origin</span>. In a few moments, we&rsquo;ll see how this fits into the greater scheme of things.</span></li> <li><span style="line-height: 1.5em;">The concept of &ldquo;<strong>world space</strong>&rdquo; is also referred to as &ldquo;scene coordinates&rdquo;, or the &ldquo;global coordinate system&rdquo;. You can visualize the origin (i.e. [0,0,0]) of the world space as the center of the grid in your viewport.</span></li> </ol> <p>Now, we saw that we could convert the cube&rsquo;s local vertex positions into their equivalent world positions. To do that in our graph, we need to use the &ldquo;Geometry: Matrix&rdquo; implicit parameter. Note that if we were working inside an MCG modifier, we would have used the &ldquo;Modifier: Matrix&rdquo; implicit parameter instead.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/05.png" width="1196" height="469" /></p> <p>This matrix is used to convert a point from its position in local space into its position in world space. The inverse of this matrix does the opposite. It converts a point from its position in world space into its position in local space.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/06.png" width="1920" height="543" /></p> <p>If you feel like your head is spinning with all that information, here are the important points to keep in mind so far:</p> <ol> <li><span style="text-decoration: underline;"><span style="line-height: 1.5em;">The mesh created by an MCG geometry (or an MCG modifier) must always be defined in relation to its local origin.<br /><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/07.png" width="1150" height="493" /><br /></span></span></li> <li><span style="line-height: 1.5em;">&ldquo;Geometry: Matrix&rdquo; can be used to convert from local coordinates into world coordinates. This matrix should be used if you need to answer the following question: &ldquo;Given a &lt;point/vector/mesh/matrix&gt; in the tool&rsquo;s <span style="text-decoration: underline;">local space</span>, what is its equivalent in <span style="text-decoration: underline;">world space</span>?&rdquo;&nbsp;Recall that this is how we printed the cube&rsquo;s world space vertices above.<br /><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/08.png" width="912" height="826" /><br /></span></li> <li><span style="line-height: 1.5em;">The inverse (InvertMatrix) of &ldquo;Geometry: Matrix&rdquo; can be used to convert from world coordinates into local coordinates. This matrix should be used if you need to answer the following question: &ldquo;Given a &lt;point/vector/mesh/matrix&gt; in <span style="text-decoration: underline;">world space</span>, what is its equivalent in the tool&rsquo;s <span style="text-decoration: underline;">local space</span>?&rdquo;<br /><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/09.png" width="898" height="736" />&nbsp;</span></li> </ol> <p><span style="line-height: 1.5em;">With these points in mind, it&rsquo;s time to fasten your seatbelt and hang onto your hat, because we&rsquo;re going to make spaces collide. When you&rsquo;re ready, create the following MCG geometry graph, save it as LocalBoxWorldBox.maxtool, and evaluate it.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/10.png" width="1919" height="981" /></p> <p>Under the &ldquo;Create Tab &gt; Max Creation Graph&rdquo;, create a LocalBoxWorldBox geometry in the scene. You&rsquo;ll see two boxes appear: one box (Box1), which responds to your changes in position, rotation and scale, and another box (Box2), which remains fixed at the world origin.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/11.png" width="1718" height="978" /></p> <p>If you&rsquo;re a little bit freaked out, rest assured that this is a natural reaction, and that we&rsquo;ll gently unwind the apparent sorcery at work here.</p> <p><span style="line-height: 1.5em;">First, remember that </span><span style="line-height: 1.5em; text-decoration: underline;">the mesh created by an MCG geometry (or an MCG modifier) must always be defined in relation to its local origin</span><span style="line-height: 1.5em;">. For Box1, fulfilling that requirement is simple - we can leave it as-is since we&rsquo;re interpreting its definition in local space. This way, it will respond to changes in position, rotation, and scale in the scene.</span></p> <p><span style="line-height: 1.5em;">For Box2, we&rsquo;ve chosen to interpret its mesh definition in world space (i.e. centered around the world origin). The same rule still applies though - we need to redefine it in relation to our tool&rsquo;s local origin. To do that, we need to answer the familiar question: &ldquo;Given a mesh defined in </span><span style="line-height: 1.5em; text-decoration: underline;">world space</span><span style="line-height: 1.5em;">, what is its equivalent in </span><span style="line-height: 1.5em; text-decoration: underline;">local space</span><span style="line-height: 1.5em;">?&rdquo; If we look back at point 3 above, we realize that the answer to that question is to transform the mesh by the inverse of &ldquo;Geometry: Matrix&rdquo;.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/12.png" width="1789" height="536" /></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/13.png" width="924" height="493" /></p> <p><span style="line-height: 1.5em;">At this point, we&rsquo;ve shown how to convert a mesh&rsquo;s coordinates from world coordinates into local coordinates. The last piece of the puzzle for creating world space effects in MCG is to understand how to work with other meshes in the scene.</span></p> <p><span style="line-height: 1.5em;">Consider the following problem: you want to decorate a geosphere by placing a box on each of its vertices, and you want to work in the least destructive way possible. That is to say, you don&rsquo;t want to affect the sphere&rsquo;s geometry in any way (including its existing topology, UVs, material ids, smoothing groups, map channels, and per-vertex data channels).&nbsp;</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/14.png" width="998" height="499" /></p> <p>Given that we want to act in the least destructive way possible, it&rsquo;s best to decorate the sphere using an MCG geometry instead of an MCG modifier. Using a modifier here is less desirable because it would increase the complexity of the tool; you would need to adapt the new mesh&rsquo;s UVs, material ids, smoothing groups, map channels, and per-vertex data channels to account for the current sphere&rsquo;s mesh as well as the the new box meshes, since they would all be part of the same mesh. To avoid all that complexity, we&rsquo;ll use an MCG geometry.</p> <p><span style="line-height: 1.5em;">Create the following graph and save it as BoxesOnVertices.maxtool. Note that since we want to work with an object in the scene, we&rsquo;ll need a &ldquo;Parameter: INode&rdquo; to let us pick that object from our tool&rsquo;s rollout. We&rsquo;re using a CheckNodeValidity operator here to make sure the node is valid, and to exit the graph preemptively if the node is invalid.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/15.png" width="1920" height="755" /></p> <p>Evaluate the graph, then go to &ldquo;Create Tab &gt; Max Creation Graph &gt; BoxesOnVertices&rdquo;. Create a BoxesOnVertices object in the viewport. Nothing will be created until you set the &ldquo;targetObject&rdquo; as the geosphere (or any other object with vertices in the scene).</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/16.png" width="1414" height="673" /></p> <p>For now, none of the boxes are attached to the sphere. However, we can still see that their positions are in the same relative position as the sphere&rsquo;s vertices. We&rsquo;re on the right track, and it&rsquo;s time we started talking about &ldquo;spaces&rdquo; again.</p> <p><span style="line-height: 1.5em;">There are three spaces to consider here:</span></p> <ul> <li><span style="line-height: 1.5em;">Our </span><strong style="line-height: 1.5em;">tool&rsquo;s local space</strong><span style="line-height: 1.5em;"> - this is the MCG geometry&rsquo;s coordinate system in which we have to define our output mesh.</span></li> <li><span style="line-height: 1.5em;">The </span><strong style="line-height: 1.5em;">world space</strong><span style="line-height: 1.5em;">&nbsp;- the global the coordinate system.</span></li> <li><span style="line-height: 1.5em;">The </span><strong style="line-height: 1.5em;">node&rsquo;s local space</strong><span style="line-height: 1.5em;"> - this is the coordinate system in which the sphere&rsquo;s mesh is defined.</span></li> </ul> <p><span style="line-height: 1.5em;">To get the effect we&rsquo;re looking for, the idea is to first convert the sphere from the node&rsquo;s local space into world space, create the boxes in world space, and then convert them into local space. More concretely, here&rsquo;s how we can achieve that in our graph:</span></p> <ol> <li><span style="line-height: 1.5em;">Convert the sphere&rsquo;s mesh from the node&rsquo;s local space into the world space. Note that we&rsquo;re using the node&rsquo;s &ldquo;WorldTransform&rdquo; to perform this conversion. This matrix converts from the node&rsquo;s local coordinate system into the world coordinate system.<br /><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/17.png" width="1790" height="582" /></span></li> <li><span style="line-height: 1.5em;">Create the boxes using the sphere&rsquo;s vertices in world space.<br /><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/18.png" width="904" height="669" /><br /></span></li> <li><span style="line-height: 1.5em;">Convert the combined box meshes from world coordinates into our local coordinates using the inverse of &ldquo;Geometry: Matrix&rdquo;.<br /><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/19.png" width="941" height="471" />&nbsp;</span></li> </ol> <p>To make sure you&rsquo;re on the right track, your BoxesOnVertices graph should now look like this:</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/20.png" width="1920" height="617" /></p> <p>As a workaround to an existing MCG bug, since we just added the &ldquo;Geometry: Matrix&rdquo; implicit parameter into our graph, we need to delete the existing BoxesOnVertices object currently in our scene. This issue is caused by the fact that the old BoxesOnVertices object in the scene wasn&rsquo;t aware it required the &ldquo;Geometry: Matrix&rdquo; implicit parameter when it was created. From here on out, any other BoxesOnVertices objects will &ldquo;know&rdquo; they need to use the Geometry: Matrix, so you don&rsquo;t have to keep deleting and recreating these objects every time you iterate on your tool.</p> <p><span style="line-height: 1.5em;">Now, when you create a BoxesOnVertices object and select a target object, the boxes will always be aligned to the world space position of the target&rsquo;s vertices. Modifying the target object will update the boxes automatically, despite the fact that they are defined as a geometry and not as a modifier.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/21.png" width="1498" height="489" /></p> <p>If you&rsquo;ve got an eye for detail, you&rsquo;ll notice that as you rotate the target object, the boxes will remain aligned to the same axes. This is happening because we&rsquo;re defining them in world space before converting them into our tool&rsquo;s local space.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/22.png" width="1045" height="658" /></p> <p>To make them follow the rotation of the object, we can adapt our graph and simply define our boxes in the node&rsquo;s local space before applying the space transformations (node local &rarr; world &rarr; tool local). Here&rsquo;s what that looks like:</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/23.png" width="1920" height="531" /></p> <p>When you evaluate this graph, the boxes should now respond to changes in rotation on the target object.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/24.png" width="1036" height="650" /></p> <p>We can do a bit of matrix magic and clean up the last part of our graph to reduce the number of mesh transformations. If you&rsquo;re working with large meshes, transforming each one repeatedly can get computationally expensive, so it&rsquo;s much faster to multiply two matrices and transform the mesh only once. Recall that we can apply space transformations to matrices by multiplying them together. As such, we can condense the graph to the following construction:</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/25.png" width="1920" height="647" /></p> <p>In conclusion, now that you have a sense of how world space effects are done in MCG, here are two tools you can pick apart. You can download and install these .mcg tools from the zip file linked at the bottom of this post. These .mcg tools contain compounds that I created specifically for this tutorial, so you might not find them in your default operator list. Once you've installed these .mcg's, (<span style="line-height: 1.5em;">Scripting &gt; Install Max Creation Graph (.mcg) Package), you can open their respective .maxtool files from:&nbsp;</span>C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools\\Downloads.</p> <p><span style="line-height: 1.5em;"><strong>Wire.mcg</strong>&nbsp;</span></p> <p>Creates a world-space wire between the vertices of two objects.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/26.png" width="1920" height="1085" /></p> <p>&nbsp;<span style="line-height: 1.5em; text-decoration: underline;">Usage:</span><span style="line-height: 1.5em;">&nbsp;</span></p> <ol> <li><span style="line-height: 1.5em;">Create two geometry objects in the scene.</span></li> <li><span style="line-height: 1.5em;">Create a Wire object from &ldquo;Create Tab &gt; Max Creation Graph &gt; Wire&rdquo;.</span></li> <li><span style="line-height: 1.5em;">Select both geometry objects to create the wire.</span></li> <li><span style="line-height: 1.5em;">Adjust the gravity and tension spinner values to your liking.</span></li> <li><span style="line-height: 1.5em;">Adjust the vertex spinner values to change the start and end vertices.</span></li> <li><span style="line-height: 1.5em;">Add a Cap Holes modifier to close the hole at the start and end of the cylinder.</span></li> </ol> <p><strong><span style="line-height: 1.5em;">BezierGeo.mcg</span></strong></p> <p>Creates world-space geometry using the position, rotation, and scale of point helpers in the scene.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/world_space_effects/27.png" width="1920" height="1091" /></p> <p><span style="text-decoration: underline;">Usage:</span></p> <ol> <li><span style="line-height: 1.5em;">Create two (or more) point helpers in the scene via Create Tab &gt; Helpers &gt; Point. To visualize the effect of these helpers more clearly, enable &ldquo;Axis Tripod&rdquo; and &ldquo;Box&rdquo;.</span></li> <li><span style="line-height: 1.5em;">Change your manipulate mode from &ldquo;View&rdquo; to &ldquo;Local&rdquo; when you want to position, rotate, and scale these helpers.</span></li> <li><span style="line-height: 1.5em;">Create a BezierGeo object from &ldquo;Create Tab &gt; Max Creation Graph &gt; BezierGeo&rdquo;.</span></li> <li><span style="line-height: 1.5em;">Using the &ldquo;helper#&rdquo; pickbuttons in the rollout, select the helpers in the order you want your geometry to &ldquo;grow&rdquo;.</span></li> <li><span style="line-height: 1.5em;">If the geometry looks a bit strange, decrease the &ldquo;handleMult&rdquo; value until it looks like a nice 3d bezier curve.</span></li> <li><span style="line-height: 1.5em;">Adjust the position, rotation, and local scale of each helper to change the BezierGeo object.</span></li> <li><span style="line-height: 1.5em;">Use the &ldquo;progress&rdquo; spinner to animate the growth of your BezierGeo.</span></li> <li><span style="line-height: 1.5em;">You can toggle "showBoxes" to display boxes instead of a cylinder.</span></li> </ol> <p><strong><br /></strong></p> <p><strong>Download:</strong> <span style="text-decoration: underline;"><a href="/userdata/blogs/mcgblog/world_space_effects/WorldSpaceEffects.zip" mce_href="/userdata/blogs/mcgblog/world_space_effects/WorldSpaceEffects.zip">WorldSpaceEffects.zip</a></span></p> <p><strong><span style="line-height: 1.5em;">Instructions:&nbsp;</span></strong><span style="line-height: 1.5em;">Extract WorldSpaceEffects.zip anywhere on your filesystem.&nbsp;</span><span style="line-height: 1.5em;">In the extracted directory, you&rsquo;ll find the following .maxtool files which you can open in the Max Creation Graph Editor and evaluate (Ctrl+E): SpaceTest.maxtool, LocalBoxWorldBox.maxtool, BoxesOnVertices.maxtool. These are MCG geometry objects which can be created from the Create Tab &gt; Max Creation Graph dropdown.&nbsp;</span><span style="line-height: 1.5em;">You will also find Wire.mcg and BezierGeo.mcg, which you can install via Scripting &gt; Install Max Creation Graph (.mcg) Package. The usage of these tools is described in the sections above.</span></p>Thu, 28 Jan 2016 22:01:16 UTChttp://area.autodesk.com/blogs/mcgblog/world-space-effectsBonus Tools for Maya LT (with bug fixes)STLR<p><span style="font-size: larger;">Note:&nbsp; </span><span style="font-size: larger;">The install package was updated on 2/1/16 with a fix to a bug that was found with the Auto Unwrap UVs Tool.&nbsp; This fix only applies to Maya LT.&nbsp; If you installed BT for Maya LT before Feb 1st then you should replace that installation with the files from the new updated install package which can be found here -&gt; <strong><a target="_blank" href="/userdata/blogs/stevenr/Downloads/MayaLT_2016_BonusTools.1.zip">MayaLT_2016_BonusTools.1.zip</a></strong><br /></span></p> <hr /> <p>Are you a Maya LT user?&nbsp; Have you seen or heard of BonusTools and felt a little left out?&nbsp; well I'm happy to announce that BonusTools is finally available for Maya LT!&nbsp; It has consistently been one of the most requested improvements on the Maya LT user forums.&nbsp;</p> <p>I should note that it is technically a subset of the regular version due to the fact that some plugins and python scripts are not supported in Maya LT.&nbsp; But, with around 100 new tools included, there is still a lot of functionality in the LT version.</p> <p>Links to the install package as well as to the installation instructions have been posted on the <strong><a target="_blank" href="/blogs/stevenr/bonustools">Bonus Tools Resource Page</a></strong>.&nbsp; Here you'll also find tutorials and movies related to the individual tools.</p> <p>If you're not familiar with BonusTools you can check out the following movie as good intro to the kinds of tools that are available</p> <p style="text-align: center;">https://www.youtube.com/watch?v=iJ0RdPiaGhY</p>Tue, 26 Jan 2016 22:09:19 UTChttp://area.autodesk.com/blogs/stevenr/bonus-tools-for-maya-ltMaya Bonus Tools Resource Page - Maya LT version now available!STLR<p style="text-align: center;"><img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAAEAYABgAAD//gAfTEVBRCBUZWNobm9sb2dpZXMgSW5jLiBWMS4wMQD/2wCEAAUFBQgFCAwHBwwMCQkJDA0MDAwMDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0BBQgICgcKDAcHDA0MCgwNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDf/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/AABEIAHgDEAMBEQACEQEDEQH/2gAMAwEAAhEDEQA/AOR+CnwU0X4j6LNqmqTXsM0N7JbKttJAiFEgt5ASJLeVt26VgSGAwF+UEEkA9g/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgA/4ZU8K/wDP1qv/AH+tP/kKgBp/ZW8LD/l61X/v9af/ACFQBx3in4GeBfCkRa4vdUecj5IUntN7E9M4sjtBPBPb0reFKU9lZHl4nHUsJ7s3ef8AKt/V9kN8LfA7wN4pjzBearFOv34XntA6nvj/AEIbl9COvpROlKnvsGGx1LFK0Hae/KztB+yr4V/5+tV/7/Wn/wAhVgeoL/wyp4V/5+tV/wC/1p/8hUAH/DKnhX/n61X/AL/Wn/yFQAf8MqeFf+frVf8Av9af/IVAB/wyp4V/5+tV/wC/1p/8hUAeP/Gv4KaL8N9Fh1TS5r2aaa9jtmW5kgdAjwXEhIEdvE27dEoBLEYLfKSQQAewfsqf8irdf9hWb/0ksqAPpOWZIEaSRlREBZmYhVVQMlmJwAAASSeAOaAKthqlpqYZrKeG5CEBjDIkgUnkBijEAnsD1oA0KAM+81S004ot3PDbmU4QSyJGXPHChiNx5HAyeRQBeBoAguruGxjM9w6QxJ955GVEXJAGWYgDkgcmgBsN7BcQi5hkjkgILCRHVkKjOSHBK4GDk5xwaAMn/hLdF/6CFl/4FQf/ABygA/4S3Rf+ghZf+BUH/wAcoAv2Or2Wp7vsVxBc7MbvJlSTbnON2xmxnBxnrQBeaQICzEKAMkngADqST0A9TQByjePfDyTfZzqViJc42/aYuvpndj9aAOohmSdFkiZXRxlWUhlYHoQRkEH1BNAE1AGHN4m0q1kaGa9tI5EJVke4hVlI6hlLggj0IzQBYs9asdRbZZ3EFww5IiljkOPojE0AaooAZJIsSl3IVVBJJIAAAySSeAAOST0oAwP+Et0X/oIWX/gVB/8AHKAJrfxJpV3IsFveWksrnColxCzsfRVVySevAFAG2TigDntV8V6RoTbNRvLW0fj5Jpo0bnodpO7B7HGDQBc0zXLDWU8zTriC7UdTDIkmM+oUkj8cUAXLy9g0+Mz3UkcES4BeV1RBk4GWYgDJ4HPJoAfb3Ed1Gs0LLJG43K6MGVlPQqy5BB9QcUAQ3l/b6cnm3csdvHkLvldY1yeg3OVGT2GcntQBJa3UV5Gs9u6TROMq8bK6MM4yrKSpGeOCecigCzQAUAIfagDHn1/TraY2st1bRzghfKeeJZMtgqNjMGywIIGMnIxnNAGwtAAeKAMm917TtNfyru6treTG7ZLNFG205wdrsDg4ODjHFAGqjBwGUggjII6EHkEEdjQAp4oAzF1mye4NktxAbkZBhEsZlBAycxht4wOT8vA5oA0gaAM9NXs3uTYpPA1yucwiVDKMAMcxht4wpBOV6EHpQBpUAVrm6is42mndIYkGWeRgiKOmWZiABnHJIoAZZ30F/GJrWWOeIkgPE6uhwcEBkJXIIIODwevNAD7u7hsYjPcSJBEmNzyMqIuTgZZiFGSQBk9TigBtnewX8YmtZI54iSA8Tq6kjggMpI4PXnjvQBboAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgBDQBXubqOzjMszLGiDLMxAAA71STbskZTqQpRc6klGK6s8S8VfFBm3W2j/KOQ07Z+h8scY9Q+fwr1KWFtrU+4+Cx2e3vSwK9Zdfkj50ub+TVr7c7NIqEsWYk7m9Tnr7V2bu0dEj51qVOk6tVt1aml27tIjS8k0u93Rs0e8hlZSQVb1BHSpdk7NaMunzSpKdN2nDqtHb5H0H4S+LTR7bXW+V4C3C5z6DzBj83z+FcVXD/AGqf3H0+Czlq1LF7bKfX5pHu9reRXsay27rJGwBDKQQQfpXnNOOj0PtoTjUXNTaku6LdSaBQAUAfM37Vf/Iq2v8A2FYf/SS9oAP2Vf8AkVbr/sKzf+kllQB0/wC0F4kOgeFJ7eI/6RqjrZRqM5KyZabAHrErJ/wMDvQB5R8IrKf4W+M38KXzEJq9hBPHuwB56x+YVGOPlYXUOeN2wdc0AfY6mgD5U/aWH+leHv8Ar9k/9Dt6APqscUAeTfHUf8UTqn/XKL/0oioArfBq0S+8BafavlUntZ42K4BAea4UkZBGcE4yDz60AcM/7K/hdFLC71TgE/6207D/AK86APGPgv8AB3SPiPZ3lzqc15A9nciFBbvAoKlN2W8yCUls9wQMdqAPrX4efCnS/hp9o/sqW6m+2+X5n2lomx5W/bt8qGLGd5znd2oA8E8ba1q3xk8Uv4L0OY2uk2DMLyZc7XMRCyySbSC6rJ+5giyFd/nbAOUAPQ4/2Z/CCWv2dlu2m24+0/aCJN394IF8gY7AxEeue4B5dot9qvwB8Tw6DqNw934d1Nh5Uj52xqzbBKq5IikhcqLhEO14yHxymAD7XFAHw3oXw+0v4hfEDxDZ6v5oitpZZU8lxGdxnVOTtbIwTx680Ad9rP7MGmohm8O395YXajMfmsskRI5ALRrHKmTj5wz7eoQ9KAJPhD8SdZtNYl8CeMSW1CDcLadzl3KLvMTv0lDx/vYZfvMoIYsSuAD6G8Tj/iUX3/Xnc/8Aol6APjD4IfB3QfiBoc2p6t9p8+K9kt18mURrsSG3cZGxvm3SNk56YoA988O/AHwz4X1GDVrH7X9otJBJH5kysm7BHzDyxkYJ7jtQB1PxY8VzeCvDN5qtpj7SipFATghZJpFjV8Hg+XuL4PB280AeFfDP4FaV4o0mLxF4oe4v7zVF+0bfOZFRXJKFmXEjyOPmYl9oyFCcEkA9o8DfCbSfh5f3N7o7zCO8iSNoZWDhCjl9yPgMQc4IfcRjIbnFAGB+0UP+KKu/+utr/wClCUAdN8M7qKw8F6Xc3DrDDDpsLyO5CqiLHlmY9AAMkmgDwRlu/wBojxFkGWDwjpEnHVDcuBzgf89Zh0J/494D2kchgD68sbGDTYI7S0jSCCBAkcaAKiIowqqBwABQBcoAKAA0AfnP8YdIuNU8ca7LaHbJp0FvenHXZFb2SuVI5BQSb8/7JoA+6fAXiRfFug2WrgjdcwIZMdplGyYcdMSK2PbFAHXGgD80PijcS+MdQ1XxWGzZ29/Dp1twCGVY5cYPoEh8w47ygnrQB+j+kjFnB/1xi/8ARa0AGq6lDo9nNf3B2w2sTzSHphY1LHr3IGPrQB+d1kNS0k2fxVmJb7Trc3mptOPKbliD12uDcQgZIG1R7UAfo3bTx3MSzQkPHIqujDoVYBlI9iCDQB8r/HfQbjwrqdl8RNGULPZyxx3gAA3DO2N34yRIha2kJ/hMWOeaAPpTw/rlt4j0631Wybdb3cSyp6jcOVPoyNlGHZlNAHzv8eNcufEd7Y/DzRjm61GSOW7I6JEDmNXx/CNrXEgP8Maf3qAPobw3oFr4X0230mxUJBaRLGvGCxA+Z29XkbLue7MaAPA/2hr+XVRpXgyzP7/WbyNpAOSsKOEUsP7vmOXyRj9y3pQBV+AE8nhjUda8DXTEvp1y08BOAXjJEbuBwcMogk44+fPegD6iFAC0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAdKAA0Acd4j8Z2Xh1dsjebOR8sSHJ9i3XaPfn6V1U6Equq0j1Z4WNzShgFyyfNU6RjrZ+bPnvxB4pvvET7rlisQPyxKSEH1H8TerY5r26dGNJe7b16n5bjMxr453qStDW0E7RXyPO9bv/s6eRH99xz7D/E06krLl6iwdD2kvay+GO3mzN0aLajSepwKzpq2p24uXvKHZXE1uL5VkHY4pVNrjwcrN036i2F356bW4ZePqPWnGWlia9L2cuaOz29TtfDnjLUPC0m60ctExy0Lk+W30HIVscBscVnUpRqb79DswmNq4N+4/d6xe33H0z4U+IGneKFCRt5F0BloHOG99hONyg9+PpXkTpSpvyP0LC4+likknyztqn+h3gNYHrC0AfM37Vf/ACKtr/2FYf8A0kvaAD9lX/kVbr/sKzf+kllQBS8af8V58StM8Pj57TQY/tlyM5XzPlmIbHri2jwf7xHegCf9oeyl0Z9I8Z2gPn6ReIkmO8bsJEB46b0dOTj97jvQB9I6bfRanbQ3tud0NzGksbDoUkUOp/IigD5g/aV/4+vD3/X6/wD6Hb0AfVgoA8l+Ov8AyJOqf9cov/SiKgB3wN/5ErS/+uMn/pRNQB6rL9xv90/yoA+WP2Vv+QZqn/X8v/oqgD6T16+OladdXqjJtbaaYfWOJ3H/AKCKAPmz9lfTB/ZeoaxICZ7u8ERduSUijWQ4J55kmbd6lRnoKAPqugD5n/ai0uO58NwX2P3tpexhWx0WZHVxnsCVQ/UDvigD2rwJqTav4f02+f79xY2zt3+YxLu5+uc0AeAfCj/kpPif/tr/AOlUdAH1ZQB8f/HyEaB4s0DxDbgLM0io5Bxu+z3EbKGxzykrKTzwAOgFAH1H4m/5BF9/16XP/ol6APlD9nv4i+HvCPh2ey1i9jtLh9QllVHDkmNoLZQ3yqRgsjD14oA+jND+KHhnxHeJp2l38VzdS7ikahwTtUs3VQOFBJ5oAf8AE3wk3jfw7eaNEQk8yK8JY4XzonWWMMcHCsy7GOOAxPagD54+FPxhXwZGng7xlHJp8tiTFDcSKcIm75Y5x1VVyRHMu6Mx7QcBQxAPr62uIrqNZoHWSOQBldGDKynoVYZBB7EcUAeKftFceCrv/rra/wDo9KAPAdN1e/8AitZaR8P9CkNvYWdjbvq1xjBPl7QyAZBdI2KhVHEk7AthEBoA+0fDnh2x8KafDpWmRiG2tl2qOrMerO7fxO5yzsepPpgUAb9ABQAUABoA+SNNsYtT+L2uWVwN0NzprRSL6pJZ2KsPxBNAGz+zvfS6M2reC7wnz9IvHeIHvEzGN8Dsu9Fk/wC21AHrPxU8T/8ACJeGb/UVbZMITDAeh86b91GR7qWL/wDAKAPk3xp4Z/4Rj4V6VG67Z7y+S8mz13TwSlM/SERL+FAH3NpP/HnB/wBcYv8A0BaAPDv2i/EEmm+HF0i15utauEtUUdTGCHkx/vHy4z7SGgDb8RfDqN/AD+FoFDSWtipiwOWuoB524dgZZg4J/wCmhoAi+Afif/hJPCdsshzPpxaylyecRAGInPPMLIM+oPpQB6rrWj22vWM+mXq77e6iaKRf9lhjI9GXhlPZgCOaAPlD4Y+Mv+FSz6v4P8SSbY9LEt5Zsxx5qhdxiizx/pClJYlH8bS55oA6n4D6Bc61cXvxB1oZvNWkkW1BB/dwBsOyg9FYqsMfpHEecPQB9N9BQB8t+E8ePfidqOtn57Tw9F9ktz1US5aEEZ9T9qkBGR0PcUARfEc/8IH8Q9I8UrmO11Rfsd2eikjELFuR0jeFxnjMQPagD6qHFAC0AFABQAUAFABQAUAFABQAhoA4XxH8R9B8LSfZr66U3Z+7awK09yT6eTEGYH/e20Ac+nxTlnG+20HX5ouzi0iQEeoWS4R/wK59qAHW/wAY9DSUW+qreaLKxwBqNtJAmfTzhvhz/wADoA9Rt7mK6jWaB1kjcZV0YMrD1VlJBHuDQBYoAKADpQAZoA5fxJ4x0fwlGJNXuorXf9xGOZJD6RxKDI/P91TQBxkfxXW9+fTdG1y+i7Sx2axIfcfaJoWwe3y0AI3xf06wYLrVlqmjKf8AlpeWbeUM92lgaZFHuxxQB6PpWsWWuQLd6dPFdQP0khdXU+2VPB9jg+1AGqKACgAoAM0AZ+papaaPA13fTR2sEYy0krqiD6sxAz7dT6UAeZ/8Li0u7YpotrqetYON9jZu0R/3ZZTFGw9wSKACT4riy+bUNF12zi7yPZpIo9z5E0rfXjigDr/DXjfRfFqltJuorh0+/FkpMnrvhcLIuO+VwPWgDrM0ALQAUAFABQAUAFABQAZoAqXl5DYxma4dY41GSzHAFVGLk0oq5hVqwoRdSrJRiu7seLeJviTJPm30nMachpj94/7g/h9Q2TXr0cJb3qvyR+c5hn8p3o4D3V1m936dvU8kmkaRi8jFmYkkk5JJ69a9VLlVkfBynKbcpPVmbd3K2kbSN26D1J6Cok+RXOilTdWShHr+B51PM1w5kflmNcDd9T7CEFTioR2SOrtIvJhVfbP511RXKkjwasuebYmoRebAw/GlJaMKEuSomcjBM1u4cduv0rkXus+inBVIuLOkWUSKGHQ10XPFcOR2ESV4HEkTFHUgqVJBBHIIIpPaxpCTi7xdmj27wb8YpbXbaa7mWMYAuBkuvvIP4snq2Rj0rz6lDrA+xwmauNqeJ22Uup9FWGoW+pRLcWkiTROMqyEEH/PvXA046M+uhONRc9N3TPnX9qr/AJFW1/7CsP8A6S3tSaFL9mW9i03wbf3k52xW+o3Msh9Ejs7NmP5A0AeQ/Dn4wWPhnVtW8QaraXd5eavNuRoAhWOHezmPLsp6mMYGQFjUdqAO38cfH3Q/GWiXmiPpuoKbuIrGzLCQkqkPE5xJnCSKrHHOBgUAem/s4eJzrnhdLGVsz6TI1sR38o/vISfYKzRj2jx2oA5H9pY4ufDx7fbZOf8AgdvQB9WCgDyP47yLH4J1MsQoKQqM9y1xEAPqTwKAJ/gejR+CtKDAqfIc8+jTzMD+III9jQB6nL9xv90/yoA+WP2Vv+QZqn/X8v8A6KoA+kPEdk2paXeWcf37i1uIl+skToP1YUAfOX7KupLJot/prHEtreiQqeCEmiVR78vDJ/KgD6ozQB82ftP6ilr4XitScPdXsW1c/eWJJHbj0B2fjj2oA9i8Aae2leHdMspPvwWNsjdvmESk8duTzQB4H8KOPiT4n/7a/wDpTHQB9WZoA+QPjzIPEXjDw/4dtjulSRXkA52faJ48FscjEcLOfRSG6GgD6i8TcaRff9edz/6JegD5Z/Z18CaD4m8OT3er2NveTpqEsSySpuYRiC2YKDnoGdiB6saAPo7SPh14c0C6S+03Tra1uY9wSWNNrLuBVsHPdSQfrQB2hoA4Pxv8OtG8fWpt9UhHmqpEVzGAs8JPQo+OVB5Mb7oz0K0AfP8A8Dr/AFPwZ4ov/h9qEnnwQLJLAcnCMmxg0YP3UnhkDsmcK68DJYkA9M/aJ48F3f8A11tf/R6UAeDXvgq/8K6DovxF8K/urm1sbdr+FAcSJtAaZlB+dHX5LlOPlxKMFWYAH1n4C8cWPj/S49UsDtJwk8JOXgmA+aNvbujdHUhh3AAO3yFoAx7HxDpupSm3tLmGaUAnYkiklVOGZQD8yg8FlyASMnkUAbNAAaAPlPw9/wAlm1cf9OI/9JrCgA8Zf8W++Jum68PkstejFrcnovmcQsTjAGD9mlJOScPQBd+N7v4t13Q/A0JOy5uBd3YUniJSVGcHIxGtw3P+we1ADv2oo1h8LWqIAqrfxBQOAAIJgAPYDp7UAfRmlcWcH/XGL/0WtAHxf8VPHtnH8RLSS9ilu7Dw4FzFAFZnuSplJ+ZlXCymFXz/AM8mABzQB33/AA1Jow/5hupf98w//HKAOJ+Afi+1j8X6lptokltY6yZLi1imwHSSJmkCEAkZ8ppBwSMIKAPtigD47/af0K0lvNHvSm2e6le0lcYBaJWiZAePvKZX2n0bHpQB9b6bp8GlWsVlaIIoLaNIokXoqIoVVH0AHv680Acz4/8AEg8I6DfavkB7aBzHnHMzjy4Rz6yMvHfGKAPjz4RfGLSfh3pMlpc2V9c3l1cPcTTRLHsbIVYwC7qxAUEnIxuZiOtAEvxb+MmkfEbRP7NhsL63uYpo54ZZVi2IVysm4q7Nho2YcD7wUngUAfV3ws8T/wDCW+GbHUWO6YwrFPzz50P7uQngYLlQ+O2+gDq7zxDpumyi3urmGGU4+V5FUgMcKWyfkDHhS2A3bNAGyD6UAFABQAUAFABQAUAITigDxm/1nUviJdTaT4bnaw0i1dor3VkGZZpAcPa6eT8uV6S3JyFJxHkj5gDuPDHgfR/CEXl6ZbpG7cyTv+8uJW7tLM+XYk89QB2AFAHW0AVbyxg1CJoLqNJ4nGGSRVdCD2KsCDQB5De+CL7wG76r4JLNb533OhyMTbzjqxs2JJtrjH3VH7pzhcAcEA9I8MeJbLxXYJqOnsTG+VZHG2SGReJIZUPKSxt8rKfqMgg0AdFQAhoA8t8U+KtQvb//AIRfwsEOpbQ93eSLvg02JxlWdf8AlpcyDmGDOOjv8tAF/wAM/DbS/D0hvpQ2papJzLqF4RLcMT12bsrCmekcQAA6knmgD0ICgBskaupRgGUjBUgEEe4PB/KgDyfW/hoLKZtY8HSDRdVHzMigixu8c+XdW6/Jhv8AnrGA6k7uTggA6Pwb4vHiVJLa7hbT9WsSEvbJzlomYZWSNv8Alpbyj5opV4I4PzCgDuAaACgDjPGXi+PwpboI42vdQvHMNlZR48y4mxnH+zEg+aWU/Ki+5AIByWkfDaTWJ11nxtIuqahndHac/wBn2XcJDCeJXXo00u4s3Kj+IgHrUUSQKEjUIijAVQFUD0AGAPwFAEvHbigDhPE/w60nxMwuWRrPUIuYb+0PkXUTDoRIow49UkDKR2oAxfDvifUtFv08M+KyjXUu7+z9RRdkOoKnJR16Q3iLgvGPlcZZM9wD1YGgBaACgAoAKACgANAHOeI9cHh+0N2UMuCFCjjkgnk4OBx6V0UaTrS5VpZXfoeLmOPjldFV5rmcpckVsrtNpfgz501zxDe69JvuXOwH5Y1JCL9B3Pqe9fQ06MKStFfM/H8ZmNfHycq0rLpFfCl6f1c588V0bHkogY4qWapHBaxf/a5NqcRpwPc9zXDOV36H1uEoexheXxvV+XkZtqnmyqvvWSV3Y7Kj5INnZYwAPSuw+bBxlceopAtGcPcJ5UjL0wa4mrM+ppy5op+RYsrjYfLPQ9Pr/wDXpxdtDGtT5vfjv1NMtWpw2IzzSKWh0fhvxfqXhSXzLGQ7CRvhYkxv9R0B7Ajp6Gsp01Pc9LD4qphneDdu3RnU/HfxQvi3wLZ36xmBv7WiR0JyAwtL3JU4GVPbivKnD2bsffYTErF0/aJWadn6nmfh7xI2ifC2+soCftOra1JaIF+8Yza2TzY+qKIz/wBdKyO8+1vh/wCEIPC2gWOlvGhkggTzSUUkzP8AvJTkjOPMZgM9AAO1AHYmxtx/yyj/AO+F/wAKAPlTwj/xb34o6hov+rsteQzQDovmNm4jAwONr/aIVA4AYUAeg/H3wRc+MNAE2nK0l9pkv2mJFyXkQrtlRAP48bZFHUmPaOSKAMHwH+0Lod9YRW/iKU6dqUCCObfG5ikZAFMiOobYWxlo3CsrZAyozQB5/wDFD4in4vSW/gzwcktzHPMklxOUaNWCH5flYblgiJ82WRwoJVAoPcA+u/DujxeHtNtdLg5jsoIoFPdvLQLuPuxBY+5oA1ZuEb/dP8qAPlj9lbjTNU/6/l/9FUAfVOKAPinxHb6h8BvF8niKzha40DVnYzInRRIweSEk/KksUhMluWwrodmR8+0A9vi+PvgyS1+1m+KHGfIaGXz88fL5YQ5PPUEr1IbbzQB4fbtfftC+KoL0wSW/hrSHGPM43gMHZCRlWnuWVVdUJEUI5JIywB9rgbQAMDHpQB8T+GPG+leBPiD4iu9akeCK4klijKxSS5cTqxGI1YjgHk8UAega9+0xosSeR4dtrnVb2TKxKY2ijDdtwOZm9dqR84wWXOaAD4P/AA61aXVZvHXi/I1S63fZ4HGHhDjazuv/ACzIj/dQxdY4yd3JAAB774n/AOQRe/8AXncf+iXoA+QPgN8VfD3gXQJtO1meSC4kvpZ1VbeaUGNoLdAd0aMoO6NhjOeM4wRQB77pPx08Ja3eQ6dZ3Mr3F1IsUSm1uVBdzhQWaMKoJPUkAdScUAdP488d2Pw9sotR1JJXgmuY7Y+UFLIZFkfftLLuVRGchcsewNAHJyfHnwXHbG5/tANhc+UsM3nH/ZEZQEN2+YgDqSBzQB5b8Gre88ceLtS+IFxC1tZyh4LUN/EWEcagHo3lQRgSMo2l3wDwaAPRP2iR/wAUXdgf89bX/wBHpQB1fwsjWXwfpKOAytp8AZSAQQY8EEHggjIIPBB5oA+dPE2k3vwA8Rr4h0ZGl8O6k+y4tl+7Hk7jD3Clcl7RzzgNETjO4A+j9b1y08Q+GX1LT5GnsbmONneLO/7MZUF0CB8ylYfNWVRhlAcDkCgDyfTrK4s51kkJ33F9bvogRmaIRpqk6T+WCSI86a2WWDFu9jtdlMiZoA+ml4oADxQB8q+HePjPqx/6cl/9JrCgDsv2h/Dba34WkvIB/pOkypeIRncEB2TYPbCMJD/1zoA8/wDgZLdeP/Et/wCNtSXa0FvBZQjOQshiRZCp4PCRljx1uGoA6D9qYZ8MW+P+ghH/AOiZqAPc5tVi0LRTqVxxFZ2YnftkRwhsD3OMAdyQOtAHg/7OmiPqFnqHivUkV7nWbxypdQ37uNmLkbs8NM7L9IloA+kvsNv/AM8o/wDvhf8ACgD5b+P1i3hTVtF8bWKBGs7hYJ9igblVjLGpAxnchuEPHIOCelAH1NZ3cV7BHcwEPFMiyIw5BR1DKR7EEUAfLv7TX39Ax/z/AEv87egD6rFAHy9+0TezazLpPguyJE2q3SSSgdkVvKjzzgrvZ5CD3iBoA+i7DRLTTreK0hijEVvGkSDYv3Y1CL29AKAJLnSbS6ieCWGNo5VZHGxRlWBVh07gkUAfMX7P11L4Y1fWvA92ebS4ae3yeoRhFIR/vx+RIAOg3E96ANhrOabUjdyFltbS43a1lyCS17dxssqMfKktxbG2LLMCo08K9vhwCAD2jwGZf7EtTKWI2N5RfO42/myfZS2ec/ZvKzu+b15zQB2FABQAUAFABQAZxQB5Z8RtRurtrXwppUhgvdbZ1lmT79tYRDN3Ovo5UiGIn+N+ORwAd9o+j2ugWcWn2EawW1sgSNFGAqj19STyx6sxJPWgDM1rxbpuiGSGaZXuobeW6+yxkNcPFCm9ykecn5eRnGe3FAGJ8OviJYfEawa/sFaFopDHLBIQZIz1QnbwQ64KkcZyucigD0IUABHpQB43rsP/AAr/AF+LxBb/ALvStamjtdUjHCRXLkpbX4HRSzYguD0YMrHkZoA9jBxQBxnj3xO/hbSnuLZfOvrh0tbKH/npdTnZEuP7qkmR/wDYRqAJfBfhWPwnp62u4zXcrGe8uWOXuLqQAyysT6n5UHRECqKAOuzj2oACwFAAD9fyNABkdqAPKfiLpM+mNF4y0hC1/pCn7TGvW804ndcW7AfeaMZmgJ+66kD71AHpOm38GqW0V7asJILmNJY3HRkdQyn8QfzoAnubiOzieeZgkUSs7seiqoLMx9gASfpQB5P8PbOTxNcy+ONRQiS+DRaZE/8Ay66crfIQD92W7IM0rYyVKKDjigD177tAHH+MfHWkeBbX7Zq86xZ/1cS/NNMf7sUYOT7scIvdhQB5N4T+LOoa7qdjfXkcFvoOttcWlmqNvmhu4Wygu5MACSdNwSNPkAK9TyQD6JFAHL+L/C8Hi3TpNPmJjfiS3nXiS3uY/mhnjPVWjfB4+8u5TwaAM34f+JJ/EOnFNQAj1TT5Xsr+McAXEOAZFH/POZdsyHptfjpQB3lABQAUAFABQAUAcV44x9hUHkNKBj/gD16+XfxZf4H/AOlI/OOMW1gKTWj+sQf/AJTqHzxqNobOTA+43Kn29K96UeR+T2PyqhV9tFX+JbmW1ZHcjmtdv/IX7PGfmb7xHYen1P8AKuWpLlvFHt4Khzv20lotvNnFMcVxn0qNbR4suX9K2gtbnn4uVoqKOiatzxkITigZyurR7JNw71yzVme/hZXjYyM46VkehY17efzVyeo4P+Nap9Dz5w5HZbPYnqjEs2tv9ofB+6OT/hVRVzKpU9nHTd7G/wDE0Bfh9bgcAa3H/wCkl7XmYnSdvI+5yL/dW/77O2/Zt8L6Xr/hmSbU7WC7e11adoWmQOYybWwJKZ+6SVUn6CuE+pPrcDFAARQBz+oeFNJ1S8h1K8tIJ7y12+TO8YMsexi67H6ja5LD0JPrQBvbaAOH1n4ZeGfEExutQ021mnblpNmx2PPLMm0seepyc0AbGg+EtI8LIY9HtILJX+95UYVm6feblm6dyaAOjAxQA1lDDB6HigDE0LwxpfhlHi0i1gsUlYO6wIEDMBgFgOpA4oA3aAKl1ZQ3sTW9yiTRSDDxyKHRh6MrAg/iOKAPPj8HPBxk83+ybTdnONh2f98Z249sYoA9AsrC302Fba0jjt4YxhY4kCIo9AqgAf5zQBbxQBw998NPDGpTyXd3pllNPOxeSR4FLO7clmJ6knkmgDb0vwvpWiY/s6ztrQjvDDGh6Y+8Fz09DQBubcUARzwJcxtDKoeORSjqwyGVhhlI7ggkEdwaAOC/4VN4RH/MIsP/AAHSgCzZfDPwxp08d1a6XZQzwOJI5EgVWR1OVZSOhB5B9aAOq1LSrTWIGtb+GK6gf70cyK6Hgj7rAjOCeevNAHBr8HPBySeaNJtNwOcFCV/74J249sYoA9Et7WOzjWGBFiiQYREUKqgdlVQAB7ACgCnq+i2WvWzWWpQRXds5UtFKodCVO5SVPGQRkehoAsWFhb6Xbx2dnGsFvAgSONBtREHAVQOAB2FAEWp6TaazbvZX8UdzbygB4pVDowBBGVPBwQCO4IBoAq6L4c07w5C1rpVtDZwOxdo4UCIWIALFRxkgAH1AoAi0/wALaXpM7XdlawW80gwXjQKcc8DsgOeQm0HvQB0A4oACKAMGHwxpdvqMmsxWsKajMuyS5CATOu1V2s/UjaiDHoooA1bq0ivYntrhFlhmRo5EcZV0YFWVgeCrA4I6EHFAGdonh7TvDcJtdJtobKBnMhjhQIpcgAsQOpIUDPoBQAa54d03xLCttq1tDewo4kVJkDqHAKhgD0bDEZ9CfWgCe/0e01O0bT7uGOe1kUI0LrmNlUghSvQgFVIHsKAH6bpdro1ullYRR21tCMRxRKERASWIVRwMkkn1JzQBoUAZOs6FY+Ibf7HqcEV3bllfy5kDpuX7rYPcZOD7n1oAtWVhBpsEdpaIsMECKkcaDaiIowqqB0UDgDoBxQBm614Y0vxEYjqlrBefZmLQ+cgfy2OMsmehO1c464FAG6BigDCn8MaXc6hHrM1rBJqEChY7lowZUUBgArnkAb2xj+8fWgDeHFACEelAGAnhbSo9RbWktIF1Fxta6EYExG0Jgv1PyAL7qMUAJqHhXStVnW6vbWCeaPGHeMFvl6buzAdg4YDpjFAG+q7eBQA6gAoAKACgAoAaaAPKPBq/234j1rXnG5IJY9ItDnIWO1Xfc7euPMuZDu9fLH0oA9XxxigD4b+MepN4K+I9priqfLaG2klHaSL57edMejRAqQc8mgDkNF19/gt44njQltKmkAdRyJLG4xNBKvq0aOrKe+HXuaAP0NtriO6iSeFhJHKqujqQVZWGVYHuCCCPagCxQBzni3QYvE+k3ekzfdu4HjB/uuRmNx7pIFcehFAGZ8PNal1/w9Y3tx/x8GHyp+/7+BjBNnrz5kbH8aAOc1Bf+Eg8b2to3zW+gWL3rDt9ru2MEBI9Y4UlZfQuaAPVxxQBx3jLxDc6BaxmxjimurqYQxC4kMUEf7uSWSaZlDN5cUUbuyoCzYwKAPk3xD8arZnZLrUtS1Nx/wAs9KCaVYjnlRM6y3so9JDsDDooBoA4eP4vaaHz/Z+pRf8ATWLXr7zh7/OrRk+xTHtQB7X4J+NcErLAl7JdqePsmqiOG8+lvfxYtbg+kdysLv2kzxQB9LaVrVn4ggMlsdyj5ZY3G2SMkcpKh5UkZ6/Kw5Ukc0AcJ8Ki2mQX/htyT/YeoTW8Oev2SbFza/gI5Sg7AKAOlAD/AItzST6VDoluSsuu3tvp2R1WKV99y3HbyI3B9moA9LtbaOziSCFQkUSKiKOAqIAqqB6AAAUAeK/Gj4tL8OrRLexCTardgmJH5WGIZBndQQT83yxqeHYMT8qkEA/PLXNev/Ed29/qk8l1cSfeeQ5/4Co6Ko7KoCjsKAPWPhPetrVte+Dmfy5rwC90tyceVqdoPMj2nPBmRSh9cAd6APvTwB4oXxfottqeNkzpsuIzwY7iI7JkI7YcEgHnBBoA7IigDygL/wAI/wCOcL8sHiOwJYdjeaewG70y9tKAe58selAHrIoAKACgAoAKACgDh/HfFin/AF2X/wBAevXy/wDiy/wP/wBKR+c8Yf7jS/7CI/8ApuoeQXEC3kRibr1U+hr6drmR+H05ujNTjt1XkcPLGYXMbjBU4NcLXK7H08WpRUo7M851NCJ3frljXnTWrZ9lh5L2cY7WRktWR3rQ6jTIvLjz611QVkeHiJXlY0GqzkQhoBGLq0e5Nw7VhM9PCytLlOY6VznuEti+ZsDpg5pxepnWVoXe9zcRDIwVep6VueW2opyeyOkghFumwde59TXQlY8ac+eXM9uiH/E7/kn1v/2HI/8A0kva8XFfH8j9NyL/AHX/ALfZ6p+yp/yKt1/2FZv/AEksq4T6o+maACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAGnigDy/4PJu8NxXJ+/d3V/O59WkvZ8k+5CigD1EjFAHxT+1hppW40vUABh454GPurI6j8mbmgDzHWfD+oeOPCmneIrK3knm0mOXTr4qCWMNuRJbzerhI5DG5XJG0Z4oA9s/Zr+JH22A+EtQf99bK0lizdXhGWeHP96LO5B/zzLDolAH1wDQA1uKAPMvheot7XUrReEtNb1OJB6KZvO/nKaAOcs/E9h4a17xBqOpM2+S7sbK3iiRpZ5misllEMMSAs7ZmY4AAHUkDmgDRT4laqJXVtBvJIuiG3ubOWVTj7lzF5ym3kHdGLFQRnmgDwT4q/E2VkkN2YotQeGW3tNPt5Vn+wpcJ5c91ezxkxteSQloYIIsiFHdnYsaAPkXNAH1T8CPhFoPjjTpdW1cy3Dw3Bh+zI5jRQqq4Z2X523hugIAx3oA+km+BngtojD/ZkQBGNweUOPcNvyD70AcVd/CnXfBco1HwRfNN5PSxvjuDR9TCk/G6M9o5QNp5SRTQB0Pw81WfU/Emp3F1azabPd2GmzT2sww0c0bXVu+D/EjCNSj8FlxkDpQBu+LEFz4r8OwNnbG2pXOOxaO1EaH/AID5pI+tAHqJHFAHyn+0Bp/hfQ4JdRubUXmvamNlvvllOxVUKZiithY4hgIoGGkI/wBo0AfDDqUOCCCOx4I+tAF7SdTn0W8hv7RjHPaypLGw7MjBh+HGCO4JoA+9fh74kgsteV7f5NK8ZQf2haj+GHUYhtvbf0DMQWx3IHFAH0gDQB5X8RAbfUvD16nDR6wkB90ureaNh9MhSfpQB6sKACgAoAKACgAoA4fx2P8AQU/67L/6A9evl38WX+B/+lI/OOMdMBS/7CI/+m6h5Jjb0r6g/DDH1ez89fOQfOnUeo/xrCavquh6WErezfspP3Xt5HkN2MyOD/eNeRLdn6FS0jG3ZGMYSHAHc1nbWx6XP7tzrIF2IB7V1LRHz83eTFagEFAFK7TehFRJaHTSfLJM4mc7CV71xPQ+ngr69CTTeJfwNOO5GI+D5nd6fa+UvmMPmYcewrujGx8rXqcz5I7L8WaBqzkI/id/yT63/wCw5H/6SXteJivj+R+pZF/uv/b7PVP2VP8AkVbr/sKzf+kllXCfVH0zQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA00AeX/CNzDo0untw+m6jqFqw9Nt1JIvHoUkDD2NAHqNAHzN+1Fpv2nw3b3gAJtL1MnuFlR0OPYsFz+HpQBofs1X8F54RFqhBktLqdJVxz+8IkUkdwyNjnrtI7UAfKfxJsX+G3jed9IP2f7NPHd223ICCQLLs90BLIR0KfKaAP0F8C+Lbbxto9vrFrgCdP3kYOTFMvEkR/3W6eqlT3oA680AeXfCcm50y81D+HUdW1K5Q+qG5aJT9CIsj2oA8R+Kdve2k3iKbTJHt7yyl07VI5Ijsl+z3Fo9hd7WHIACLuK4OAeeKAPjFbiVSWDsCxySGYEk8kk55J9+TQB7D4R+BHifxhbC+jjjsraRd0T3TNGZQehRFVn2ns7KqkcgmgDznxT4T1HwbfvperRGG4jwRg7kdD9142HDI3YjvkEAgigD6c/ZR1N47jUtNIby3jhuFODtDIxjfnoGIdcc84x2oA+1xQAhUYxQB5d4bIvPGGu3KfdtYdNsgf8AaWOW4cfh5659M0AHjRvsPiLw7fHAQ3d3ZsTxzdWjeWPqXiAoA9SFAHG+N7m503TZrvTLH+09RC+XbxBEYh34DuX6RRn53wecYHJzQB+YPi7RtW0XUHTX42hv5/38iuULnzCTuYISF3HJC8cY4xigDmKAPe/hjqU+t6RdeHoG26npsg1nRm/i+0W/Nzbr0/10QyFBAJDE0Afe3hDxJB4t0i11i2wEu4g5XPKSD5ZIz7o4ZfwB70Ach48P2vW/Dunpy51GW8YekdrbSbjj/flTB7GgD1YUAFABQAUAFABQBxHjr/jyT/rsv/oD16+XfxZf4H/6Uj834x/3Cl/2ER/9N1DyYivqD8LRGaRSPH9dtPJnd0GBuP4V5FWNpNo/RsFU5qcYy35UUdHsRf3IjbIVQWJHbjj9azpx5pWex1Yqs8PSclvdJL8zXuLdrVjG/BHT3FbNcuh50JqqueOxVNSboQ8UAhYrc3Dbei9zRa+gSmqS5uvRHBapbG0upI+ytx9D0rz5rlk0fWYaoqtGE11Wvr1NLw/aiWcM3QAmtqUdTix1TkpuMd7nddK7dj5UYaCyL4m/8k+t/wDsOR/+kl7XiYr4/kfqWRf7r/2+z039l65is/CV3LO6RRrqs2XdlVRm1sgMsxAGSQBk8k4rgPqj6ITxDpjkKl3asx4AE8RJPoAHoA1waAHUAFABQAUAFABQAUAFABQBBcXEdohlmdYo15Z3YKqj1LMQBzx170AZf/CSaV/z+Wn/AIEQ/wDxdAEkWv6bO4jiu7Z3Y4VVniZmJ6AAOSSfQCgDVFADqACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAGmgDyjSX/4RrxjfabJ8sGvwpqNqecG5t1EF7GP9ooIZsDtuNAHrHSgDyb43aX/AGp4O1KMDLRRLOuexhdXOPfaGoA+EPhj8TL74a3z3Nuv2m1uAFuLZmKq4ByrqwB2yJztbGMEg8GgDG8f+L5vHmsz63NGIPO2KkYO4RxooVFLYGWwMscDknA7UAfRX7KWsTrc6jpBJMBijulBPCyK3lNgf7asuSP7goA+nviJ4hbw5oVzcwfNdyqLa0QdZLq4PlQKo7kO24/7Kk0Aa/hLQl8M6PZ6SnP2O3jiY/3nC/vG/wCBOWb8aAPP/G1pFpniDT9WuVVrDVYpdDvw2Au24zJaMx6AGUPFk95F5oA818N/suaZZXT3Gr3Ul3CsrGG3iHlr5e7KCZzlmbGA4QKPc0AfVMcaxqFQBVUAADoAOAB7ADigDx74weCdP8QWEer3cH2mTRmFyY8kedaq6tdQMRyVMQZ0AOQ68feOQDR1KzsfDDaXq+lRxW9hG62kqwKEj+y32xYpCFGCI5xC2484ZjmgD1IcUAUtT1GDSbWa+umEcFtG8sjHgKkalmP5D8aAOA+FNjOmkNqt6pju9cuZtSlUjBRbg/uIzwPuW6xjHY5oAtfFDSZ9S0GaWyG69054tQtQOpms3EwUf9dEV4/+B0AdXoGsweIdPt9UtDugu4UmT2DgEqfdTlWHYgigC/d+b5T+Rt83afL352b8fLuxzt3YzjnGcUAfm18Y/Bd34WvxdazqMOo6pqTNPLHCkg8tDwHJc8KT8kSYHyqSOBQB4tQBueG9euPDGpW2rWZxNZyrKvo2D8yH/Zdcow7hjQB95/DLWbfSNam0u1P/ABKfEUP9s6Tnojvj7baDsGifLbR0APHNAHX6G3/CS+ML/Vl+a00SBdKt27NcyMJ71lP/AEzxFCeeoI7UAetCgAoAKACgAoAKAOH8dcWKf9dl/wDQHr18u/iy/wAD/wDSkfnHGP8AuFL/ALCI/wDpuoeSk19OfhaREWxQWkcBqMYlkkU92NcE92j67DtwjBrshvh6wa28yVh947VOOoHX9aikrXfU1zCrzqnFXta77Nmrf2gukx0cfdP9Pxracbnm0Kroy/uvdHHSKUO1hgjtXJtoz6KLTV1swVC5CryTRbogbUVd9DcigFuu0de5rdLlPLlPnd+nQ4nxLYl7hJVHDrg/Vf8A61cVaPvJrqtT6jLq3LRnB/Zlp8yfSIxFJtHZTTpqzMcVLmjfzOgPFdB5AykUR/E3/kn1v/2G4/8A0kva8XFfH8j9SyL/AHX/ALfZQ8Kf8kc13/sKR/8AoWk1wH1R7jo3wI8I65oNnK9q0Nzc2dvIZ4ppA6yyQqxcAsUPzHdtK7e2KAJv2fNavrmx1DRb+V7r+xL5raGd8ktH842biSSFaMsAfuq6qCQAAAdt4++JcPgyW30y0tpdV1m/z9msYTtJA48yV8N5ceQcHaS2GOAqs6gHGT/FnxF4UaO48Y6E1hpsrhTd2twlyINxAXzkQtgc85ZCf4VY/KQD3RL6O4thd27CWJ4/NjZT8rqV3qQfRhgg4PBoA8i+E/xij+JbXFvJbf2fc2ypKkfmmUSwsSjSKTHGfkkG1gAQMjnORQB2Pijxk3hvU9J0wQecNauXty+/Z5OxFbcF2NvznG3K/WgBnjLxo3hO50u2EAuP7Xv0sifMKeUHGfMA2tvx/dyv1oA7skj/AD70AcF8PfGreOLS5u2gFr9kvp7PaJPM3eTt/eZKJjdu+7g4x1NAHEXnxS1vWr+5sfBWkf2rDp0pguLye4S3gMy/fji3ld5X+9vz32bSrMAdxa2snxA0BrTxRYPp5ui8dxZ+cWIEUvyss0YQ7X2K6kfwnGWByQD5p+NXwj8N+C9HgvdIt3hnlvoYGZp5pB5brIWXa7MATtGGHI7UAe4aJ8C/COh3UGp2drKlzauk0TG5uGAdcMCVL7Tz1BGPagDpvHvxAs/ANrHNPHJd3d3J5VpZwczXEpwML12qpI3NhsbgFVmIUgHnN38UfGHh+H+1Nd8NtDpYAaVra7jmuIEPV5Ihk/L3DCEDozryaAPbNC1y08R2MOqadJ51rcoHjccZB4IKnlWUgqynlWBB6UAea+K/ilPYat/wjXhmwfXNWRQ86LIIYLVTgr50pBAYgqSpKABgC+47aAMzTvizqWkajb6T420ttFa+YR213HMtxavISAI3dciM5IGfMfGRvCr81AHp/jDxAfC2jXesLH55sYHm8osU37cfLuw23OeuD9DQBe8P6odb0611Ep5X2y3in2bt2zzUV9u7AzjOM4H0oA53x/46t/AVil3LFJd3FzKtva2sP+snnfO1AcHaMDLNhiOAFZiBQBzPh3xb4zu9Qgg1nQUsrG5Ygzx3kcrW4CMwMsa7ickBeRHgn14oA9hoAKAKd9cmzgedUaUxqWCJ95iOir7mgDibjxRq1gn2u708x2oxuKyhpEB7sozjHoVXJ4oA7i2uUuokniOY5FDqenDDIz/X0/CgDij4qv7xpJdLs/tNrAzKZGkCmQr18te/tgNn07UAdRo2rRa1bLdwZCtkMp+8jLwyt7g/mOaAMfxH4th0EeWi/aLjG4xqcbE6F3IB2jkADGSTQB1UEnmxq5GNyhsemQDQBz2ueIl0l47WCNrq8nz5cKHBwOrMcHav4c/TmgA0m/1WeYx6hapbx7SyukgfkEfKQCcEgk9unSgDpRQAtABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAYoA4H4geGrjX7KO40tli1bTJVvLCRvu+cgIaF+/lXEZaKQdOQT0oA0PB3i228X2IuoQYZ4mMN1avxLbXCcSQyL1GDyjdHTDDrwAbesadHq9lPYS48u6hkhbPTEiFT+Wc0AflSnhK6j19PDV0DBcG8S0bI+7ukCbwO6lTvUj7wxjrQB3eqfE+60O+l0vR7e0j0S0ka3SxltopVuIomKM9y7p5ryz4Lu4dShYBCNoNAG54f1O2+HnjfT9S05jDpGrRW8wjZuIra+XbJE7E8i1n3bWbnbGrHrQB9U6S5+I+uprQ50HQ3dbAkfLe32Ckl4o7wW4zHbt0ZyzqaAPaBQBg+J/D1t4p02fSbwHyblNu5eGRgQ0ciHs8bhXQ/wB5RQByXgHxRPdrJoGt4j13SgI7gHgXMI4ivoc/einXBfH+rk3KwHFAHpYoAjmiSVGjcBkcFWUjIKkYII7ggkUAeW+HNMGqaDe+E7tj5mnNPp24/e8nHmWMw78QPCQf78Zx0oA6vwXrEmtaRBcXHy3UamC6XutzbsYZxjtmRCyj+6ynvQBwfim4PxD1QeErEltMs3SbW50+4djB4tOVhwZJWAe42n93GApO4kUAeyRoIwFUBQvAA4AA4AA7ADoPTFADyM0AeL6LOPhtrTaDdfJourzPPpcx4jtrmQ759PduiB2Jltc4By0YyegB7IeaAPjH9oPwx4c0BZNTuXurvXdVcmFXn+SJFIBkMYXiGJQI4k7scfwmgD47PFACUAe8fD/X7vVtMg8P6cZf7e0/UI7nRZETcEWbK3scrH5Ut0TMzFuMnpyRQB98eEPDUHhLS4NLgYyeUC0srffmmkJeaZz3aSQs3PQYXtQB1FABQAUAFABQAUAcN48/48U/67L/AOgPXr5f/Fl/gf8A6Uj854w/3Gl/2ER/9N1DyI19OfhpEaRojhrz/Wv/ALxrhlo2fU0dIR9EfQA8GrPoNvAihbuGPzAcdWYbnU47N298GvFhiHTqyb+Fu1vQ/TcTkyxWXU4RSWIpx5ou299XFvs1b52PHJlaNirAqVOCDwQR2Ne/e+q2Z+QuLhJxkrNNpp9H1RhalZ+cPMT769R6j/Gspxvqj0sNV5Pcl8L28iKztfIXc33z+g9KUY216/kVVqc7tH4V+JbVGkYIgLMxAAHUk9B9c03ZK70SIhFyajFNtuySPQfEvgMaf4We4dQ17G0c7HHKqSFZAfRVJLerD2rxXXc6vKvh2R+lwyxYTAubX758s5d4rqvuPCdM/wBd/wABNd0Nz5XEfw/mjcNdB5Yw1JRH8TuPh/b/APYbj/8ASS9rxMV8fyP1LIv91/7fZQ8Kf8kc13/sKR/+haTXCfVHo41T4qQ+HLdNMsrD7P8AYoRFLasHu1hESbGWOSbDSlMcJGzBs7VBxQB6L8BjoY8PmPRGmeYTMb8XQC3Iu2A3eaqkgLhcRYJG0HJMm+gDO8AWv9s+OvEmtXA3vYvBp9tuGfLQKfMC+m7YpyOfmbsTQB7Rr+kQ69p9zptyoaK7hkiYEZ4dSAfqpwwPUEAjmgDyH4EX8t54KjhmO42T3dqp9UjYlPwAfaB2AGKAPEvCcMnhTwv4d8fWikjTprq01FV6yWFxfTrub18l2+Xg/M6HopNAHuHxHmS48QeEZomDxyX8zow5DK0KFWB7gggj60AHxh/5CHhn/sOw/wDoNAHuR/qP50AeE/s/8aRqX/Ybvv8A2lQByfhfxK/wY1C70DxPDJDpV9fTXNhqaIWgPnkExzkZKkALk8shzuHl7XAB9OWtzFeRJPbussUqh0dCGRlbkMrDIII5BFAHz9+0r/yLtp/2E7b/ANAloA+hIuI1/wB0fyFAHgKwDxD8U3NyA0egaXG8CnkCa4KkygdAwExGfVVPUCgD32WFJ0MTgMjgqykcFWGGBHoQSMUAeBfA0nRYtc0In9zo+qzrCpJ+SFwWVR14/ds3rksT1oAk/Z8tRc6Tea/N813rGo3Mssh5LKjlUX1ChjIQPegDpvjfo0OseD9REoy9pD9ribukkBD7gexKb0PsxoAxfEWoy6v8L5L645muNEjkkPq7QoWP4nJoA9G8Bf8AIuaX/wBg+1/9EJQBwvxl8P6rf2+n61ocX2q80G9W9Ft3mjGN6oO7jaMKPmILbMvgEA6HwL8TNJ8eRlLNmt76Af6RYzjZcQkYDfKcb0DHG9eOgYK3ygA9HFABQAnSgDlfGF+ljpsqkbpLgeTEndnfjAHsMn8qAGvBJo3h9ojxLBZsD7PsP8icUAWfCUC2+kWqqAAYVf8AF/nP6mgDH8JfuL3U7VfuR3QdR6eYGLfyFAEnjKwgg028ukRVmmSMO4HLBWUD8P596AOvtP8AUR/7if8AoIoA8wg1pbfWb6ZIZby7Li3hijHKxxDDsWIIRSw5OD+tAHXaN4lXU53s7iGSzu413GKTnK/3lbAz+Q45HFAHUjigBaACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAMUAeY+KPBF1Lef8JB4ZnXT9aVQsm9SbW+jXkQ3aDqR0jnX94me46AGZZ/Fq201xZeL7abw/eDjdMpkspT03Q3aBoypPQSbSOmTQB4B+0NJaSX2meL9Bura5aIrG7wSxyFZInE1vIwQ5IPzKSf7oHHFAHk+taLo3iy6/tnSb1Lf7fIZJ9OMM8t3BO53SrBHEjLPEXJaJtyYBCvtwTQB7toPwQm8ZX9vqeuQyaZo9jbQWtrYyEfbJooBgNc7Plg81i8jqCX+baMD5iAfW9lZw6fClrbIsMMKhI40AVUVRhVUDgAD/OaALfSgAoA4Xxl4Ih8UCK6glfT9VsstZ38OPMiJ6o68CWB/wDlpC3BGSCDzQByMPxGv/ChFp43s3tdpCrqdmjz2E3bewUGW2Y9WR12jnlRigDvdP8AG+g6rH5tnqNnMp7rcRgj6gsCPxFAHnWt+ONC8JeIlv5L23NvqVo0NysLiaRbi0O+2cxxb2JkiklhGBkssYoAwtMXxF4uu74eH0m0HQtTnWeS8uo9l4zGMRzmxgJJj+0bFfzpQCrbmUZOKAPbvDnhyx8K2SadpsflQx5JJO55HPLySueXkc8u7ck+woA38UAFAGJr2g2XiWyk03UohPbTDDKeCCDlXRhhkdTyjqQynkUAeVxX3iT4bYt76KbxHoacR3cADajbR54S5hyPtKIvHnR/PgZYE4UAHnnxI8U/DzU7GfxEyQ6rq5RYYbeZpkmWTBCCS3co0ccfLv8AKATx1bNAHw4+cnOB3wOBz6e1AHd+Dfhnr3jmYR6XbP5JPzXEoMcCD1MhGD/uoGY9AKAPv/4X/CXTvhtbExn7VqMygT3TLg44JjiXny4gRnGSzkAueAAAetCgBaACgAoAKACgAoA4fx3/AMeKf9dl/wDQHr18v/iy/wAD/wDSkfnHGOmApf8AYRH/ANN1DyQrX05+GJkRWgtM57SdPOp6xFagZDzDcP8AZX5m/wDHQa8uvLkjKXl+eh97llH6xVoUujab9F7z/BM+tFUKAo6AY/KvlT95SsrLp+R478QfDXlMdUt1+ViPOAHRuz/Q9G/Ovcwde/7qX/bp+W8Q5X7NvMcOtG7VElt/e/T11PI2NeufnSK7UnobI9X+HHhXz3GrXS/Ih/cKR1Yfxn2H8PvzXj4qtZeyju9/Rn6LkGW87+vV17sf4a7y6v5HsWq2C6lZzWb/AHZ43jP/AAIEf1rx4vlafY/R6sPawlT/AJk196PhK1ga1u3gcbWiLIQeuQcV79N3s/I/IMXHki49pWNiuo8Yaakoi+Jv/JPrf/sNx/8ApJe14uK+P5H6lkX+6/8Ab7KHhTj4Oa7/ANhSP/0LSq4D6o+vPDPiHTNN8OWEt3dW8EcOn2xdnmjAQLAmc/NnI9MZzx1oA8l+BUo1jWfEmu2aMmm316vkHBVXIeVyyjAGQrqzdx5gB5JoAuaHqKeBviHqum6gwgtvEiwXdlK/yo0yAq8e48b2ZpByfvKi9XGQD1nx74utfBej3GpXLqjpE4gQkbpZmUiNEXOWy5BOM4XJPAoA5P4QeHp/Dfg63huwyXNzHNdyowwVa4y6qR1BEezIPIbIPSgDB+CWk2+u/Dm2027XfBdpfQyD/Ze7uFJHoRncD1BAIoA8k0bU7i11rw94Q1NidQ8N6xcW2T1ltGiVrWUdfl2fKvogQUAew/HOQ6bFouuOCbXS9Ytprgj+CNgV3n2BAH1YDvQB7Fca3Y2tk2qSTxrZJH5xn3r5ewDduDZwcjoAck8DmgDyH9n6KT/hHZ75lKRajqd5dQbhgmJmVFYg9MsjD6DPegD1fVrXTNd06WO/EFzp8sZ8wuVaIpg5ffnau0ZIcEFTyCDQB5N+zsz/APCMMgZ3tYtQu0s2fJBtgyldhPVd5k5/vbh2xQBm/tK/8i7a/wDYTtv/AECWgD6Ei/1a/wC6P5CgD528SXyeAfiLb61ekxaZr9kLKSdv9XFcxEBN7dFUhIuSejMx+VGNAHumta9ZeHrGTVL+VYbWBDIzkjkAZCpz87N0RVyWYgDOaAPIfgPYXE2k3uvXqtG/iC/nvURs5EDHbH19fnKnum0jgigDK+COpJ4buNS8DaiwhvrC9mmt1Y7ftFvMQQ8QPXoHwCTtkB7NgA3/AI6+JI7DQJdDtiJdU1opZ21spzIwldRI+0chQmVBOAXZRzzQBa8a6R/wj/w5utLzk2WjiAn1MUSIx/EgmgDr/Ad3Cnh3TAZEBFha5+deP3Ke9AHXPcRK6xF1DyAlFLAMwXG4qM5YLlc4zjcM9RQB86/EqytrHxr4bvNMCxatc3jJceVxJLagJuaZV5KhTIu9uSmRkheAD6SFABQBUu7qKxieedgkcYLMT0AH8z2A7mgDiNFgfxDd/wBt3o2Qx5WyhY9FzgysD/Ee3v7KtAHW6vbG9sZ7dOssMij6lTj9aAMbwdfR3GkQHIUwJ5UgJA2FOCGz04APNAFLwZ/pUl/qI/1d1dHyz0ysYIDD2O79KAL/AI440a5/3V/9DWgDo7T/AFEf+4n/AKCKAOH8PLHZa3qVvJhZpnWWMnq0bZYhfXDHnH9KAH3zrP4ms1hILwQTGbH8KsrBA34nOD0yPWgDvRQAtABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQBXuLWK7QxToksZ6o6hlP1VgQfyoA4q5+F/hW7fzJtJsGfOc/Z4x+e0DP40Ab+k+GdL0EbdNtLe0H/TGJEP5gZ/WgDexigAoAKACgAoAjdA4KkZB4IIBB9sHg0AcbffDnw1qUnm3Wl2Esh6s1tFn8cKKALuleCtD0NvM07T7O1f+9Fbxq35hcj8KAOoAxQAtABQAUAFADSKAOe1Twjo+tHdqFja3TH+KWCNm/76K7j+dAGTa/DXwxYuJYNLsUccgi3jyCPqCKAOzhhSBQkahEXgKoCgD0AGAPwFAE1ABQAUAFABQAUAFABQBxHjn/jyT/rsv/oD16+XfxZf4H/6Uj834x/3Cl/2ER/9N1DyYjFfUH4WiJsA0i0bXw103z9WuLwjK24IU+jvkf8AoGa+exsrLkXV/wDBP2PhijzT9u1pCCS/xS0/K570K8I/ViCeBLhGilUMjjDA9CD1FNNxd47oznCNWLp1EpRkrNPqmfM/izQH8PXZiwTDJlom9V9PqvSvpqFVVY36rddj8NzPLpZbWcNfZS1g/LsQeFvDsniK8EIysCfNK/YL/d+rdB6daVeqqMb9XsisswEswrKmtKcWnOXZdvVn1BbW6WsawxAIiAKqjgADpXzTbbu92fuFOEaUVTpq0YqyS6JEx4pGh8dePNKOleJ7kAYS4AnX0/eAEgfQ8V7eGlzRXkj8vzmn7KpJdG1JfPc5416B8iNNSUR/E7/kn1v/ANhyP/0kva8TFfH8j9SyL/df+32dp+z54as/F3gTUNI1IO1rc6q/mBHMbHy4NPlXDLyPnRc+oyK4T6o9Etv2c/BdtIJDazS7TnbJcylTj1AK5HsTigD2PTNKtdFtkstPijtreEbUijUKij2A7nqSeSeSSaAMXxZ4J0jxtbC01m3W4RDujbJSWJjjJikXDITgZwcNgZB4oA4vSvgh4b0u6ivpI7i+ltyGiF7cSTpGwIIZY2O3IIBGQQCAcUAetvGHUoejAg9uCMH+dAGF4W8MWXg7TotI0xXS1ty5QO5dgZHaRsseT8zEj0HFAGJqPw40XU9dh8TzxONStdmyRJGVT5e4IXjHysQGK5PJUAHoKAOt1HTLbVreSyvYkuLedSkkcg3K6nqCD+YPUHkEECgDyBP2fvCqMFKXbW6uHFq13Mbfht2Nmfu57Z/GgD2S1sobKBLW3RYoIkEaRoAqogGAqgcAAcACgDxtv2f/AAucoovUt2JzbLezCDBOSu3OQpPYH8RQB6/pmmW2jW0djYxpb20ChI4oxtVFHYD9SepJJJJOaAMTxd4N07xtapY6qrvDFMk6iORoz5iBgpJXqMMePx7UAdSq7AFHYYoAw/EPhrT/ABVZvpurQJdW0mCUbIIYdHRgQyOOzKQR9MggHmNt8A/C8EkbSpdXcUJBS3uLqWSAY+6DGThgBxtPBHBBoA9mihWBFjjUIiAKqqAFUAYAUDAAAAAAAAHFAHDeL/hponjZ47jU4WF1b8RXMEjQzovPy+YhBZQSSFbIUklcZoAo+GPhLoHhS8/tK1ikuL3G1bi7me4kjHIxGXyEOCRuA3Y4yBQB2uuaJbeIbGfS70M1tdxmKQKxVirdQGHIPuKAPIx+zv4SUYCXgA4AF5NwPbmgDs/E/wANdH8Ww2kN+s6nTUKW0sM7xSxqyojDep+bcI13bs5xmgCHwp8LND8H3TahZRyzXjrs+0XUzzyqnOVjZz8gOcEqASOCcUAej9KACgDO1PTIdWga1uAxifGdrbTwcjkc9RzQBzQ8A6YvA88AelxJ/jQB1FhYR6bAlrDu8uMYXcxZsZJ5Y8k5PegDnbzwTp15K8xEkZlOZFikZEcnruUcc98UAdNaWkVjEsFuojjjGFUdAKAItS06LVLd7S4BMUgAYKdp4IPUe4oAtxxiJQi9FAA+gGBQBh6t4ctNaZZLhWWWP7skblHA9Ny4yPr07UAP0jw9aaJuNsp3yffkdi7tjoCx5x7fnzQBuDigBaACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgANAHEeOTixTH/PVf8A0F69bAPlqu/8n6o/POLouWBpqKb/AH8dl/07qHj7uR2P5H/CvpedLqvvPxBUZfyv7iqzn0P5Gp513X3m6oy/lf3HsHw6077Hp5nYYe5lZz/ujhP0zXyuLlzVHbZH75w9h/q+CjNq0qmvyWi/A9BrgPrwoA5vxLoCeILN7ZsLIPmib+64Bx36HofauijVdGXMtuq7nkZhgYZhQlRlpLeEu0uny6Mb4X8PR+HbNbdQDK3zSv8A3n7/AIDoB6UVqjqyb6bL0Jy7BRy+gqStzvWb7y/yXQ6UcVznsimgDwX4xaVmWz1FB03wMQPUb1Jx/u4FelhJWbi/U+H4gpN04VIrW9tPmzxUow7H8j/hXr3Xc/POSXZ/cMKN6H8j/hSuu5XJLs/uIfidx8P7cdP+J5H7f8ul7Xi4r49Ox+oZErYWz0fOyn8FPjXovw30WbS9UhvZppr2S5VraOB0CPBbxgEyXETbt0TEgKRgr8xJIHCfUnsH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NVeFf+fXVf8Avzaf/JtAETftTeFH+9aaocesFp/8m003HZ2IlCM7cyTtrqr62t+Vxp/ai8I/8+Wp/wDgPZ//ACZT5pd2R7Kn/JH/AMBX+Qn/AA1D4R/58tT/APAez/8Ak2nzS7sPZQX2I/8AgMf8iVf2qPCqAAWmqgDoBBaf/JtT5miSj7sUkkrJLoP/AOGq/Cv/AD66r/35tP8A5NpFB/w1X4V/59dV/wC/Np/8m0AH/DVfhX/n11X/AL82n/ybQAf8NV+Ff+fXVf8Avzaf/JtAB/w1X4V/59dV/wC/Np/8m0AH/DVXhX/n11X/AL82n/ybQBFJ+1L4TlG17PVGHoYLQj9b2jVbaEtJ6NJrzIP+Gm/B3/PhqP8A4DWf/wAmVXM+7M/Zw/lj9y/yD/hpvwd/z4aj/wCA1n/8mUcz7sfs4fyx+5f5Hk3xm+MuhfEHRIdK0i3vLeWG9juWM8UEcZRILiMgGK4lO8tKpAKgYDfNkAFN9y4xUFaKSXkrH//Z" alt="" /></p> <p style="text-align: center;"><span style="font-size: larger;"><strong><br /></strong></span></p> <p style="text-align: center;"><strong><span style="font-size: large;">&nbsp;- Welcome to the Maya BonusTools Resource Page -<br /></span></strong></p> <p><span style="font-size: larger;">Here you will find links to installers, useful info, tutorials and updates related to Maya BonusTools.&nbsp; This page will be continually updated with new information, so bookmark it and check back later for more updates.&nbsp; Feel free to provide feedback and suggestions in the comments section below.</span></p> <hr /> <p style="text-align: center;"><strong><span style="font-size: large;"><br /></span></strong></p> <p style="text-align: center;"><strong><span style="font-size: large;">!! BonusTools is now available for Maya LT 2016 !!<br /></span></strong></p> <p><br /><span style="font-size: larger;">BonusTools has consistently been one of the most requested improvements on the Maya LT forums. You can now download the installation pachage here -&gt; <a href="/userdata/blogs/stevenr/Downloads/MayaLT_2016_BonusTools.1.zip"><strong>MayaLT_2016_BonusTools.</strong></a></span></p> <p><span style="font-size: larger;">Note: The installation process for Maya LT is different.&nbsp; See the README.txt file in the zip folder for instruction on how to install.</span></p> <p><span style="font-size: larger;">Note 2:&nbsp; </span><span style="font-size: larger;">The install package was updated on 2/1/16 with a fix to a bug that was found with the Auto Unwrap UVs Tool.&nbsp; This fix only applies to Maya LT.</span></p> <hr /> <p><span style="font-size: larger;"><br /></span></p> <p style="text-align: center;"><strong><span style="font-size: large;">Maya BonusTools 2016 Installation<br /></span></strong></p> <p><br /><span style="font-size: larger;">The Maya 2014-2016 installer for BonusTools is available for download on the Autodesk Maya Apps Exchange -&gt;&nbsp; <a target="_blank" href="https://apps.autodesk.com/MAYA/Detail/Index?id=appstore.exchange.autodesk.com%3Aautodeskmayabonustools2014%3Aen"><strong>BonusTools 2014-2016 Installers.</strong></a>&nbsp;<a target="_blank" href="/userdata/blogs/stevenr/Downloads/MayaLT_2016_BonusTools.1.zip"> </a>The Exchange is a portal hosted by Autodesk where you can get access to plugins that extend the functionality of various Autodesk products.&nbsp; There are both <strong><a target="_blank" href="http://apps.exchange.autodesk.com/MAYA/Home/Index">Maya </a></strong>and <strong><a target="_blank" href="http://apps.exchange.autodesk.com/3DSMAX/Home/Index">Max </a></strong>centric pages on the Exchange.</span></p> <hr /> <p style="text-align: center;"><strong><span style="font-size: large;"><br /></span></strong></p> <p style="text-align: center;"><strong><span style="font-size: large;">BonusTools 2016 Bux Fixes</span></strong><strong></strong></p> <p style="text-align: left;">There is a bug with the new <strong>"BonusTools -&gt; Display -&gt; Floating Frame Rate"</strong> tool that was inadvertantly affecting the ability to undo.&nbsp; It has been fixed in the following script.&nbsp; Simply download and save/copy this script to the BonusTools python-2016 folder (e.g.&nbsp; "C:/ProgramData/Autodesk/ApplicationPlugins/MayaBonusTools/Contents/python-2016").&nbsp; You can now use <strong>"BonusTools -&gt; Help -&gt; Go to BonusTools Install Location"</strong> to find the specific folder on you computer.<strong></strong></p> <p style="text-align: center;"><a href="/userdata/blogs/stevenr/Downloads/bt_createFloatingFrameRate.zip">bt_createFloatingFrameRate.py (zip file)</a></p> <hr /> <p></p> <p style="text-align: center;"><strong><span style="font-size: large;">- BonusTools Tutorials -<br /></span></strong></p> <p></p> <p><strong><span style="font-size: large;">Edit</span></strong></p> <ul> <li><strong><a href="https://youtu.be/WJchCWqR_vY?t=33m41s" target="_blank">Duplicate as Mesh Reference (NEW)</a></strong></li> <li><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=3m10s">Duplicate on Object</a></li> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=2m18s">Paint Duplicate on Object (NEW)</a></strong></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=v1V4zZCs-S4">Paint Geometry&nbsp;Tool (Legacy)</a></li> </ul> <p><strong><span style="font-size: large;">Create</span></strong></p> <ul> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=3m32s">Mesh Locator (NEW)</a></strong></li> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=4m4s">Separator on Shelf (NEW)</a></strong></li> </ul> <p><strong><span style="font-size: large;">Modify</span></strong></p> <ul> <li><a target="_blank" href="https://www.youtube.com/watch?v=po3e1Zr7ftk">Click/Drag Move</a></li> <li><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=1m37s">Click/Drag Move and Rotate</a></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=1m3s">Move Selected to Camera</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=CAZvR9G3ZRM"><span style="color: #ff0000;"></span></a><a target="_blank" href="https://www.youtube.com/watch?v=aN47CfcKbhM">Proportional Transform</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=CAZvR9G3ZRM"><span style="color: #ff0000;"></span><span style="color: #ff0000;"></span></a><a target="_blank" href="https://www.youtube.com/watch?v=boxakNJ-b5M">Randomize Transforms</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=CAZvR9G3ZRM"><span style="color: #ff0000;"></span><span style="color: #ff0000;"></span></a><a target="_blank" href="https://www.youtube.com/watch?v=q0l_dBfzht0">Store Transform / Attribute Values</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=CAZvR9G3ZRM"><span style="color: #ff0000;"></span></a><a target="_blank" href="https://www.youtube.com/watch?v=q0l_dBfzht0"></a>Mirror Translate/Rotate</li> <li><span style="color: #ff0000;"><a target="_blank" href="https://www.youtube.com/watch?v=XCGCxTvIAcc">Bounding Box Scale</a></span></li> <li><span style="color: #ff0000;"><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=4m54s">Zero Pivot Tools <br /></a></span></li> <li><span style="color: #ff0000;"><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=4m4s">Move Curve Pivot(s) to First CV (NEW)</a></strong><br /></span></li> <li><span style="color: #ff0000;"><a target="_blank" href="https://www.youtube.com/watch?v=oofVnLDhtNA">Orient Mesh to Vert/Edge Tool</a></span></li> <li><span style="color: #ff0000;"><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=2m30s">Snap Align Object(s) to Component</a><br /></span></li> <li><a href="/blogs/cory/locking_curve_intersections" target="_blank">Snap and Lock Curve Points</a></li> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=5m10s">Edge Segment Snapping (NEW)</a></strong></li> </ul> <p><strong><span style="font-size: large;">Display</span></strong></p> <ul> <li><a href="/blogs/stevenr/bonustools_2012_paint_geometry_tool" target="_blank"><span style="color: #ff0000;"></span></a><a target="_blank" href="https://www.youtube.com/watch?v=389jv0k0hlE"><span style="color: #ff0000;"></span></a><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=6m21s">Heads Up Display:&nbsp; Shell Count</a></li> <li><span style="color: #ff0000;"><span style="color: #ff0000;"><a target="_blank" href="https://www.youtube.com/watch?v=MPJyHZ92Xho">Heads Up Display:&nbsp; Area/Volume/Distance/Length<br /></a></span></span></li> <li><span style="color: #ff0000;"><span style="color: #ff0000;"></span><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=7m39s">Floating Frame Rate (NEW - see bug fix above)</a></strong><br /></span></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=389jv0k0hlE"><span style="color: #ff0000;"></span>Toggle Selected Faces Display</a></li> <li><strong><a target="_blank" href="https://youtu.be/WJchCWqR_vY?t=32m20s">Toggle X-Ray Per Mesh/Surface (NEW)</a></strong></li> <li><span style="color: #ff0000;"><a target="_blank" href="https://www.youtube.com/watch?v=v4mdDnSlaD0">Adjust Clipping Planes</a></span></li> <li><span style="color: #ff0000;"><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=6m25s">Orthographic Control (NEW)</a></strong><br /></span></li> <li><span style="color: #ff0000;"><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=7m3s">Display Control</a><br /></span></li> </ul> <p><strong><span style="font-size: large;">Windows</span></strong></p> <ul> <li><a target="_blank" href="/blogs/stevenr/layouttools">LayoutTools</a></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=10m55s">Scene Assembly Manager</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=qUfoD88Zq3A">Scene Annotation</a></li> <li><a target="_blank" href="/blogs/stevenr/bonustools_2012_the_scene_annotation_tool"></a><a href="https://www.youtube.com/watch?v=bcyflNVGgQI" target="_blank">Layer Viewer</a></li> <li><a target="_blank" href="https://youtu.be/4DbWh1Rgs6s?t=11m43s">Pattern&nbsp;Rename</a></li> <li><a target="_blank" href="https://youtu.be/4DbWh1Rgs6s?t=11m43s"></a><a href="http://the-area.com/tutorials/how_to_use_attribute_collection_2_02_to_build_a_custom_ui" target="_blank">Attribute Collection</a></li> <li><a target="_blank" href="/blogs/stevenr/bonustools-2013---attribute-editor-customization">Attribute Editor Template Builder</a></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=12m52s">Script Editor: Print Global/Option Vars</a></li> </ul> <p><strong><span style="font-size: large;">Modeling</span></strong></p> <ul> <li><a href="/blogs/cory/select_every_n_edges" target="_blank">Select Every N Edges</a></li> <li><a href="/blogs/stevenr/symmetrical_modeling_tips_and_tricks" target="_blank">Mirror Instance / Combine Merge</a></li> <li><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=8m18s">Combine and Copy Last Pivot</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=WIeGjg5FjA4">Slide Components</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=4ZRfmDunEMg">Flatten Components</a></li> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=9m6s">Convert N-Sided Face(s) to Quad (NEW)</a></strong></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=vnb85DiDE0Y">Extrude and&nbsp;Preserve&nbsp;UVs</a></li> <li><strong><a target="_blank" href="https://www.youtube.com/watch?v=iJ0RdPiaGhY&amp;feature=youtu.be">Slide Edge Loop and Preserve UVs (NEW)</a></strong></li> <li><a target="_blank" href="/blogs/cory/normal_checker">Normal Checker</a></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=2m17s">Delete/Collapse Edge Loop/Ring Tools</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=Pi2QNFdVrdg">Draw Split / Draw Reduce</a></li> </ul> <p><strong><span style="font-size: large;">UV Editing</span></strong></p> <ul> <li><a target="_blank" href="https://www.youtube.com/watch?v=PTRBWO1F2g8">UV Editor: Image Dimming / Wireframe Color</a></li> <li><strong><a target="_blank" href="https://youtu.be/14WIlxjhWAI?t=25m30s">UV Editor: Checker Pattern Size (NEW)</a></strong></li> <li><a href="https://www.youtube.com/watch?v=UyhwoZTrB_s">Auto&nbsp;Unwrap UVs - Intro</a></li> <li><a target="_blank" href="https://youtu.be/1ZJx3xr0xOM?t=3m49s">Auto Unwrap UVs - Unfold 3D</a></li> <li><strong><a target="_blank" href="https://youtu.be/14WIlxjhWAI?t=23m7s">Auto Unwrap UVs - Pipe Unfold (NEW)</a></strong></li> <li><a target="_blank" href="https://youtu.be/VAcZHLC5ggQ">Auto Map Multiple Meshes</a></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=6m50s">Nudge UVs</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=z-InxmFnPYQ">Align UV Shells</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=UV4_7JfdfSY">Clamp UVs</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=1w1LFMcdt_M">Flip / Rotate UVs</a></li> </ul> <p><strong><span style="font-size: large;">Rigging</span></strong></p> <ul> <li><a target="_blank" href="https://www.youtube.com/watch?v=egoYATyNAaA">Pose BlendShape Editor</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=F5oPTUHN-5U">Make Joints Dynamic</a></li> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=10m37s">Performance Utilities (NEW)</a></strong></li> </ul> <p><strong><span style="font-size: large;">Animation</span></strong></p> <ul> <li><a target="_blank" href="https://www.youtube.com/watch?v=eYbtwEDZyXM">Mirror Animation</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=0z-bnOyOO2A">Reverse Animation</a></li> <li><a target="_blank" href="https://www.youtube.com/watch?v=YFf0DUmF8N0">Time Warp Animation</a></li> </ul> <p><strong><span style="font-size: large;">FX</span></strong></p> <ul> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=11m21s">Bifrost Memory Usage / Batch Sim (NEW)</a></strong></li> </ul> <p><strong><span style="font-size: large;">Rendering</span></strong></p> <ul> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=12m6s">Assign New Material for Each Selected (NEW)</a></strong></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=8m54s">Add Transparency Attribute</a></li> <li><a target="_blank" href="https://youtu.be/NaPmY4AkTkA?t=10m8s">Search Project for Missing Textures</a></li> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=12m53s">Turtle: Render Image Sequence (NEW)</a></strong></li> <li><a href="/blogs/cory/fur_blender" target="_blank">Fur Blender</a></li> </ul> <p><strong><span style="font-size: large;">Help</span></strong></p> <ul> <li><strong><a target="_blank" href="https://youtu.be/iJ0RdPiaGhY?t=13m43s">Go To BonusTools Install Location (NEW)</a></strong></li> <li><a target="_blank" href="https://youtu.be/5n3l5H6vVuI?t=14m20s">Refresh BonusTools Menu</a></li> </ul> <p>&nbsp;</p> <p><strong><strong>BonusTools 2016 Review -&gt; <a target="_blank" href="/blogs/stevenr/are-you-ready-for-some-bonustools">BonusTools 2016</a></strong></strong></p> <p><strong>BonusTools 2015 Review -&gt; <a target="_blank" href="https://www.youtube.com/watch?v=NaPmY4AkTkA">BonusTools 2015</a></strong></p> <p><strong></strong><strong>BonusTools 2014 Review -&gt; <a target="_blank" href="https://www.youtube.com/watch?v=5n3l5H6vVuI">BonusTools 2014</a></strong></p> <hr /> <p></p> <p style="text-align: center;"><strong>Maya 2014 3dsImport plugins</strong></p> <p style="text-align: left;">The 3dsImport plugin is included in the 2016 installation.&nbsp; However it was inadvertantly left out of the 2014 installation.&nbsp; You can get the precompiled plugins for that version here... <strong></strong></p> <p style="text-align: center;"><a href="/userdata/blogs/stevenr/Downloads/3dsImport-bundle.zip">Mac - 3dsImport plugin (2014)</a></p> <p style="text-align: center;"><a href="/userdata/blogs/stevenr/Downloads/3dsImport.zip">Window - 3dsImport plugin (2014)</a></p> <hr /> <p style="text-align: center;"><strong>Legacy BonusTools Installers<br /></strong></p> <p>BonusTools installers for older versions of Maya (pre-2014) can still be found on the Area -&gt; <a target="_blank" href="/downloads/index/plugins/8/views/">Legacy Maya BonusTools Installers</a>.&nbsp; Keep in mind that older versions will not contain all of the tools that were added in later releases.</p> <hr /> <p><strong><span style="font-size: large;"><br /></span></strong></p>Tue, 26 Jan 2016 22:08:17 UTChttp://area.autodesk.com/blogs/stevenr/bonustoolsMAXScript - proof of concept for setting colours based on a animated bitmapMaxStation<p>One of my colleagues, Florian, pointed out a forum post: <a href="http://forums.autodesk.com/t5/shading-lighting-and-rendering/how-get-omni-light-s-color-by-a-mapping/m-p/5983396#M24793">how get omni light's colour by a mapping</a>&nbsp;which sounded like it would be easy to do in MAXScript!</p> <p>The basic approach would be to read pixel values and apply them to the objects colour. For this quick test I'm using the diffuse colour so you can see the result in the viewport. To change the omni's light colour you'd animate .rgb instead of .Diffuse.</p> <p><span style="line-height: 1.5em;">For input it uses a sequence of images (if you have a movie file you can convert it to single images and scale it down with a tool like </span><a href="https://www.ffmpeg.org/" style="line-height: 1.5em;">ffmpeg</a><span style="line-height: 1.5em;">&nbsp;-i input.mov -vf &nbsp;scale 20:20 output-%d.bmp). As it's proof of concept ther eis no UI, you set all the parameter at the top of the MAXScript.</span></p> <p><span style="line-height: 1.5em;"><br /></span></p> <p><span style="line-height: 1.5em;">To make it easier to address the diffuse colours of the objects create a two dimensional array with the materials:</span></p> <p>pixels=#()<br />for i = 1 to xnum do<br /> (</p> <p>&nbsp; &nbsp; tp=#()<br />&nbsp; &nbsp; for j = 1 to ynum do<br />&nbsp; &nbsp; (<br />&nbsp; &nbsp; &nbsp; &nbsp; t=box pos:[i,j,0] length:0.9 width:0.9 height:0.1<br />&nbsp; &nbsp; &nbsp; &nbsp; m=StandardMaterial()<br />&nbsp; &nbsp; &nbsp; &nbsp; t.material=m<br />&nbsp; &nbsp; &nbsp; &nbsp; append tp m<br />&nbsp; &nbsp; )<br />&nbsp; &nbsp; append pixels tp<br /> )</p> <div></div> <p><span style="line-height: 1.5em;">That way we'll be able to address each pixel using pixels[x][y].</span></p> <p><span style="line-height: 1.5em;">To make 3ds Max record the animation we run the loops that go over the images and the pixels in the image inside a "<span class="code">with animate on</span>" context.</span></p> <p><span style="line-height: 1.5em;">Inside those loops we get the colour of a given pixel with "</span><span class="code">t=getPixels bm [i2,j2] 1</span>" (where bm is the bitmap and i2 and j23 are the coordinates in the bitmap) and change the colour of the object by change the materials diffuse colour with "<span class="code">pixels[i+1][j+1].Diffuse=t[1]</span>" (where i and j are the pointers to the materials and t[1] is the colour we just read from the bitmap).</p> <p><span style="line-height: 1.5em;"><br /></span></p> <p>Download the MAXScript file: <a href="/userdata/blogs/maxstation/nicolas/bitmap_to_objects.zip">bitmap_to_objects.zip</a>&nbsp;<span style="line-height: 1.5em;">and a couple of sample images:&nbsp;<a href="/userdata/blogs/maxstation/nicolas/sample__images.zip">sample__images.zip</a></span><span style="line-height: 1.5em;">.</span></p>Thu, 21 Jan 2016 12:55:46 UTChttp://area.autodesk.com/blogs/maxstation/n306-maxscript---proof-of-concept-for-setting-colours-based-on-a-animated-bitmapFormula 1 - TV GloboRodrigo Assaf<p>I am glad to interview a great team from TV Globo in Rio de Janeiro, Brazil. They have achieved an awesome opening for Formula 1 using 3DS Max and Maya 2016. I invite you all to watch their other works following some links I have added during the Interview. Hope you like it! ;-)<br />&nbsp;</p> <p><iframe src="https://player.vimeo.com/video/145922974" width="500" height="281" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe></p> <h3><br />1.&nbsp;How many days and people did work on this project? Tell us something about the animation and inspirations.</h3> <p>We usually have more time to this kind of project. But this time, we had many other projects going on at the same time. So it&acute;s not even easy to tell you how many days we had to do it. But It was probably around 2 months of production. 3 weeks with almost everybody working only on this project.</p> <p>We spent a lot of time on Layout and animation. This was the first time we showed the sponsors this way and the challenge was to combine the story of a pilot, from his firsts steps till the F1, with 6 sponsors advertisements.</p> <p>The &ldquo;rolim&atilde;&rdquo; (a little car made of wood and metal wheels) is very popular here in Brazil and it was our first inspiration to do &nbsp;the script.</p> <p></p> <h3>2.&nbsp;What were the most challenging tasks?&nbsp;<span style="line-height: 1.5em;">Could you describe your workflow?</span></h3> <p><span style="line-height: 1.5em;">We had to use 3Ds Max and Maya, for many reasons. And we were concerned about the way both softwares would exchange files with each other. But it worked just fine with obj, .fbx and alembic caches. &nbsp;We also had to use marvelous designer for the cloths. We had a scene with 8 kids running in high speed. We calculated one cache for each kid. It worked fine.</span></p> <p><span style="line-height: 1.5em;">Layout and animation were made with Max 2016. Most of the models, including characters, were made with Maya or Zbrush. Most of the render was made on 3DS Max with Vray, except the last 2 scenes, with the pilot taking the F1 helmet. This sequence was animated on 3DS Max and rendered with Maya.</span></p> <p></p> <h3>3.&nbsp;Any tips for creating racing animation?</h3> <p><span style="line-height: 1.5em;">Oh, yes&hellip; as we&acute;ve being doing the F1 clip for the GP Brasil since 2004, we already now some tips. First of all, forget about putting a car on a path. If you want to do it, at least give yourself an extra control, a dummy, a point or anything, to let you have more possibilities to correct your trajectory. The pivot of your control should be in between the back wheels, and on the floor. This is the basic, of course. But the &ldquo;rolim&atilde;&rdquo; cars don&acute;t have much more than this on it&acute;s rig system.</span></p> <p>Here we have some other F1 Clips we did:</p> <ul> <li><a href="https://vimeo.com/groups/virtual/videos/111435027" target="_blank" style="line-height: 1.5em;">https://vimeo.com/groups/virtual/videos/111435027</a></li> <li><a href="https://vimeo.com/80511715" target="_blank" style="line-height: 1.5em;">https://vimeo.com/80511715</a><span style="line-height: 1.5em;"> &nbsp;making of: </span><a href="https://vimeo.com/80934462" target="_blank" style="line-height: 1.5em;">https://vimeo.com/80934462</a></li> <li><a href="https://vimeo.com/54299513" target="_blank" style="line-height: 1.5em;">https://vimeo.com/54299513</a></li> <li><a href="https://vimeo.com/32788230" target="_blank" style="line-height: 1.5em;">https://vimeo.com/32788230</a></li> <li><a href="https://www.youtube.com/watch?v=OlCmVwwMuyY" target="_blank" style="line-height: 1.5em;">https://www.youtube.com/watch?v=OlCmVwwMuyY</a></li> <li><a href="https://www.youtube.com/watch?v=d_vi0pdeUzM" target="_blank" style="line-height: 1.5em;"><span style="line-height: 1.5em;">https://www.youtube.com/watch?v=d_vi0pdeUzM</span></a></li> </ul> <p></p> <h3>4.&nbsp;Credits</h3> <p><br /><span style="line-height: 1.5em;">CG Coordination &ndash; Mauricio Bastos<br /></span><span style="line-height: 1.5em;">Direction, Cam. Layout &ndash; Marcio Bukowski<br /></span><span style="line-height: 1.5em;">Modelling, textures &ndash; Jack Malone, Renan Oliveira, Bernardo Miranda<br /></span><span style="line-height: 1.5em;">Rig , Matheus Maciel , Guilherme Ladeira&nbsp;<br /></span><span style="line-height: 1.5em;">Animation &ndash; Marcio Bukowski , Emerson Manfrin<br /></span><span style="line-height: 1.5em;">Shading, compositing &ndash; Marcelo Menezes, Diogo Dubiella<br /></span><span style="line-height: 1.5em;">Storyboard &ndash; Ricardo Rocha<br /></span><span style="line-height: 1.5em;">Sound design &ndash; Leonardo Matsumoto<br /></span><span style="line-height: 1.5em;">Cloth Simulation - Emerson Manfrin<br /></span><span style="line-height: 1.5em;">Concept - Rodolfo Perisse.</span></p>Mon, 18 Jan 2016 17:12:05 UTChttp://area.autodesk.com/blogs/rodrigo/formula1tvgloboThe MCG Network Deployment Guidemcgblog<p><span style="line-height: 1.5em;">If you&rsquo;re looking to render your MCG creations on a networked instance of 3dsMax, or if you&rsquo;re a technical director looking to deploy your procedural MCG tools to a set of artists in your studio, or if you&rsquo;re like me and you&rsquo;ve accumulated a few hundred MCG tools and compounds and are looking to organize your &ldquo;working set&rdquo; of tools on a machine, you&rsquo;ve come to the right place.</span></p> <p><span style="line-height: 1.5em;">In this tutorial, we&rsquo;ll be looking at how to deploy your MCG tools and compounds so they can be accessed and evaluated by multiple machines running 3dsMax. Specifically, we&rsquo;ll be covering three ways to achieving this deployment:</span></p> <ol> <li><span style="line-height: 1.5em;">Network file path deployment</span></li> <li><span style="line-height: 1.5em;">Source control system deployment (Git, Perforce, etc)</span></li> <li><span style="line-height: 1.5em;">What I do</span></li> </ol> <h3>1. Network File Path Deployment</h3> <p>The first alternative we&rsquo;ll be describing is the network file path approach. Here, we&rsquo;ll be hosting our MCG files in the following network location: \\\\MY-SERVER\\mcg-deployment\\ and we&rsquo;ll be reading them in an instance of 3dsMax running on the machine \\\\MY-RENDERER.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_mcg_network_deployment_guide/network_ini_file.png" width="2064" height="1413" /></p> <p></p> <p>1. Start by creating a &ldquo;Tools&rdquo; and a &ldquo;Compounds&rdquo; directory on the deployment machine. The shared network location should have the following structure</p> <p style="padding-left: 30px;">\\\\MY-SERVER\\<br /><span style="line-height: 1.5em;">&nbsp; &nbsp; mcg-deployment\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Tools\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Compounds\\</span></p> <p><strong>(!) Important:</strong> When you share this folder, make sure you give read permissions to the accounts and machines which will be accessing this network location.</p> <p>2. Copy the .maxtool files you want to deploy into the folder \\\\MY-SERVER\\mcg-deployment\\Tools\\. You can organize your .maxtool files into subfolders under this directory.</p> <p><span style="line-height: 1.5em;">3. Copy the .maxcompound files you want to deploy into the folder \\\\MY-SERVER\\mcg-deployment\\Compounds\\. You can organize these .maxcompound files into subfolders under this directory.&nbsp;</span></p> <p><span style="line-height: 1.5em;">4. To know which .maxcompound files to copy for a given .maxtool, create an MCG package of the .maxtool file you want to deploy using "File &gt; Package Max Creation Graph" in the Max Creation Graph Editor. Temporarily install this .mcg package on your local machine by selecting "Scripting &gt; Install Max Creation Graph (.mcg) Package".&nbsp;</span></p> <p><span style="line-height: 1.5em;">Once the MCG package is installed, go to your local machine&rsquo;s MCG installation directory: C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools\\Downloads. In this directory, if we had installed the package my_geo.mcg, we would observe the following file structure:</span></p> <p style="padding-left: 30px;">C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools\\Downloads\\<br /><span style="line-height: 1.5em;">&nbsp; &nbsp;my_geo.maxtool<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; my_geo.ms<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; my_geo.txt<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; my_geo\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Compounds\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *.maxcompound</span></p> <p>Cut the file my_geo.maxtool, and paste it in the deployment machine&rsquo;s Tools directory: \\\\MY-SERVER\\mcg-deployment\\Tools\\my_geo\\. The structure of the deployment machine&rsquo;s shared folder should now look like this:</p> <p style="padding-left: 30px;">\\\\MY-SERVER\\<br /><span style="line-height: 1.5em;">&nbsp; &nbsp; mcg-deployment\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Tools\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>my_geo\\</strong><br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>my_geo.maxtool</strong><br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Compounds\\</span></p> <p>Likewise, cut all the .maxcompound files nested under your local machine&rsquo;s directory: C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools\\Downloads\\my_geo\\Compounds\\*.maxcompound and paste them in the deployment machine&rsquo;s directory: \\\\MY-SERVER\\mcg-deployment\\Compounds\\my_geo\\. The structure of the deployment machine&rsquo;s shared folder should now look like this:</p> <p style="padding-left: 30px;">\\\\MY-SERVER\\<br /><span style="line-height: 1.5em;">&nbsp; &nbsp; mcg-deployment\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Tools\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>my_geo\\</strong><br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>my_geo.maxtool</strong><br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; Compounds\\<br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>my_geo\\</strong><br /></span><span style="line-height: 1.5em;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <strong>*.maxcompound</strong></span></p> <p>To remove your temporary MCG package installation on your local machine, simply delete the files and folders in C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools\\Downloads whose names match the tool you installed. In our example, we would make sure to delete the files my_geo.maxtool, my_geo.ms, my_geo.txt and the my_geo\\ folder.</p> <p><span style="line-height: 1.5em;">5. Next, access the \\\\MY-RENDERER machine, and open the file C:\\Users\\&lt;username&gt;\\AppData\\Local\\Autodesk\\3dsMax\\2016\\2016 - 64bit\\ENU\\<strong>3dsmax.ini</strong> in any text editor.</span></p> <p><span style="line-height: 1.5em;">We&rsquo;ll be using this .ini file to make sure the instance of 3dsMax running on \\\\MY-RENDERER will be able to fetch the .maxcompound and .maxtool files hosted on \\\\MY-SERVER. To do this, add the following lines at the bottom of the .ini file, then save your changes.</span></p> <p style="padding-left: 30px;"><span style="line-height: 1.5em;">[MCG Compound Directories]<br /></span><span style="line-height: 1.5em;">path1=\\\\MY-SERVER\\mcg-deployment\\Compounds<br /></span><span style="line-height: 1.5em;">[MCG Tools Directories]<br /></span><span style="line-height: 1.5em;">path1=\\\\MY-SERVER\\mcg-deployment\\Tools</span></p> <p><span style="line-height: 1.5em;">You can also specify the paths using IP addresses instead of hostnames. In this case, if \\\\MY-SERVER had the IP address 5.5.5.5, you could specify your paths in the following way:</span></p> <p style="padding-left: 30px;"><span style="line-height: 1.5em;">[MCG Compound Directories]<br /></span><span style="line-height: 1.5em;">path1=\\\\5.5.5.5\\mcg-deployment\\Compounds<br /></span><span style="line-height: 1.5em;">[MCG Tools Directories]<br /></span><span style="line-height: 1.5em;">path1=\\\\5.5.5.5\\mcg-deployment\\Tools</span></p> <p><span style="line-height: 1.5em;">You can specify more than one path in the [MCG Compounds Directories] and [MCG Tools Directories]. The only requirement is to ensure that the path keys be unique within each category, i.e. core, anim, experimental. For example, the paths below illustrate a hypothetical animation deployment:</span></p> <p style="padding-left: 30px;"><span style="line-height: 1.5em;">[MCG Compound Directories]<br /></span><span style="line-height: 1.5em;">core=\\\\DEV-HOST\\mcg-workspace\\Compounds\\core<br /></span><span style="line-height: 1.5em;">anim=\\\\DEV-HOST\\mcg-workspace\\Compounds\\animation<br /></span><span style="line-height: 1.5em;">experimental=\\\\RD-HOST\\experiments\\<br /></span><span style="line-height: 1.5em;">[MCG Tools Directories]<br /></span><span style="line-height: 1.5em;">anim=\\\\DEV-HOST\\mcg-workspace\\Tools\\anim<br /></span><span style="line-height: 1.5em;">experimental=\\\\RD-HOST\\experiments\\</span></p> <p>Note that you don&rsquo;t need the same number of entries across the two categories. In fact, based on your personal preference, you can have the same folder contain both .maxcompound and .maxtool file types. As we describe below, the .maxcompound files encountered in these paths will be loaded first, followed by the .maxtool files.</p> <p>6. Now that the .ini file is configured, the next time you start 3dsMax on \\\\MY-RENDERER, 3dsMax will load and evaluate the .maxcompound files in the following locations:</p> <ol> <li><span style="line-height: 1.5em;">The local 3dsMax installation directory on \\\\MY-RENDERER.<br /></span><span style="line-height: 1.5em;">C:\\Program Files\\Autodesk\\3ds Max 2016\\MaxCreationGraph\\Compounds<br /><br /></span></li> <li><span style="line-height: 1.5em;">The local user directory on \\\\MY-RENDERER.<br />C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Compounds<br /><br /></span></li> <li><span style="line-height: 1.5em;">&nbsp;</span>The paths listed under [MCG Compound Directories] in the \\\\MY-RENDERER&rsquo;s .ini file.<br />&nbsp;\\\\MY-SERVER\\mcg-deployment\\Compounds</li> </ol> <p><span style="line-height: 1.5em;">Keep in mind that any duplicate compounds encountered in this process will not be re-evaluated. You can also trigger this process manually by selecting "Operators &gt; Reload Operators" from the Max Creation Graph Editor window.</span></p> <p><span style="line-height: 1.5em;">7. Once all the compounds are loaded, 3dsMax will perform another pass to load and evaluate all the .maxtool files, based on their appearance in the following locations:</span></p> <ol> <li>The local 3dsMax installation directory on \\\\MY-RENDERER<br />C:\\Program Files\\Autodesk\\3ds Max 2016\\MaxCreationGraph\\Tools<br /><br /></li> <li>&nbsp;The local user directory on \\\\MY-RENDERER<br />&nbsp;C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools<br /><br /></li> <li>&nbsp;The paths listed under [MCG Tools Directories] in the \\\\MY-RENDERER&rsquo;s .ini file.<br />&nbsp;\\\\MY-SERVER\\mcg-deployment\\Tools</li> </ol> <p><span style="line-height: 1.5em;">Note that the number of .maxtool and .maxcompound files loaded and evaluated by 3dsMax when the application boots up will impact your startup time, so you might consider implementing separate tools in your favorite scripting language to selectively manage your tool deployment, and to configure the .ini files to your liking.</span></p> <h3>2. Source Control System Deployment</h3> <p>As another deployment alternative, consider using a version control system like Git or Perforce to synchronize your working tools and their compounds onto different machines. Explaining the detailed use of any given source control system is outside the scope of this tutorial, however the basic approach is to treat your MCG tools and compounds as a regular codebase.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_mcg_network_deployment_guide/source_control.png" width="1809" height="791" /></p> <p>Using this scheme, when you need to deploy your MCG tools, it&rsquo;s a matter of ensuring your other machines are correctly synchronized with the latest version of the repository containing your .maxtool files and their dependent .maxcompound files.</p> <p><span style="line-height: 1.5em;">In fact, regardless of which deployment method you choose, I strongly recommend you manage your tools and your compounds using a version control system. The .maxtool and .maxcompound files are actually XML representations of the source graph&rsquo;s connectivity, and in the case of .maxtools, they also contain the custom UI MaxScript definitions. As such, changes made to these graphs can be easily parsed by common version control systems, and are not saved as binary files.</span></p> <h3>3. What I Do</h3> <p>Now, to give you a concrete insight into how I personally maintain my MCG tools and compounds: I use two Git repositories, one for my .maxtool files, called &ldquo;mcg-tools&rdquo; and one for all my .maxcompound files, called &ldquo;mcg-compounds&rdquo;. These repositories contain nested folders which are named and organized to my liking.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_mcg_network_deployment_guide/what_i_do.png" width="1760" height="846" /></p> <p><span style="line-height: 1.5em;">To make sure I always have access to the compounds I&rsquo;ve created so far when I boot 3dsMax, and to make sure no compounds go missing, I keep my local mcg-compounds repository inside the directory C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Compounds\\. As we described previously, this path is automatically checked when 3dsMax is opened (and when the operators are reloaded). The advantage of using this directory is that I don&rsquo;t need to change any settings in 3dsMax&rsquo;s .ini file.</span></p> <p><span style="line-height: 1.5em;">The reason why I maintain a separate mcg-tools repository is because I want to place my tools outside of Max&rsquo;s default loading paths (i.e. on my Desktop). This might seem counterintuitive, however this has the advantage of minimizing 3dsMax&rsquo;s startup time by avoiding the need to evaluate 100 different maxtools and to build 100 different plugin instances. Generally, I&rsquo;m only working on one or two .maxtool files at a time, so the overhead of manually opening and evaluating these files in the Max Creation Graph Editor is an acceptable tradeoff for me.</span></p> <p><span style="line-height: 1.5em;">When I want quick feedback about a tool, I&rsquo;ll package it as an .mcg file and I&rsquo;ll send it to one of my awesome coworkers, which they install by going to "Scripting &gt; Install Max Creation Graph (.mcg) Package". This manual MCG package distribution and installation works well if you want to share your standalone tools with a client or with one or two teammates, however it does not scale for large and iterative deployments.</span></p> <p><span style="line-height: 1.5em;">When I need to deploy my tools to a new machine, I first make sure my two master repositories are up-to-date, and I simply clone my mcg-compounds repository into the machine&rsquo;s C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Compounds\\ directory (or if it already has a version of it, I pull the latest changes). Once that&rsquo;s done, I copy the .maxtool files I want to distribute into the directory C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools.&nbsp;</span></p> <h3>Conclusion</h3> <p>To conclude, there is no clear-cut &ldquo;best&rdquo; way to deploy MCG tools and compounds; each method presented above has its tradeoffs. If anything, I hope this post has given you a deeper insight into how 3dsMax handles MCG files, and how to tailor your own MCG workflows to deploy your tools and compounds efficiently. Thanks for reading, and if you have any questions or comments, feel free to post below!</p>Fri, 15 Jan 2016 20:00:41 UTChttp://area.autodesk.com/blogs/mcgblog/the-mcg-network-deployment-guideThe easiest animation tool you&#039;ll ever try!Cory Mogk<p>We still have room for more people in the <a href="https://beta.autodesk.com/callout/?callid=%7B51340063-7485-4635-BCE6-AF45AE7CD11D%7D">Project Draco Technology Preview on Autodesk Labs</a>. Here's a look at the Draco showreel to give you some ideas of the kinds of things you can create:</p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/sIcuYRSU8A0" frameborder="0" allowfullscreen=""></iframe></p> <p>We would love to see the things you create so share things using #madewithDraco.</p> <p><span style="line-height: 1.5em;">With some of the Draco community submissions we put together a movie that mashes up Christmas and Star Wars:</span></p> <p><iframe width="560" height="315" src="https://www.youtube.com/embed/Fa1zjB9_eJk" frameborder="0" allowfullscreen=""></iframe></p> <p>And you can see lots of other creations on the <a href="http://madewithdraco.tumblr.com/">#MadeWithDraco Tumblr page</a>. Give it a try and let us know what you think! Is it the easiest animation tool ever?</p>Wed, 06 Jan 2016 13:46:26 UTChttp://area.autodesk.com/blogs/cory/the-easiest-animation-tool-you039ll-ever-tryAutodesk University 2015 - 3ds Max related videosMaxStation<p>Anf for the last post of the year, all the 3ds Max related videos I could find including download links. Happy New Year everybody!</p> <p></p> <p>3ds Max:</p> <ul> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11340" style="line-height: 1.5em;">PAUL NICHOLLS:&nbsp;</a><span style="line-height: 1.5em;"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11340">Architectural Visualization Meets Concept Design for Advanced 3ds Max and V-Ray Users</a>&nbsp;- <a href="http://adskeventsvideo.autodesk.com/download/txYjZheTqKPEoBiWi-LWJMHtNSAW_Oj-/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11340-ArchitecturalVisualizationMeetsConceptDesignforAdvanced3dsMaxandV-RayUsers-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11345" style="line-height: 1.5em;">GEORGE MAESTRI:&nbsp;</a><span style="line-height: 1.5em;"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11345">Automating the Animation Process: Creating Exploded Views for Visualization</a>&nbsp;- <a href="http://adskeventsvideo.autodesk.com/download/BvZmpkeTpDbtpa330JOsCySWVK3bWpro/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11345-AutomatingtheAnimationProcessCreatingExplodedViewsforVisualization-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av9778" style="line-height: 1.5em;">RAMY HANNA:&nbsp;</a><span style="line-height: 1.5em;"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av9778">Render Like a Photographer</a> - <a href="http://adskeventsvideo.autodesk.com/download/puNzVheTo4yt_7KJZzCkPnhYY9YX02yo/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV9778-RenderLikeaPhotographer-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11306" style="line-height: 1.5em;"><span style="line-height: 1.5em;">MARION LANDRY:&nbsp;</span><span style="line-height: 1.5em;">Learn How to Use A360 Cloud-Rendering Service in 3ds Max 2016</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/pwOGpkeTpNhlZb2pI1cWukOy13fIiEhU/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11306-LearnHowtoUseA360Cloud-RenderingServicein3dsMax2016-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av10732" style="line-height: 1.5em;">CIRO SANNINO:&nbsp;<span style="line-height: 1.5em;">Lessons from Photography to Create Compelling Architectural Visualization</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/s1OTBieTrOIRQq0GFBA8yNtaibri5asG/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV10732-LessonsfromPhotographytoCreateCompellingArchitecturalVisualization-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av9947" style="line-height: 1.5em;">PAUL NEALE:&nbsp;<span style="line-height: 1.5em;">Making Fast and Effective Animation V2: Procedural Animation Tools in 3ds Max</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/d2MTZieTp_7S__XeoRoncHz9LZ58JG3o/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV9947-MakingFastandEffectiveAnimationV2ProceduralAnimationToolsin3dsMax-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av9820" style="line-height: 1.5em;">CHRISTOPHER LYNER:&nbsp;<span style="line-height: 1.5em;">Animation Breakdown</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/A0cHY5eTrgwEJ60VzGAKd4sUGAGJuXNq/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV9820-AnimationBreakdown-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/me11862" style="line-height: 1.5em;">GUS CAPOTE:&nbsp;<span style="line-height: 1.5em;">Camera Animation, Mastering the Camera Controls</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/s0a3NieTpTvYSyxksBGewPzx0OzXf30s/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/ME11862-CameraAnimationMasteringtheCameraControls-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/me11119" style="line-height: 1.5em;">CHRISTOPHER DIGGINS:&nbsp;<span style="line-height: 1.5em;">Creating Procedural Entourage with Max Creation Graph in 3ds Max 2016</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/45cjVheTqrkKzeHtVK1b6MGhyIiUrSi2/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/ME11119-CreatingProceduralEntouragewithMaxCreationGraphin3dsMax2016-Fullvideo.mp4">Video</a></span></li> </ul> <p></p> <p>3ds Max and Maya:</p> <ul> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11979" style="line-height: 1.5em;">LUDOVICK MICHAUD:&nbsp;<span style="line-height: 1.5em;">Storytelling Through Composition: The Keys to Effective Client Communication</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/BlaTBieToWuP8dqgEhgYgSVZK0QJyzaW/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11979-StorytellingThroughCompositionTheKeystoEffectiveClientCommunication-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11980" style="line-height: 1.5em;">LUDOVICK MICHAUD:&nbsp;<span style="line-height: 1.5em;">Architectural CG Integration into Live Footage&mdash;Visualization and Massing Next Phase</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/xtaTBieTqApt3qvOHpvJxUlrT27yeRxr/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11980-ArchitecturalCGIntegrationintoLiveFootageVisualizationandMassingNextPhase-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av10200" style="line-height: 1.5em;">CHRIS MURRAY:&nbsp;<span style="line-height: 1.5em;">Creating Original HDR Imagery for Use in Image-Based Lighting</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/Y2anY5eTqzkbhaw0fA_Oi4H5Rmk4NZ7A/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV10200-CreatingOriginalHDRImageryforUseinImage-BasedLighting-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11967" style="line-height: 1.5em;">JOHN HIGGS:&nbsp;<span style="line-height: 1.5em;">Building an Island a Stone at a Time: Storytelling for an Airport Design Competition</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/hhNnVieTrgKJGl07SazEAwVrPd9pHNW-/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11967-BuildinganIslandaStoneataTimeStorytellingforanAirportDesignCompetition-Fullvideo.mp4">Video</a></span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av10255" style="line-height: 1.5em;">CHRIS MURRAY:&nbsp;<span style="line-height: 1.5em;">Demystifying Real-Time Material Workflows for Stingray and Other Game Engines</span><span style="line-height: 1.5em;">&nbsp;</span></a><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/EwNWpkeTrcHG1zhDdCeNVUe_4aiuMbu6/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV10255-DemystifyingReal-TimeMaterialWorkflowsforStingrayandOtherGameEngines-Fullvideo.mp4">Video</a></span></li> </ul> <p></p> <p><span style="line-height: 1.5em;">3ds Max and other Autodesk products:</span></p> <ul> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/vred/at10850" style="line-height: 1.5em;">FLORIAN COENEN:&nbsp;<span style="line-height: 1.5em;">Animation Workflow from 3ds Max and Maya to VRED</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/YycGNheTrKFIHP6pGKQ5IxqCtQE8ATiy/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AT10850-AnimationWorkflowfrom3dsMaxandMayatoVRED-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">VRED, 3ds Max, Maya</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/autocad/it10079" style="line-height: 1.5em;">JERRY MILANA:&nbsp;<span style="line-height: 1.5em;">Networking Autodesk Products from A to Z</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/AwdmVleTrbPmdFk-zseD_9JOugMOWEI5/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/IT10079-NetworkingAutodeskProductsfromAtoZ-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">AutoCAD, 3ds Max, Inventor</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/revit-for-architects/av13977" style="line-height: 1.5em;">SCOTT HAMILTON:&nbsp;<span style="line-height: 1.5em;">New Frontiers in Visualization</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/FhdHBieTrpXszZQl7fLs2x6mzJe8iPSD/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV13977-NewFrontiersinVisualization-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">Revit for Architects, 3ds Max</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av10263" style="line-height: 1.5em;">CHRIS MURRAY:&nbsp;<span style="line-height: 1.5em;">Up on Blocks and Under the Hood: Dissecting the New Features in 3ds Max 2016</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/lkZDFjeTpbq0o-dNi1bPa5DyW_Wo3T2u/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV10263-UponBlocksandUndertheHoodDissectingtheNewFeaturesin3dsMax2016-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, Revit for Architects</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/revit-for-architects/cs10427" style="line-height: 1.5em;">JUHEE RHO:&nbsp;<span style="line-height: 1.5em;">Virtual-Augmented Reality for Construction, Utilizing Gear VR</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/RqaTZheTqkl5kQdy0meXW28MwceGmtOS/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/CS10427-Virtual-AugmentedRealityforConstructionUtilizingGearVR-Fullvideo.mp4">Video</a></span><span style="line-height: 1.5em;">&nbsp;- Revit for Architects, 3ds Max</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/ci10276" style="line-height: 1.5em;">SETH COHEN:&nbsp;<span style="line-height: 1.5em;">Vroom Your Way to Civil Visualization</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/I5bGk5eTob52EvD6e69N2cCxg9dXSbBD/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/CI10276-VroomYourWaytoCivilVisualization-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, AutoCAD, Civil 3D</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/revit-for-architects/as10745" style="line-height: 1.5em;">MITSUO NAKATANI:&nbsp;</a><span style="line-height: 1.5em;"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/revit-for-architects/as10745">Advanced Lighting Design and Simulation for Revit</a>&nbsp;</span><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/0wdHRieTqHQI_f4ptI5kD4Z21Hx-BG0A/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AS10745-AdvancedLightingDesignandSimulationforRevit-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">Revit for Architects, 3ds Max</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/infraworks/ci10977" style="line-height: 1.5em;">DAVID LAWRENCE:&nbsp;<span style="line-height: 1.5em;">Make It a Round Trip: Leave One-Way Workflows Behind with InfraWorks 360 and AutoCAD Civil 3D</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/l2MjFieTqunHCQEHCuYG2-VkQUp_PDuh/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/CI10977-MakeItaRoundTripLeaveOne-WayWorkflowsBehindwithInfraWorks360andAutoCADCivil3D-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">InfraWorks, 3ds Max</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11903" style="line-height: 1.5em;">JOSE MANUEL ELIZARDO:&nbsp;<span style="line-height: 1.5em;">Easy-to-Use Techniques for Bringing Your Design Content to the Next Level with 3ds Max</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/QyNnVieTqqiohIDRFJUATIKKZgLBgYGN/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11903-Easy-to-UseTechniquesforBringingYourDesignContenttotheNextLevelwith3dsMax-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, Inventor</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av11500" style="line-height: 1.5em;">MARK KAUFFMAN:&nbsp;<span style="line-height: 1.5em;">Effective Coordinate Space Transformation Workflows</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/5jZTBieTp2CdCC0hfA0qkTq7euLdc1r2/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV11500-EffectiveCoordinateSpaceTransformationWorkflows-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, AutoCAD, Civil 3D</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/infraworks/anz15-bu04" style="line-height: 1.5em;">SAMUEL MACALISTER:&nbsp;<span style="line-height: 1.5em;">InfraWorks 360 for Architects</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/dsajlzdzqiluI_SnbP2s-9hOhS1WcoxP/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/ANZ15-BU04-InfraWorks360forArchitects-InfraWorks360-SamuelMacalister.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">InfraWorks, 3ds Max</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av12157" style="line-height: 1.5em;">GONZALO NAVARRO:&nbsp;<span style="line-height: 1.5em;">Case Study&mdash;Waldorf Astoria: A Film Production in Less than 30 Days</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/w5MGw5eTrhkFTTB92xOI35nSij04VIab/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV12157-CaseStudyWaldorfAstoriaAFilmProductioninLessthan30Days-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, AutoCAD</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av9938" style="line-height: 1.5em;">SAMUEL MACALISTER:&nbsp;<span style="line-height: 1.5em;">Construction Animations</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/xqZ2pkeTouDYs-u6xxaol5WWxmQfVj6w/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV9938-ConstructionAnimations-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, Navisworks, Revit for Construction</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/infraworks/ci11523" style="line-height: 1.5em;">MARK KAUFFMAN:&nbsp;<span style="line-height: 1.5em;">Creating 3D Model Assets for InfraWorks</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/8xZzFieTqT-OVZ20O4LOI3aYabts44Uo/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/CI11523-Creating3DModelAssetsforInfraWorks-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">InfraWorks, 3ds Max</span></li> <li><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max/av10216" style="line-height: 1.5em;">GASPARD GIROUD:&nbsp;<span style="line-height: 1.5em;">Aerial Cinematography and CGI for Architecture, Advertising, and Film</span></a><span style="line-height: 1.5em;">&nbsp;</span><span style="line-height: 1.5em;">- <a href="http://adskeventsvideo.autodesk.com/download/5leTdheTr2tSzJScSzKEVy30KJ6idCEu/DOcJ-FxaFrRg4gtDEwOjE2ZDowODE74J/AV10216-AerialCinematographyandCGIforArchitectureAdvertisingandFilm-Fullvideo.mp4">Video</a> -&nbsp;</span><span style="line-height: 1.5em;">3ds Max, AutoCAD Architecture</span></li> </ul>Thu, 31 Dec 2015 12:42:51 UTChttp://area.autodesk.com/blogs/maxstation/n305-autodesk-university-2015---3ds-max-related-videosMaya Monday - two sided shader - MILA materialdobert<p><iframe width="560" height="315" src="https://www.youtube.com/embed/gNUeRMDpyro" frameborder="0" allowfullscreen=""></iframe></p>Wed, 23 Dec 2015 01:02:15 UTChttp://area.autodesk.com/blogs/daryl/maya-monday----two-sided-shader---mila-materialThe Array Looping Cook Bookmcgblog<p>If you&rsquo;re coming from a scripting or a programming background, you may have spent some time in the MCG operator list searching for the &ldquo;for loop&rdquo;. While there is no specific operator called &ldquo;for loop&rdquo; in MCG by default, there is a wide variety of operators which behave like specialized versions of the for loop. In this post, we&rsquo;ll be taking a tour of those operators, and we&rsquo;ll be looking at common patterns you can apply to create and iterate on arrays.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/01.png" width="2358" height="852" /></p> <p>In the screenshots below, the ParseIntArray, PrintWithLabel, PrintArrayWithLabel, ArrayOfPseudoRandomFloats, and PartialSum compounds were created during the development of this tutorial, so you won&rsquo;t find them in your MCG operator list by default. To obtain these compounds, install the MCGArrayTests.mcg tool at the bottom of this post.</p> <p><strong>Note: </strong><em>The MaxScript code in the looping examples below only illustrates the behavior of the operators, and is not a direct translation of the implementation of those MCG operators. In fact, MCG graphs compile down to .NET bytecode, which in most cases runs faster than MaxScript.</em></p> <p><strong><br /></strong></p> <p><strong>Count</strong></p> <p>Let&rsquo;s start with the simplest one of them all: Count. The Count operator returns the number of items in the array.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/02-count.png" width="1508" height="415" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Count</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(1, 6, 12, 33, 54)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A.count <span style="color: #00cc99;">-- =&gt; 5</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong style="line-height: 1.5em;"><br /></strong></p> <p><strong style="line-height: 1.5em;">ArrayOf</strong></p> <p>The ArrayOf operator creates an array of size &ldquo;n&rdquo; which contains repeated copies of the supplied value. In the example below, we&rsquo;re using the ArrayOf operator to create an array containing five copies of the vector [0,0,1].</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/03-ArrayOf.png" width="1508" height="530" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- ArrayOf</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function ArrayOf x n = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i = 0 to (n-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result x</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">ArrayOf [0,0,1] 5 <span style="color: #00cc99;">-- =&gt; #([0,0,1], [0,0,1], [0,0,1], [0,0,1], [0,0,1])</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong style="line-height: 1.5em;"><br /></strong></p> <p><strong style="line-height: 1.5em;">ArrayOfFunction - Creating an Array of Random Values</strong></p> <p>If you want to generate an array of random values, use the graph construction below, which makes use of the ArrayOfFunction operator. This operator creates an array by repeating the given function &ldquo;n&rdquo; times. The &ldquo;Bind&rdquo; operator in this graph forces the PseudoRandomFloat operator to use the same random number generator, instead of recreating a new generator on every loop. We explain the &ldquo;Bind&rdquo; operator in more detail in <a href="https://area.autodesk.com/blogs/mcgblog/the-low-poly-modifier---part-2" target="_blank">The Low Poly Modifier - Part 2</a>.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/04-ArrayOfFunction.png" width="1779" height="592" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- ArrayOfFunction</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function ArrayOfFunction f n = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i = 0 to (n-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;tmp = f()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Set the random seed value and create a function which generates a new random </span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- value on every call.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">seed 1234.0</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myRandomFunction = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return random 0.0 1.0 <span style="color: #00cc99;">-- A random floating point number between 0.0 and 1.0</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">ArrayOfFunction (myRandomFunction) 5 <span style="color: #00cc99;">-- =&gt; #(0.177433, 0.954723, 0.396885, 0.398289, 0.242126)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><span style="line-height: 1.5em;">We condensed this construction into the ArrayOfPseudoRandomFloats compound, which you can use in your own graphs by installing the MCGArrayTests.mcg file linked at the end of this post.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/05-ArrayOfPseudoRandomFloats.png" width="1631" height="344" /></p> <p><strong><br /></strong></p> <p><strong>Unit, Array2, Array3, Array4, and Concatenate</strong></p> <p>To create an array containing a set of hard-coded values (without the ParseIntArray compound we&rsquo;ve been using so far), you can use Unit, Array2, Array3, and Array4. Use the Concatenate operator on two arrays to join them into a single array.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/06-Unit-concatenate.png" width="1512" height="718" /></p> <p><strong><br /></strong></p> <p><strong>Range</strong></p> <p>Given a number &ldquo;n&rdquo;, the Range operator will produce an array of integers between 0 and (n-1). In many cases, the Range operator can act as a starting point in your graph to guide the overall behavior of your tool such as the number of iterations, the number of objects to scatter, etc. <a href="https://area.autodesk.com/blogs/mcgblog/the-function-connector-part-2---building-mcg-functions" target="_blank">For example, we used the Range operator to drive the number of stairs in our Staircase building tool</a>.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/07-Range.png" width="1274" height="365" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Range</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Range n = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i = 0 to (n-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result i</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;) </span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Range 5 <span style="color: #00cc99;">-- =&gt; #(0, 1, 2, 3, 4)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">RangeInclusiveFloat / RangeExclusiveFloat</span></strong></p> <p>Similar to the Range operator, the RangeInclusiveFloat and RangeExclusiveFloat operators produce an array of &ldquo;n&rdquo; decimal values between 0.0 and 1.0. The &ldquo;Inclusive&rdquo; and &ldquo;Exclusive&rdquo; terms determine whether or not the value of 1.0 is included in the computed range of values.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/08-RangeInclusiveExclusive.png" width="1439" height="644" /></p> <p>When you connect them to a Map, these operators can be used to generate an array of proportional samples. For example, in the graph below, we&rsquo;re using the RangeExclusiveFloat operator to sample four equidistant angles around a circle. Note that in MCG, trigonometric operators such as Sin and Cos require angular values in radians. In the graph below, we&rsquo;ve chosen to convert these values into degrees to increase the readability of the resulting array.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/09-AngleSample.png" width="1776" height="610" /></p> <p><span style="color: #00cc99; font-family: Consolas; font-size: 12px; line-height: 1.5em;">-- RangeInclusiveFloat</span></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function RangeInclusiveFloat n = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;step = 1.0 / (n-1)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i = 0 to (n-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result (i*step)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- RangeExclusiveFloat</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function RangeExclusiveFloat n = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;step = 1.0 / (n)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i = 0 to (n-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result (i*step)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">RangeInclusiveFloat 5 <span style="color: #00cc99;">-- =&gt; #(0, 0.25, 0.5, 0.75, 1)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">RangeExclusiveFloat 5 <span style="color: #00cc99;">-- =&gt; #(0, 0.2, 0.4, 0.6, 0.8)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">Map</span></strong></p> <p>Map is one of the most fundamental operators in MCG. <a href="https://area.autodesk.com/blogs/mcgblog/the-function-connector-part-1--reading-mcg-functions" target="_blank">We covered it in our very first blog post to explain the function connector</a>. The Map operator closely resembles the &ldquo;for each&rdquo; construct common to other programming languages. It iterates over all the items in an array, and it returns a new array of transformed values based on the function you provide.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/10-Map.png" width="1504" height="582" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Map</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Map xs fxn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for item in xs do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;tmp = fxn item</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of integers.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(0, 1, 2, 3, 4)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function to apply on each iteration</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunc x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return x + x</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Map A myFunc <span style="color: #00cc99;">-- =&gt; #(0, 2, 4, 6, 8)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">Indices</span></strong></p> <p>The Indices operator creates an array containing all the valid indices of a given array. In contrast to MaxScript, array indexing in MCG is 0-based instead of 1-based. This means that the first item in an MCG array is indexed at 0 instead of at 1.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/11-Indices.png" width="1722" height="355" /></p> <p>Note that we can achieve the same result as the graph above by connecting a Count operator to a Range operator.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/12-RangeCount.png" width="1808" height="351" /></p> <p><span style="color: #00cc99; font-family: Consolas; font-size: 12px; line-height: 1.5em;">-- Indices</span></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Indices A = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i=0 to (A.count-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result i</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of 8 values</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(5, 2, 6, 20, 4, 9, 16, 100)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Indices A <span style="color: #00cc99;">-- =&gt; #(0, 1, 2, 3, 4, 5, 6, 7)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">Filter</span></strong></p> <p>The Filter operator iterates over an array, and only keeps the items which fulfill the given condition function. For example, you can use the Filter operator to remove values below a certain threshold, or to keep a set of faces whose normals point up in +Z.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/13-Filter.png" width="1791" height="763" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Filter</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- An underscore is added to "_Filter" because "filter" is a keyword in MaxScript.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function _Filter A fxn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for item in A do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;cond = fxn item</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;if cond == true then </span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;&nbsp;append result item</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of values.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare a filtering function which returns true if the input is even.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function filterFn x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return mod x 2 == 0</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">_Filter A filterFn <span style="color: #00cc99;">-- =&gt; #(0, 2, 4, 6, 8)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">At</span></strong></p> <p>The At operator returns the value at the specified index in the array. It behaves in the same way as the subscript operator &ldquo;[ ]&rdquo; in myArray[i]. Recall that array indexing in MCG is 0-based while in MaxScript, it is 1-based.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/14-At.png" width="1561" height="422" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- At</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- An underscore is added to "_At" because "at" is a keyword in MaxScript.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function _At A index = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- (!) MaxScript array indexing is 1-based so we&rsquo;ll be adding 1 to the given index.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = A[index+1] </span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of values, and the index of the value we want to retrieve.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(5, 2, 6, 20, 117, 9, 16, 100)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">index = 4 <span style="color: #00cc99;">-- 0-based index in A</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">_At A index <span style="color: #00cc99;">-- =&gt; 117</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">Combine</span></strong></p> <p>The Combine operator acts like the Map operator, but requires two arrays instead of one. Each pair of items between these arrays is applied to the given function to produce a new array of values.&nbsp;</p> <p><span style="line-height: 1.5em;">Keep in mind that the function you define for the Combine operator must expose two arguments (i.e. two unconnected connectors). Furthermore, the order of these arguments must match the order in which the arrays are connected into the Combine node. Specifically, the type of the first array &ldquo;xs&rdquo; must match the type of the first argument in the function. In the same way, the type of the second array &ldquo;ys&rdquo; must match the type of the second argument in the function.</span></p> <p><span style="line-height: 1.5em;">We cover how to distinguish the order of function arguments in <a href="https://area.autodesk.com/blogs/mcgblog/the-low-poly-modifier---part-2" target="_blank">The Low Poly Modifier - Part 2</a>, but if you want a quick summary, the idea is to traverse the function backwards in a &ldquo;Depth-first Top-to-Bottom&rdquo; manner. Begin your traversal at the end of the function, and continuously visit the incoming nodes prioritizing depth first (i.e. going backwards), then visiting the slots top-to-bottom. The order in which you encounter the unconnected connectors corresponds to the argument order of the function. During your traversal, ignore the arguments you have already discovered.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/15-Combine.png" width="1886" height="665" /></p> <p>As a counterexample to the graph above, if we swapped the &ldquo;xs&rdquo; and &ldquo;ys&rdquo; inputs of the Combine node, the graph would not compile successfully because the type of the first array (IArray&lt;Single&gt;) would not match the type of the first argument (Int32). Likewise, the type of the second array (IArray&lt;Int32&gt;) would not match the type of the second argument (Single).</p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Combine</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Combine A B fxn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i=0 to (A.count-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;itemA = A[i+1] <span style="color: #00cc99;">-- Adding 1 because MaxScript array indexing is 1-based.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;itemB = B[i+1] <span style="color: #00cc99;">-- Adding 1 because MaxScript array indexing is 1-based.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;tmp = fxn itemA itemB</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function to apply on each iteration of Combine.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunction x y = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return x * y</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of integer values and an array of random values</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(139, 462, 521, 206, 877, 99)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">B = ArrayOfFunction myRandomFunction A.count</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Combine A B myFunction <span style="color: #00cc99;">-- =&gt; #(17.9539, 349.924, 510.956, 143.505, 314.525, 43.2008)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><strong><span style="line-height: 1.5em;"><br /></span></strong></p> <p><strong><span style="line-height: 1.5em;">Creating an Indexed For Loop - Indices, Map, At</span></strong></p> <p>The Combine operator can be a bit tricky to work with, especially if you&rsquo;re not familiar with functions containing two arguments. As an alternative, you can emulate an index-based for loop to access items in your arrays. To do this, use the Indices, Map and At operators as follows:</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/16-IndicesMapAt.png" width="1838" height="598" /></p> <p><strong><br /></strong></p> <p><strong>ZipToTuple</strong></p> <p>Another alternative to the Combine operator is to use ZipToTuple with a Map. The idea is to first &ldquo;Zip&rdquo; the items contained in the two arrays into an array of pairs (IArray&lt;Tuple2&gt;). You can then use a Map to transform each Tuple2. Use the PairItem1 and PairItem2 operators to obtain the contents of the Tuple2, and continue your work from there.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/17-ZipToTuple.png" width="1823" height="614" /></p> <p>Ultimately, the choice between Combine, ZipToTuple, or indexed for loops depends on your personal preference, with the caveat that in some corner cases, an indexed for loop might cause unexpected subgraph re-evaluations, which can be slower than the other alternatives.</p> <p><strong><br /></strong></p> <p><strong>GenerateN</strong></p> <p>The GenerateN operator creates an array of a fixed size by repeating the same function on the current value to generate the next value in the array. In the <a href="https://area.autodesk.com/blogs/mcgblog/horns-and-transforms" target="_blank">Horns and Transforms tutorial</a>, we showed how to use the GenerateN operator to construct an evolving array of transformation matrices to define the shape of the horn.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/18-GenerateN.png" width="1481" height="795" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- GenerateN</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function GenerateN first count nextFn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;current = first</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i=0 to (count-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;<span style="color: #00cc99;">-- Append the current value to the result.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;<span style="color: #00cc99;">-- Compute the next result based on the current value.<br /></span></span><span style="color: #4d4d4d; font-family: Consolas; font-size: 12px;">&nbsp; if (i &gt; 0) then (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;</span><span style="color: #4d4d4d; font-family: Consolas; font-size: 12px; line-height: 1.5em;">&nbsp;</span><span style="color: #4d4d4d; font-family: Consolas; font-size: 12px; line-height: 1.5em;">current = nextFn current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="line-height: 1.5em;">&nbsp;</span></span><span style="color: #4d4d4d; font-family: Consolas; font-size: 12px; line-height: 1.5em;">&nbsp;</span><span style="color: #4d4d4d; font-family: Consolas; font-size: 12px; line-height: 1.5em;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function which GenerateN will use to create the next value in the array.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunction x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return x + 10</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- The initial value of GenerateN will be 0</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">init = 0</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Repeat GenerateN 5 times.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">n = 5</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">GenerateN init n myFunction <span style="color: #00cc99;">-- =&gt; #(0, 10, 20, 30, 40)</span></span></p> <p><strong><br /></strong></p> <p><strong>Generate</strong></p> <p>The Generate operator is very similar to GenerateN, with the exception that it stops building the array when the supplied condition function returns False. In the example below, the Generate operator will continue building the array as long as the current value is less than 50.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/19-Generate.png" width="1569" height="869" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Generate</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Generate first conditionFn nextFn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;current = first</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;while true do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;<span style="color: #00cc99;">-- Stop looping if the condition function returns false.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;cond = conditionFn current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;if cond == false then exit </span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;<span style="color: #00cc99;">-- Append the current value to the result.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;append result current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;<span style="color: #00cc99;">-- Compute the next result based on the current value.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;current = nextFn current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the condition function which Generate will use to continue iterating.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myConditionFunction x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return x &lt; 50</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function which Generate will use to create the next value in the array.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunction x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return x + 10</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- The initial value of Generate will be 0</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">init = 0</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Generate init myConditionFunction myFunction <span style="color: #00cc99;">-- =&gt; #(0, 10, 20, 30, 40)</span></span></p> <p><strong><br /></strong></p> <p><strong>Aggregate</strong></p> <p>The Aggregate operator iterates over each item in the array and accumulates (or &ldquo;aggregates&rdquo;) a value by applying the given function. The function you connect to the Aggregate must expose two arguments. The first argument is the currently &ldquo;accumulated&rdquo; value, and the second argument is the current value in the array.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/20-Aggregate.png" width="1466" height="895" /></p> <p>For example, if you open the Sum compound, you&rsquo;ll notice it was implemented with an Aggregate.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/21-Sum.png" width="1478" height="375" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Aggregate</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Aggregate xs init fxn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;accumulated = init</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for current in xs do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;accumulated = fxn accumulated current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return accumulated</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function to apply on each iteration of the Aggregate.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunction acc current = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return acc + current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of integers.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(139, 462, 521, 206, 877, 99)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Aggregate A 0 myFunction <span style="color: #00cc99;">-- =&gt; 2304</span></span></p> <p><strong><br /></strong></p> <p><strong>Partial Sum with Aggregate</strong></p> <p>The Aggregate operator can also be used to implement a Partial Sum array, whereby each item in the Partial Sum array corresponds to the sum of the items up to that point in the original array. This can be useful to keep track of the current distance at each point along a path. In this case, the accumulated value is actually a growing array, to which we append the latest computed value.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/22-PartialSum.png" width="1613" height="839" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- PartialSum using Aggregate</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function to apply on each iteration of the Aggregate.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function partialSumFn acc current = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;local lastItem</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;if acc.count &gt; 0 then</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;lastItem = acc[acc.count]</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;else</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;lastItem = 0</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;tmp = (lastItem + current)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;append acc tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return acc</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of integers.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(139, 462, 521, 206, 877, 99)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Aggregate A #() partialSumFn <span style="color: #00cc99;">-- =&gt; [139, 601, 1122, 1328, 2205, 2304]</span></span></p> <p><strong><br /></strong></p> <p><strong>Flatten</strong></p> <p>The Flatten operator joins all the subarrays contained inside an array.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/23-Flatten.png" width="1496" height="611" /></p> <p>It is particularly useful when you want to &ldquo;flatten&rdquo; the result of nested iterations. For example, we required the Flatten operator in the Horns and Transforms tutorial to flatten the nested arrays of points into one continuous array of points for the QuadMeshStrip operator.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/24-FlattenWithQuadMeshStrip.png" width="1721" height="512" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Flatten</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Flatten xss = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for subarray in xss do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;join result subarray</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return result</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array of subarrays.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #( #(139, 139), #(462, 462), #(521, 521) )</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Flatten A <span style="color: #00cc99;">-- =&gt; #(139, 139, 462, 462, 521, 521)</span></span></p> <p><strong><br /></strong></p> <p><strong>Repeat</strong></p> <p>At first glance, the Repeat operator may seem like the closest implementation of a for loop. However, once you get familiar with MCG, you&rsquo;ll realize that its usage is almost always eclipsed by one of the more efficient operators we listed above. To illustrate this point, we translated the following MaxScript code containing a standard for loop using the Repeat operator, and alternatively using the Map operator.</p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(139, 462, 521, 206, 877, 99)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">result = #()</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">for i=0 to (A.count-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;x = A[i+1] <span style="color: #00cc99;">-- add 1 because MaxScript array indexing is 1-based.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;tmp = x + x</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;append result tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">result <span style="color: #00cc99;">-- =&gt; #(278, 924, 1042, 412, 1754, 198)</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span></p> <p><span style="line-height: 1.5em;">Using Repeat:</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/25-Repeat.png" width="1861" height="641" /></p> <p>Using Map:</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/25-Map_vs_repeat.png" width="1752" height="458" /></p> <p><span style="line-height: 1.5em;">Here&rsquo;s a more formal MaxScript translation of the Repeat operator.</span></p> <p><span style="color: #00cc99; font-family: Consolas; font-size: 12px; line-height: 1.5em;">-- Repeat</span></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function Repeat init n bodyFn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;current = init</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;for i=0 to (n-1) do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;current = bodyFn current i</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Define an array of values</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(139, 462, 521, 206, 877, 99)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the function to repeat on each iteration.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunction currentArray index = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;x = A[index+1] <span style="color: #00cc99;">-- add 1 because MaxScript array indexing is 1-based</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;tmp = x + x</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;append currentArray tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return currentArray</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">Repeat #() A.count myFunction <span style="color: #00cc99;">-- =&gt; #(278, 924, 1042, 412, 1754, 198)</span></span></p> <p><strong><br /></strong></p> <p><strong>While</strong></p> <p>The While operator acts like the Generate operator, however it does not necessarily generate an array, and acts much like a general-purpose while loop. In the graph below, we&rsquo;re using a while operator to generate a limited Fibonacci sequence.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/the_array_looping_cook_book/26-While.png" width="1748" height="942" /></p> <p><span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Fibonacci sequence using While</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- An underscore is added to "_While" because "while" is a keyword in MaxScript.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function _While init conditionFn bodyFn = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;current = init</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;while true do (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;cond = conditionFn current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;if cond == false then exit</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;&nbsp;current = bodyFn current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return current</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the condition function which will determine if the while operator should continue iterating.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myConditionFunction x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;lastItem = x[x.count]</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return lastItem &lt; 150</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Declare the body function which will be invoked on each iteration.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">function myFunction x = (</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;<span style="color: #00cc99;">-- Add the last and second to last items together to produce the next Fibonacci number.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;f_n1 = x[x.count]</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;f_n2 = x[x.count-1]</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;tmp = f_n1 + f_n2</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;append x tmp</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">&nbsp;return x</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"><span style="color: #00cc99;">-- Initialize an array containing the initial values of the Fibonacci sequence 0 and 1.</span></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">A = #(0,1)</span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;"></span><br /> <span style="font-size: 12px; font-family: Consolas; color: #4d4d4d;">_While A myConditionFunction myFunction <span style="color: #00cc99;">-- =&gt; #(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233)</span></span></p> <p><strong><br /></strong></p> <p><strong>Download:</strong> <a href="http://areadownloads.autodesk.com/wdm/scripting_sdk/MCGArrayTests.zip" target="_blank">MCGArrayTests.zip</a></p> <p><strong>Instructions:</strong> Extract the file anywhere on your filesystem, then go to Scripting &gt; Install Max Creation Graph (.mcg) Package, and select MCGArrayTests.mcg in the extracted location. Once the package is successfully installed, open the MaxScript listener (F11) and type MCGArrayTests() (note the &ldquo;s&rdquo; at the end of Tests). This will run the MCG array test cases we built for this tutorial, and will print the results to the Listener. Feel free to open the MCGArrayTests.maxtool file under C:\\Users\\&lt;username&gt;\\Autodesk\\3ds Max 2016\\Max Creation Graph\\Tools\\Downloads to explore each construction in more detail.</p>Mon, 21 Dec 2015 18:01:55 UTChttp://area.autodesk.com/blogs/mcgblog/the-array-looping-cook-book3ds Max 2016 EXT 2: Simulation CFD VisualizationJose Elizardo<p>In this blog post we use 3ds Max 2016 Extension 2 and Autodesk CFD to generate, animate and visualize CFD data.</p> <p></p> <p>Part 1:</p> <p>https://youtu.be/TdMlAxQEyG0</p> <p>Part 2:</p> <p>https://youtu.be/OmNiDBYAO-s</p> <p></p> <p>The next videos show a sped up workflow for simulating a wind tunnel:</p> <p>https://youtu.be/7252AZaTBBU</p> <p>https://youtu.be/f_xOEH8-nxw</p> <p><img src="/userdata/blogs/joseelizardo/CFD2.jpg" width="1200" height="500" /></p> <p><img src="/userdata/blogs/joseelizardo/CFD3.jpg" width="1200" height="500" /></p>Fri, 18 Dec 2015 21:38:47 UTChttp://area.autodesk.com/blogs/joseelizardo/3ds-max-2016-ext-2-simulation-cfd-visualizationPaul Neale&#039;s video has been posted - Autodesk University 2015MaxStation<p>First videos from Paul Neale has been posted:</p> <p><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/2015/3ds-max-products/av9947">Making Fast and Effective Animation V2: Procedural Animation Tools in 3ds Max -&nbsp;AV9947</a></p> <ul> <li><span style="line-height: 1.5em;">Discover the basic animation tools and methods</span></li> <li><span style="line-height: 1.5em;">Learn fast and effective methods for creating animations</span></li> <li><span style="line-height: 1.5em;">Learn how to solve everyday animation problems with procedural animation tools</span></li> <li><span style="line-height: 1.5em;">Learn how to evaluate when procedural animation will be the most effective solution</span></li> </ul>Fri, 11 Dec 2015 11:21:44 UTChttp://area.autodesk.com/blogs/maxstation/n304-paul-neale039s-video-has-been-posted---autodesk-university-2015Other videos from AU 2015MaxStation<p><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/2015/3ds-max-products/av11340" style="line-height: 1.5em;">Architectural Visualization Meets Concept Design for Advanced 3ds Max and V-Ray Users</a></p> <p>Paul Nicholls,&nbsp;AV11340</p> <ul> <li><span style="line-height: 1.5em;">Gain access to new ways of creating architectural images</span></li> <li><span style="line-height: 1.5em;">Learn how to utilize the perspective match and camera projection toolset</span></li> <li><span style="line-height: 1.5em;">Learn how to relight photographs or collages in an illustrative way</span></li> <li><span style="line-height: 1.5em;">Learn how to create dynamic images using advanced lighting and post techniques</span></li> </ul> <p class="text-white margin-bottom-none"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/2015/3ds-max-products/av12157">Case Study&mdash;Waldorf Astoria: A Film Production in Less than 30 Days</a></p> <p class="text-white margin-bottom-none">Gonzalo Navarro,&nbsp;AV12157</p> <ul> <li><span style="line-height: 1.5em;">Discover the production process of a film</span></li> <li><span style="line-height: 1.5em;">Learn how to plan the green shots in a smart way to avoid camera track</span></li> <li><span style="line-height: 1.5em;">Learn how to use scripts to optimize the workflow</span></li> <li><span style="line-height: 1.5em;">Script creation: Learn how to how to address all the client requirements</span></li> </ul> <p class="text-white margin-bottom-none"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/2015/3ds-max-products/av10216">Aerial Cinematography and CGI for Architecture, Advertising, and Film</a></p> <p class="text-white margin-bottom-none">Gaspard Giroud,&nbsp;AV10216</p> <ul> <li><span style="line-height: 1.5em;">Learn about preproduction: planning the shoot</span></li> <li><span style="line-height: 1.5em;">Learn about production: the aerial shoot</span></li> <li><span style="line-height: 1.5em;">Learn about post production: integrating CGI</span></li> <li><span style="line-height: 1.5em;">Learn how to finish: color correction and delivery</span></li> </ul> <p class="text-white margin-bottom-none"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/2015/3ds-max-products/av10732">Lessons from Photography to Create Compelling Architectural Visualization</a></p> <p class="text-white margin-bottom-none">Ciro Sannino,&nbsp;AV10732</p> <ul> <li><span style="line-height: 1.5em;">Discover the relevance of the abstraction layer</span></li> <li><span style="line-height: 1.5em;">Discover the connections between rendering and photography</span></li> <li><span style="line-height: 1.5em;">Learn how to build an image using the 3-point lighting concept</span></li> <li><span style="line-height: 1.5em;">Learn how to handle contrast with distance</span></li> </ul> <p class="text-white margin-bottom-none"><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/2015/class-detail/av11965">The Next Big Thing: Impactful Developments in the Future of Visualization Panel</a></p> <p class="text-white margin-bottom-none">Paul Doherty - Jorge Barrero -&nbsp;<span style="line-height: 1.5em;">Carlos Cristerna -&nbsp;</span><span style="line-height: 1.5em;">Jeff Mottle,</span><span style="line-height: 1.5em;">&nbsp;AV11965</span></p> <ul> <li><span style="line-height: 1.5em;">Learn about new technologies like augmented reality, virtual reality, real time, cloud, GPU and the impact they have on the future of visualization</span></li> <li><span style="line-height: 1.5em;">Learn about the role of visualization artists in the field and how their positions might change in the future</span></li> <li><span style="line-height: 1.5em;">Learn about current design and visualization pipelines and what advances need to happen to sync with future design processes</span></li> <li><span style="line-height: 1.5em;">Learn about new opportunities for visualization artists and studios that may come out of new developments in technology</span></li> </ul>Thu, 10 Dec 2015 09:21:24 UTChttp://area.autodesk.com/blogs/maxstation/n303-other-videos-from-au-2015Videos from Autodesk UniversityMaxStation<p>The first AU 2015 videos have appeard, here is the first 3ds Max related one by&nbsp;<span style="line-height: 1.5em;">Ramy Hanna</span></p> <p><a href="http://au.autodesk.com/au-online/classes-on-demand/class-catalog/classes/year-2015/3ds-max-products/av9778">AV9778: Render Like a Photographer</a></p> <ul> <li><span style="line-height: 1.5em;">Learn how to differentiate good renderings and photographs from bad ones</span></li> <li><span style="line-height: 1.5em;">Discover the 3 principles of photography</span></li> <li><span style="line-height: 1.5em;">Discover the 4 rules of photography composition</span></li> <li><span style="line-height: 1.5em;">Discover at least 4 photographic phenomena and how they affect images</span></li> </ul> <p>TARGET AUDIENCE&nbsp;<span style="line-height: 1.5em;">3D Artists, Architects, Developers, Photographers</span></p> <p>DESCRIPTION</p> <p><span style="line-height: 1.5em;">Back by popular demand&mdash;this class will guide you through the essentials of creating a stunning image. Nowadays it&rsquo;s not enough to just know how to create a rendering; to sell your image it&rsquo;s important to know the vital rules and principles of photography. This timeless class will break down the principles of well-known architectural photographs and renderings and translate them to creating renderings using 3ds Max software. This class will also highlight photographic elements and demonstrate how to apply them to 3D renderings. So whether you want to create better renderings or learn more about photography, this class is for you.</span></p>Tue, 08 Dec 2015 14:38:10 UTChttp://area.autodesk.com/blogs/maxstation/n302-videos-from-autodesk-universityMaya BonusTools - Create Audio Wave NodeSTLR<p>I've been sitting on this one for a while and for some reason I just forgot to post it.&nbsp; Better late than never.&nbsp; Way back in 2011 a Maya user named Anthony Castaneda (sp?) posted a cool little tutorial and example of how the Audio Wave Node utility in BonusTools can be used to drive objects and attributes in Maya with a sound file.</p> <p style="text-align: center;"><strong>Tutorial...</strong></p> <p style="text-align: center;">http://www.youtube.com/watch?v=a7FbanaAEnY</p> <p style="text-align: center;"><strong>In viewport example...</strong></p> <p style="text-align: center;">http://www.youtube.com/watch?v=cMYVUUDTSHE&amp;list=UUvewHhzh2bgBOL9duXniqNg&amp;index=8</p> <p style="text-align: center;"><strong>Rendered example...</strong></p> <p style="text-align: center;">http://www.youtube.com/watch?v=ogCfYwYbZpo</p>Mon, 07 Dec 2015 21:17:57 UTChttp://area.autodesk.com/blogs/stevenr/maya-bonustools---create-audio-wave-nodeGuided simulations using a deforming mesh with foamAdrian Graham<p>A few people have asked for a more in-depth version of Daryl Obert's demo&nbsp;<a href="https://www.youtube.com/watch?v=zeZNAsq5m0c" target="_blank">Maya 2016: Guided Simulations in Bifrost.</a>&nbsp;There's a few things he didn't have time to show in the video, this post covers more about guided simulations and foam emission in Maya 2016.</p> <p>The finished scenefile you see in the video can be found here:&nbsp;<a href="/userdata/blogs/valhalla/DEMO_guided_simulation_v08_cached.zip" style="line-height: 1.5em;">DEMO_guided_simulation_v08_cached.zip</a></p> <p>The Alembic cache I use for the guided sim can be found here:&nbsp;<a href="/userdata/blogs/valhalla/ocean_anim.zip" style="line-height: 1.5em;">ocean_anim.zip</a></p> <p>https://youtu.be/sPZM9vCXt7k</p>Sat, 05 Dec 2015 07:00:56 UTChttp://area.autodesk.com/blogs/valhalla/guided-simulations-using-a-deforming-mesh