AREA Blogs Feed 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.Sat, 28 Nov 2015 04:05:37 UTCA360 rendering doesn&#039; t use hidden lightsMaxStation<p>Similar to the&nbsp;<a href="/blogs/maxstation/n299-a360-rendering-fails-without-a-explanation">A360 rendering fails without a explanation</a> post, if you hide your lights they will not be included when the scene is uploaded to the cloud and therefore a default light is used.</p> <p>So make sure that your lights aren't hidden when you submit a scene to A360 cloud rendering. This has been reported to our developers.</p>Fri, 27 Nov 2015 10:30:13 UTC rendering fails without a explanationMaxStation<p>When files are uploaded to the A360 rendering service anything that's hidden will not be uploaded. So when you hide your cameras and ask it to render Camera001 it will upload the file without the camera(s) and then fail to render as the camera you're asking it to render is not in the scene file. You'll see something like this on&nbsp;<a href=""></a></p> <p><img src="/userdata/blogs/maxstation/nicolas/a360-error.png" width="650" height="575" /></p> <p>This has been reported to our developers. For the time being make sure that you unhide all cameras that you want to render using A360 before submitting the render.</p>Thu, 26 Nov 2015 14:10:07 UTC camera and changing the focus for depth of fieldMaxStation<p>When you use the physical camera and change the focus for the depth of field by changing the focus distance (either directly or by changing the target distance) you wil notice that the field of view gets narrower when the distance is shorter or wider when the distance gets longer. With a normal camera in 3ds Max this doesn't happen.</p> <p></p> <p>The reason for that is lens breathing: lenses have to move in order to focus at a different distance. By default the value for lens breathing is set to 1.0, if you change it to 0.0 it will not affect the field of view. The field is part of the focus area of the physical camera.</p> <p></p> <p>So the question then becomes what you want/need:</p> <ul> <li><span style="line-height: 1.5em;">does the result have to be as physically correct as possible (and therefore lens breathing should be set to some value higher than 0.0, depending on the quality of the lens: better quality, lower valuue, less lens breathing)&nbsp;</span></li> <li><span style="line-height: 1.5em;">are you simulting a lightfield camera (where changing depth of field is done with software after you've taken the picture) and therefore there is no lens breathign (value = 0.0)</span></li> <li><span style="line-height: 1.5em;">or will lens breathing distract from the story you're telling and therefore you should forgo being physically correct and ste lens breathing to 0.0.&nbsp;</span></li> </ul> <p></p> <p>The wikipedia article on thsi topic: <a href="">breathing (lens)</a> has a link to a nice video that shows the changes in field of view when changing the focus distance:</p> <p></p>Wed, 25 Nov 2015 11:20:49 UTC Landreth talks about facial animation, the early days of Maya and filmmakingCory Mogk<p>This interview with Oscar-Winning Animation Director Chris Landreth starts off a little slowly but as he and the interviewer warm up it gets very interesting. Chris talks about how he got started, his process and films and he covers some of the history of the early days of Maya.</p> <p><iframe src="" width="500" height="281" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen=""></iframe></p>Tue, 24 Nov 2015 11:57:01 UTC Monday - Parallel Rig Evaluation with Dynamics in Maya 2016 extension 1dobert<p><iframe width="560" height="315" src="" frameborder="0" allowfullscreen=""></iframe></p>Fri, 20 Nov 2015 00:16:25 UTC and Transformsmcgblog<p>In this post, we&rsquo;ll be looking at how to create a horn in MCG. The secret sauce to this tool requires two main ingredients:</p> <ol> <li><span style="line-height: 1.5em;">Transformation matrices</span></li> <li><span style="line-height: 1.5em;">The QuadMeshStrip operator.</span></li> </ol> <p>To create a horn, the idea is to apply a sequence of transformation matrices to a collection of circular points to create the structure of the horn. Once all the points are in place, they can be meshed together with the QuadMeshStrip operator.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/01.jpg" width="1920" height="1080" /></p> <p><strong>A Quick Matrix Rundown</strong></p> <p>If you&rsquo;re new to matrices, <a href="" target="_blank">Khanacademy has a great tutorial on the basics of matrix transformations</a>, and <a href="" target="_blank">codinglabs does an excellent job at explaining the use of matrices in 3D applications</a>. For this post, we&rsquo;ll confine our understanding of matrices to little machines which have two important properties:</p> <ul> <li><strong style="line-height: 1.5em;">Property 1</strong><span style="line-height: 1.5em;">: A matrix can </span><strong style="line-height: 1.5em;">transform</strong><span style="line-height: 1.5em;"> a vector into a new vector by scaling it, rotating it, and translating it. In the diagram below, the matrix <strong>M</strong> transforms the vector <strong>V<sub>in</sub></strong>&nbsp;into the new vector <strong>V<sub>out</sub></strong>.<br /></span><br /><img src="/userdata/blogs/mcgblog/horns_and_transforms/02.png" width="629" height="416" style="vertical-align: middle;" /><br /><br /></li> <li><strong style="line-height: 1.5em;">Property 2</strong><span style="line-height: 1.5em;">: Two matrices can be </span><strong style="line-height: 1.5em;">multiplied</strong><span style="line-height: 1.5em;"> to create a new matrix. The new matrix does the same work as the two input matrices in the same order they&rsquo;re specified. In the diagram below, matrix <strong>C</strong> is the result of multiplying matrix <strong>A</strong> by matrix <strong>B</strong>. When we use matrix <strong>C</strong> to </span><strong style="line-height: 1.5em;">transform</strong><span style="line-height: 1.5em;"> a vector, the work of matrix <strong>A</strong>&nbsp;will occur first, followed by the work of matrix <strong>B</strong>.<br /><br /></span><img src="/userdata/blogs/mcgblog/horns_and_transforms/03.png" width="770" height="336" style="vertical-align: middle;" /></li> </ul> <p>If you&rsquo;re following along with your own graph, be mindful that <strong>the input order for matrix multiplication matters</strong>. In mathematical terms, matrix multiplication is generally not commutative, meaning that the result of <strong>A*B</strong> is generally not the same as <strong>B*A</strong>.</p> <p>Finally, for the technically inclined, here are a few more details relating to matrices and vectors in MCG:</p> <ol> <li><span style="line-height: 1.5em;">Matrices are 4x4 row-major, meaning that the translation component occupies the bottom row.</span></li> <li><span style="line-height: 1.5em;">Matrix rows are indexed starting at 1, so the translation component can be accessed with an index of 4 with the MatrixRow operator (or with the GetMatrixTranslation operator).</span></li> <li><span style="line-height: 1.5em;">Matrix multiplication is post-multiplicative (top-down), meaning that the &ldquo;x&rdquo; input of the Multiply operator will occur before the &ldquo;y&rdquo; input.</span></li> <li><span style="line-height: 1.5em;">When a vector is transformed by a matrix, the vector is assumed to be a point (with a &ldquo;w&rdquo; component set to 1), and is therefore affected by the translation component of the matrix.</span></li> </ol> <p><strong>Stacking Cubes with Matrices</strong></p> <p>Now that we&rsquo;ve got a sense of what matrices do, let&rsquo;s look at how to use them in MCG. Open the MCG editor, replicate the graph below, and save it as <strong>cube_stack.maxtool</strong>. Note that it shouldn&rsquo;t compile yet - we still have to define the array of matrices to feed into it.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/04.png" width="1920" height="1092" /></p> <p>Now, to create this array of matrices, we&rsquo;ll use the GenerateN operator. This operator incrementally builds an array of values by running its &ldquo;next&rdquo; function repeatedly. The &ldquo;next&rdquo; function receives only one input: either the previously computed result, or, on the first iteration, the &ldquo;first&rdquo; value connected to the GenerateN operator.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/05.png" width="1920" height="1092" /></p> <p>Here, on the first iteration, the function&rsquo;s input is set to the MatrixIdentity (<strong>I</strong>) and is multiplied by the translation matrix (<strong>Z</strong>). You can imagine the MatrixIdentity as a matrix which performs no work, much like multiplying a number by 1. We&rsquo;ll label the result of this first iteration as matrix <strong>R<sub>1</sub></strong>.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/06.png" width="1920" height="1092" /></p> <p>On the second iteration, the function&rsquo;s input is set to the previous result: matrix <strong>R<sub>1</sub></strong>. <strong>R<sub>1</sub></strong> is then multiplied by the translation matrix <strong>Z</strong>, resulting in matrix <strong>R<sub>2</sub></strong>.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/07.png" width="1920" height="1092" /></p> <p>When we expand this sequence of operations, we can see that <strong>R<sub>2</sub> = R<sub>1</sub>*Z = (I*Z)*Z = Z*Z</strong>. In other words, <strong>R<sub>2</sub></strong> amounts to multiplying the matrix <strong>Z</strong> with itself twice. By extension, on the n<sup>th</sup> iteration, matrix <strong>R<sub>n</sub></strong> will be equivalent to multiplying the matrix <strong>Z</strong> with itself n times.</p> <p><span style="line-height: 1.5em;">With the array of matrices properly generated and applied to each cube, you can now evaluate the graph and create an instance of the cube_stack in your scene (Create &gt; Max Creation Graph &gt; cube_stack).</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/08.png" width="1689" height="985" /></p> <p><strong>Twist and Bend</strong></p> <p>Let&rsquo;s spice things up with some twists and bends. In the graph below, be mindful to add the correct RotationXMatrix, RotationYMatrix, and RotationZMatrix operators (instead of copying and pasting the same RotationXMatrix operator three times). Make sure to also convert your Parameter values into radians using the ToRadians operator.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/09.png" width="1920" height="1092" /></p> <p>When you evaluate the graph, you can now manipulate the local rotations in X, Y, and Z. Notice that larger rotation values will cause tighter curls.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/10.png" width="1689" height="985" /></p> <p><strong>Scaling</strong></p> <p>The last piece of this matrix puzzle is to add a scaling factor along the stack. Use the ScaleMatrix operator to affect the scale uniformly along the X, Y and Z axes. Alternatively, if you&rsquo;re looking for more control over the scale along each axis, consider using the VectorScaleMatrix operator instead.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/11.png" width="1920" height="1092" /></p> <p>When you evaluate your graph, the scale parameter should now affect the scale along the stack.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/12.png" width="1689" height="985" /></p> <p><strong>A Circular Base</strong></p> <p>With the horn starting to take shape, let&rsquo;s switch gears to focus on the circular base. Open a new tab in the MCG editor (File &gt; New), build the following graph, and save it as <strong>horn.maxtool</strong> (it shouldn&rsquo;t compile yet). Once again, we&rsquo;re starting off with a mapped function to clone some cubes, but this time, we&rsquo;ve chosen to use the OffsetMesh operator to move each cube by a given vector.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/13.png" width="1920" height="1092" /></p> <p>To create the circular array of points, we&rsquo;ll use the RangeExclusiveFloat operator, which produces an array of evenly spaced values between 0.0 and 1.0 exclusively. For example, given an input of 5, it will produce the array containing the following five elements: [0.0, 0.2, 0.4, 0.6, 0.8]. This operator is ideal for generating proportional values, and we&rsquo;ll be using it to create evenly distributed points around a circle.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/14.png" width="1920" height="1092" /></p> <p>In the graph above, the TwoPi operator denotes the angle (in radians) contained inside a full circle. We&rsquo;re multiplying it by the current proportion to obtain the current angle in the circle. This angle is then applied to the Cos and Sin operators, whose results are multiplied by the radius to obtain the <a href="" target="_blank">(X,Y) cartesian coordinates of the point on the circle</a>.&nbsp;</p> <p>Evaluate the graph, and create an instance of the horn in your scene (Create &gt; MaxCreationGraph &gt; horn). If everything went well, you&rsquo;ll see a circular distribution of proxy cubes around the local origin.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/15.png" width="1689" height="985" /></p> <p><strong>Making Rings</strong></p> <p>At this point, we&rsquo;ve got a circular base and a sequence of matrices which defines the horn&rsquo;s shape. The next step is to glue these two pieces together to create rings along the horn. Open a new tab and build the graph below. Save this graph as <strong>TransformPoints.maxcompound</strong> under your C:\\Users\\&lt;username&gt;\\Autodesk\\<span style="line-height: 1.5em;">\3ds Max 2016\\Max Creation Graph\\Compounds\\ folder. Once this compound has been saved, select Operators &gt; Reload Operators, and close the tab. We&rsquo;ll be using this compound shortly.&nbsp;</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/16.png" width="1920" height="1092" /></p> <p>Next, go back to the <strong>cube_stack.maxtool</strong> tab, and copy (Ctrl+C) the section which generates the array of matrices.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/17.png" width="1920" height="1092" /></p> <p>Paste (Ctrl+V) this section into the <strong>horn.maxtool</strong> tab, and use two Pass-through: Array nodes to bring the array of matrices and the point profile closer together. You can also take this moment to align the proxy cube section to keep your lines clean.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/18.png" width="1920" height="1092" /></p> <p>Add the following operators between the Pass-throughs and the proxy cube section. You&rsquo;ll notice that we&rsquo;re using the TransformPoints compound we created above to transform the point profile according to each matrix. Apply the Flatten operator to obtain a flat array of vectors instead of an array of sub-arrays of vectors. You can then feed this array into the proxy cube creation, and change the size of the proxy cubes to 0.5 to get a clearer result in the viewport.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/19.png" width="1920" height="1092" /></p> <p>When you evaluate the graph, your point profile should now appear as a sequence of rings. Note that the cubes themselves are not oriented along the ring, since we&rsquo;re only affecting their position with the OffsetMesh operator. This is fine, because we&rsquo;ll be replacing these cubes with a continuous mesh in a moment.</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/20.png" width="1689" height="985" /></p> <p><strong>Meshing it All Together</strong></p> <p>The final step involves meshing all the points together. Remove the proxy cube section (along with the Flatten operator), and add the following operators. The QuadMeshStrip operator produces a QuadMesh output type, so we&rsquo;ll need to use the ToTriMesh operator to make it compatible with the terminal &ldquo;Output: geometry&rdquo; node&rsquo;s TriMesh input type.&nbsp;</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/21.png" width="1920" height="1092" /></p> <p>At its core, the QuadMeshStrip operator takes a flattened array of vectors, and connects them together row-by-row using quad faces. Here&rsquo;s a breakdown of its inputs:</p> <ul> <li><span style="line-height: 1.5em;"><strong>points -</strong>&nbsp;The array of vectors. In this case, we need to reverse the incoming array of sub-arrays before flattening it to make sure the mesh&rsquo;s faces are built with the correct normals. If your mesh appears with incorrect normals in your renders, it&rsquo;s likely you&rsquo;re missing a Reverse operator. <em>In fact, I strongly recommend you create test renders of your MCG tools as you work on them</em>.</span></li> <li><span style="line-height: 1.5em;"><strong>nRows -</strong>&nbsp;An integer which denotes how many rows are contained within in the flattened array of vectors. It&rsquo;s assumed that each row contains the same number of points.</span></li> <li><span style="line-height: 1.5em;"><strong>bWrapRows</strong> - A boolean which determines whether or not to connect the first and last row of points together. We&rsquo;re setting it to False because we don&rsquo;t want the horn to loop onto itself.</span></li> <li><span style="line-height: 1.5em;"><strong>bWrapCols</strong> - A boolean which determines whether or not to connect the first and last point on each ring. We&rsquo;re setting it to True to make sure our horn appears as a fully extruded cylinder (instead of having a missing column of faces along its length).</span></li> </ul> <p><span style="line-height: 1.5em;">When you evaluate the graph, your horn should now appear as a continuous mesh in the viewport. As a final touch, add a <strong>CapHoles</strong> and a <strong>Smooth</strong> modifier (with AutoSmooth enabled), and tune your horn as you see fit. You can also use a <strong>Symmetry</strong> modifier to add the second horn.</span></p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/22.png" width="1689" height="985" /></p> <p>With that, your horn tool should be complete! Make sure you experiment with different designs, and add your own customizations to the tool! Here are a few horns we discovered with this technique:</p> <p><img style="vertical-align: middle;" src="/userdata/blogs/mcgblog/horns_and_transforms/23.jpg" width="1920" height="1080" /></p> <p dir="ltr" style="margin-top: 0pt; margin-bottom: 0pt; padding-top: 0px; padding-right: 0px; padding-left: 0px; border: 0px; font-stretch: inherit; line-height: 1.38; vertical-align: baseline; background-color: #dadfe1;"><span style="margin: 0px; padding: 0px; border: 0px; font-stretch: inherit; font-size: 14.6667px; line-height: inherit; font-family: Arial; vertical-align: baseline; color: #000000; white-space: pre-wrap; background-color: transparent;">Download: <a href="/userdata/blogs/mcgblog/horns_and_transforms/" mce_href="/userdata/blogs/mcgblog/horns_and_transforms/"></a></span></p> <p style="padding-top: 0px; padding-right: 0px; padding-left: 0px; border: 0px; font-stretch: inherit; vertical-align: baseline; background-color: #dadfe1;"><span id="docs-internal-guid-45d3c2ed-8189-953d-46e3-bce9c3f59e4f" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: 14.6667px; line-height: inherit; font-family: Arial; vertical-align: baseline; color: #000000; white-space: pre-wrap; background-color: transparent;">Instructions: Extract the file anywhere on your filesystem, then go to Scripting &gt; Install Max Creation Graph (.mcg) Package, and select horn.mcg in the extracted location. Once the package is successfully installed, it should appear under the Create tab &gt; Max Creation Graph &gt; horn.</span></span></p>Wed, 18 Nov 2015 22:07:43 UTC Monday - Parallel Rig Evaluation on a HP z840dobert<p><iframe width="560" height="315" src="" frameborder="0" allowfullscreen=""></iframe></p>Tue, 17 Nov 2015 23:31:36 UTC 9: XRefMaxStation<p>Cut, trim and edit the stories of your design directly in 3ds Max 2016 with the new Camera Sequencer</p> <p><a href="/userdata/blogs/maxstation/nicolas/3dsMax2016-XRef-FacebookPost.jpg"><img src="/userdata/blogs/maxstation/nicolas/3dsMax2016-XRef-FacebookPost-small.jpg" /></a></p>Thu, 05 Nov 2015 12:07:01 UTC 8: Camera SequencerMaxStation<p>Cut, trim and edit the stories of your design directly in 3ds Max 2016 with the new Camera Sequencer</p> <p><a href="/userdata/blogs/maxstation/nicolas/3dsMax2016-CameraSequencer-FacebookPost.jpg"><img src="/userdata/blogs/maxstation/nicolas/3dsMax2016-CameraSequencer-FacebookPost-small.jpg" /></a></p>Wed, 04 Nov 2015 12:04:32 UTC Monday - Dynamic Rope Rig using nHairdobert<p><iframe width="560" height="315" src="" frameborder="0" allowfullscreen=""></iframe></p>Tue, 03 Nov 2015 14:50:43 UTC 7: Inventor AnimationMaxStation<p>3ds Max 2016 now supports Inventor Animation eliminating the need to rig your assemblies</p> <p><a href="/userdata/blogs/maxstation/nicolas/3dsMax2016-InventorAnimation-FacebookPost.jpg"><img src="/userdata/blogs/maxstation/nicolas/3dsMax2016-InventorAnimation-FacebookPost-small.jpg" /></a></p>Tue, 03 Nov 2015 12:01:58 UTC 6: Max Creation Graph (MCG)MaxStation<p>Expand the capabilities of 3ds Max 2016 with the new Max Creation Graph (MCG)</p> <p><a href="/userdata/blogs/maxstation/nicolas/3dsMax2016-MCG-FacebookPost.jpg"><img src="/userdata/blogs/maxstation/nicolas/3dsMax2016-MCG-FacebookPost-small.jpg" /></a></p>Mon, 02 Nov 2015 12:00:38 UTC Visual Functional ProgrammingChristopher Diggins<h2>Introduction</h2> <p><span style="line-height: 1.5em;">For those of you new to this blog, my name is Christopher Diggins, and I am a principal developer on 3ds Max. I work at Autodesk out of Montreal, Canada, and I have been fascinated with programming language implementation and design for 20 years.&nbsp;</span></p> <p><span style="line-height: 1.5em;">The last couple of years have been a real high point in my career, because I was being paid to design and implement a commerical programming language! The result was a functional visual programming language built into Autodesk 3ds Max 2016 called "Max Creation Graph" or MCG for short. &nbsp;<br /></span></p> <p><span style="line-height: 1.5em;">In case you are unfamiliar with 3ds Max, it is a comprehensive 3D modeling, animation, and rendering, solution for games, film, and motion graphics artists. It is also free for students and educators: &nbsp;</span><a href="" style="line-height: 1.5em;"></a><span style="line-height: 1.5em;">x. &nbsp;</span></p> <div><span style="line-height: 1.5em;"><br /></span></div> <h2><span style="line-height: 1.5em;">About MCG</span></h2> <p><span style="line-height: 1.5em;">MCG was initially developed as a way for people to create add-ins for 3ds Max that could create and manipulate geometry. Since geometry is mostly arrays of data (indices, vertices, faces, colors, UVs, selection sets) we decided to make a language that could efficiently manipulate large arrays of data. Because we wanted the language to perform efficiently and predictably in a multi-threaded environment it made sense to take ideas from the functional programming community, and to make a statically typed pure functional language. To be fair, while&nbsp;</span><span style="line-height: 1.5em;">the core language is pure functional, there are currently a number of stateful objects (e.g. Caches, random rumber generators) and large number of operations with side effects. Interestingly, we have found the pure functional approach to be very rewarding and will continue to work towards making it more pure in the future.&nbsp;</span></p> <h4><span style="line-height: 1.5em;">Language Influences</span></h4> <div><span style="line-height: 1.5em;">MCG is influenced by many programming languages, the most prominent of which are C#, Haskell, APL, and Softimage ICE. The MCG compiler emits .NET byte-code and uses MAXScript to interface with the 3ds Max plug-in system. No single aspect of the MCG language can be classified as novel, most of the ideas exist in other languages, but I haven't seen another visual programming language that has the same degree of support for functional programming.&nbsp;</span></div> <div><span style="line-height: 1.5em;"><br /></span></div> <h4>Statically Typed</h4> <p>MCG is statically typed. This means that the certain ill-formed programs and computations are detected at compile-time. For example in MCG you cannot add an integer (Int32) to a floating point value (Single), so the type system will detect this at compile-time and reject the program. In addition to the increased assurances that your program is correct, a static type system also enables the compiler to emit more efficient code than when types are checked dynamically at run-time. &nbsp;</p> <h4>Functional Programming</h4> <p>In a functional programming language such as MCG functions are first class citizens. They can be dynamically created, passed as function arguments, or returned from functions like any other data type. They can even be stored in arrays. <span style="line-height: 1.5em;">In my opinion, an excellent explantion of </span><a href="" style="line-height: 1.5em;">functional programming can be found here on the Haskell Wiki</a><span style="line-height: 1.5em;">.&nbsp;</span></p> <h4><span style="line-height: 1.5em;">Graphs as Computation&nbsp;</span></h4> <p>Computations in MCG are represented visually as directed acyclic graphs. Connections are implicitly directed from left-to-right. Each node in the graph represents a function (called an operator) that is applied to its input values. Each graph rooted at a particular node is an expression that represents the application of the function to its inputs.&nbsp;<span style="line-height: 1.5em;">If the &ldquo;function&rdquo; output of a node is used then the value output is an anonymous function (lambda abstraction) representing the graph&rsquo;s computation.&nbsp;</span></p> <p><span style="line-height: 1.5em;"><img src="/userdata/blogs/chris/MCG_pics/Pic1.png" width="772" height="302" /></span></p> <p><span style="line-height: 1.5em;">When capturing a graph&rsquo;s computation as a function the function arguments are the set of unconnected inputs in the graph. </span></p> <p><span style="line-height: 1.5em;"><img src="/userdata/blogs/chris/MCG_pics/Pic2.png" width="552" height="255" /></span></p> <p><span style="line-height: 1.5em;">The order of the arguments are determined by the order in which they appear when searching the graph right to left and top to bottom. The following example is from &ldquo;OffsetMeshes&rdquo; which offset each mesh in an array by a vector multiplied by its index in the aray.</span></p> <p><span style="line-height: 1.5em;"><img src="/userdata/blogs/chris/MCG_pics/Pic3.png" width="870" height="288" /></span></p> <p>For a more detailed tutorial on how function connectors work in MCG, check out Martin Ashton&rsquo;s excellent <a href="/blogs/mcgblog/the-function-connector-part-1--reading-mcg-functions">two-part function tutorial on the MCG blog</a>.</p> <h3>Creating New Operators with Compounds</h3> <p>New operators in MCG can be created from graphs called &ldquo;compounds&rdquo;. A compound graph is saved with the extension &ldquo;.maxcompound&rdquo;. Compounds graphs must use an &ldquo;Output: compound&rdquo; operator as the terminal node of the graph, and use &ldquo;Input&rdquo; nodes (as opposed to &ldquo;Parameter&rdquo; nodes used by tools) to represent the graph&rsquo;s inputs.</p> <p>When a new compound is created and saved, it will be made available to the user (assuming it validates correctly) when the &ldquo;Reload Operators&rdquo; menu option is chosen. The next time 3ds Max starts up its signature will also appear in the help file.&nbsp;</p> <p>Because MCG has a type-inference engine you don&rsquo;t have to explicitly specify the output type of compounds, and can even specify &ldquo;Any&rdquo; for input parameters. The MCG compiler will attempt to assign the most precise type signature that can be determined will be assigned to the new operator. You can use &ldquo;Pass-through&rdquo; operators to help the type engine determine more precise types if needed.&nbsp;</p> <p>A compound is akin to defining functions in a text-based programming language. Like any programming language MCG is most effective when you break complex algorithms up into small well-defined reusable functions. &nbsp;</p> <h3>MCG Type System</h3> <p>The MCG type system is a subset of the C# type-system. Like C# the type system of MCG supports generic types and typed functions. The core primitive types of the MCG type system are:</p> <ul> <li><span style="line-height: 1.5em;">array type (IArray&lt;T&gt;)</span></li> <li><span style="line-height: 1.5em;">function types (Func&lt;T&gt;, Func&lt;T0, T1&gt;, etc.)</span></li> <li><span style="line-height: 1.5em;">tuple types (Tuple&lt;T0, T1&gt; and Tuple&lt;T0, T1, T2&gt;)</span></li> <li><span style="line-height: 1.5em;">integer numbers (Int32)</span></li> <li><span style="line-height: 1.5em;">floating point values (Single)</span></li> <li><span style="line-height: 1.5em;">and Boolean values (Boolean).</span></li> </ul> <p>There are a number of additional types that have been added to help with geometric processing (such as TriMesh and Vector3) and for interfacing with 3ds Max (e.g INode).&nbsp;</p> <p>What is displayed in the UI of the operators is actually an approximation of the type (e.g. IArray) but if you read the operator help or hover your mouse over a socket, you can see a more precise representation of the type. The approximation of the type is provided to do a preliminary type checking in the UI. For example the UI won&rsquo;t let you connect an Int32 to an IArray, but it will let you connect an IArray&lt;IArray&lt;Vector3&gt;&gt; where only an IArray&lt;Single&gt; is allowed. The final type-checking is done during the graph validation stage (which is also performed during evaluation and saving).&nbsp;</p> <p><img src="/userdata/blogs/chris/MCG_pics/Pic4.png" width="495" height="416" /></p> <h3>Immutable Data and Purity</h3> <p>A key feature of MCG is that it encourages a &ldquo;pure functional&rdquo; approach to constructing programs that avoids the usage of side-effects or mutable state.&nbsp;<span style="line-height: 1.5em;">Most data structures in MCG (e.g. arrays, meshes, tuples, vectors) are immutable data structures, meaning that they cannot be changed, you can only construct new versions of these structures. One result of this is that repeated calls to an operator like &ldquo;SetValue&rdquo; may create an entire copy of an array and can be inefficient. That said the MCG compiler employs strategies such as lazy evaluation to mitigate the performance issue.</span></p> <p>Immutable data structures offer several advantages :</p> <ol> <li><span style="line-height: 1.5em;">It is easier to reason about the result of a computation: order of evaluation in inconsequential&nbsp;</span></li> <li><span style="line-height: 1.5em;">Once a valid data structure has been constructed it cannot &ldquo;go wrong&rdquo;. This eliminates a very significant category of software defects.&nbsp;</span></li> <li><span style="line-height: 1.5em;">Multi-threading becomes most efficient: locks are no longer needed to synchronize access to data elements. Because values never change, there is no possibility of race conditions</span></li> <li><span style="line-height: 1.5em;">The compiler can perform employ advanced optimization techniques</span></li> </ol> <h3>Lazy Evaluation and Referential Transparency</h3> <p>The MCG compiler may choose a different internal representation of an immutable data structure if a computation always returns the same results given the same inputs and is side effect free. This property is called referential transparency.&nbsp;</p> <p>An example of an optimization performed by MCG is the &ldquo;Range&rdquo; operator which creates an immutable array of N integers from 0 to N-1. It is implemented &ldquo;lazily&rdquo; in that it generates values as requested rather than allocating a large block of memory filled with integers.&nbsp;</p> <p>This is similar to how LINQ (Language Integrated Natural Query) expressions work in C# and the lazy evaluation strategy of Haskell.</p> <h3>Side Effects</h3> <p>Functions with side effects create observable changes in the computation environment. For example they might change the state of a data structure, update the file system, or print something to a console. Examples of operators with side effects in MCG are &ldquo;Print&rdquo;, &ldquo;PseudoRandomFloat&rdquo;, and &ldquo;CreateEditableMesh&rdquo;. In computations with side effects the order of evaluation matter.&nbsp;</p> <p>Wherever possible you should avoid using functions with side effects, especially in higher-order array operations like &ldquo;Map&rdquo;, &ldquo;Filter&rdquo;, and &ldquo;Combine&rdquo; where there compiler may choose to evaluate the argument in different orders.&nbsp;</p> <h3>Higher Order Functions: Map, Filter, Combine, and Aggregate&nbsp;</h3> <p>Using MCG effectively requires the usage of a special class of higher-order array processing functions.&nbsp;<span style="line-height: 1.5em;">Any function that takes another function as an argument or returns a function as a result, is called a &ldquo;higher-order function&rdquo; or HOF for short. Higher order functions are very useful for working with sequences or arrays of data, as they enable you to describe succinctly data transformations without having to use loops or variables. &nbsp;</span></p> <p>In MCG arguably the most important array operations are &ldquo;Map&rdquo;, &ldquo;Filter&rdquo;, "Combine" and &ldquo;Aggregate&rdquo;. These are similar to the LINQ operations in C# &ldquo;Select&rdquo;, &ldquo;Where&rdquo;, "Zip" and &ldquo;Aggregate&rdquo;. In some programming languages the "Aggregate" function is called "fold" or "reduce".&nbsp;</p> <h4>Map&nbsp;</h4> <p>The map operation transforms an array into a new array by applying a function to all elements in a source array.&nbsp;</p> <p>&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic5.png" width="600" height="296" /></p> <h4>Filter</h4> <p>The filter operation applies a predicate function (a function with one argument that returns a boolean) to an array and returns a new array that contains only elements for which the predicate is true.&nbsp;</p> <p><img src="/userdata/blogs/chris/MCG_pics/Pic6.png" width="740" height="297" /></p> <h4>Aggregate</h4> <p>An aggregate operation applies a binary function to each element in an array with an accumulator value, updating the accumulator value as it goes. The following example computes the sum of an array of values (whether they are Int32, Single, or Vector3).&nbsp;</p> <p>&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic7.png" width="635" height="293" /></p> <h4>Combine</h4> <p>The combine operator applies a binary function to pairwise elements in two separate arrays to create a new array. The following example computes a dot product of two arrays.&nbsp;</p> <p>&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic8.png" width="770" height="383" /></p> <h4>MapWithIndexes and Beyond</h4> <p>With the initial building blocks of &ldquo;Map&rdquo;, &ldquo;Filter&rdquo;, &ldquo;Aggregate&rdquo;, and &ldquo;Combine&rdquo;, it is possible to create new operators that are more specialized such as &ldquo;MapWithIndexes&rdquo; that acts as a &ldquo;Map&rdquo; but takes a binary function which takes the current index as the second input.&nbsp;</p> <p>&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic9.png" width="749" height="323" /></p> <h4>SelectByIndex</h4> <p>Another compound (built using "Map") that is very useful in array processing and that deserves special mention is "SelectByIndex". The "SelectByIndex: operator takes an array of indices and an array of valeus, and returns a new array that contains the values as specified by the indices. Using this you can for example retrieve the vertices of a mesh arranged by face.&nbsp;</p> <p>&nbsp;&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic10.png" width="1003" height="370" /></p> <h3>Multithreaded Operators: ParallelMap and ParallelCombine</h3> <p>Currentlly there are two operators in MCG that compute results in parallel: ParallelMap and ParallelCombine. These are functionally equivalent to Map and Combine, but are multi-threaded. You should only use them when you have identified a performance bottleneck. It is very important that the function arguments do not call any of the 3ds Max operations, since 3ds Max is not thread-safe. Note that overusing these operators can actually slow down your code. &nbsp;</p> <h3>Debugging MCG Graphs in Visual Studio</h3> <p>MCG tools emit a text output in the same folder as tool (e.g. mytool.txt) that can be loaded in the Visual Studio debugger. If you attach the Visual Studio debugger instance to 3ds Max you can set breakpoints in the text file and inspect the various values.&nbsp;</p> <p><img src="/userdata/blogs/chris/MCG_pics/AIco.png" width="1203" height="699" /></p> <p>This text format can be useful for understanding how MCG graphs are converted to byte-code. You&rsquo;ll notice that variables are declared and the results of the expression are assigned to variables. This allows graphs to be reused in multiple computations and to only be computed once.&nbsp;</p> <h3>Control Flow Operations</h3> <p>MCG is designed primarily for the processing of arrays of data. Many computations in MCG are more easily and efficiently solved when they can be expressed in terms of array operations. There are only a handful of basic control flow operations in MCG, but more can be defined using a bit of ingenuity and functional programming.&nbsp;</p> <p>The most basic control flow operator is the &ldquo;If&rdquo; operator which performs conditional evaluation of one of two inputs depending on whether the condition input is true or false.&nbsp;</p> <p>The &ldquo;While&rdquo; operator is a looping operator takes an initial value and two functions a loop body and a termination function. While the termination function returns false for the current value, the body function is called given the current value as an input. The result of the body function is given to the next iteration of the loop.&nbsp;</p> <p>The &ldquo;Repeat&rdquo; operator is similar to the while function but instead calls the body function a predetermined number of times, and also passes in the current loop index.<span style="line-height: 1.5em;">&nbsp;</span></p> <p>As an example of how to build more control flow operators, this example a &ldquo;RepeatWithoutIndices&rdquo; compound is defined using the &ldquo;Repeat&rdquo; operator.&nbsp;</p> <p>&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic11.png" width="830" height="376" /></p> <h3><span style="color: #707070; font-family: 'Lucida Grande', Lucida, Verdana, sans-serif; font-size: 14px; font-weight: normal; line-height: 21px;">Notice the usage of the operator &ldquo;IgnoreSecond&rdquo; which returns the first input, and does nothing with this argument. This operator is noteworthy (along with ignore first) in that it can also be used to help force the arrangement of inputs and function arguments.&nbsp;</span></h3> <h3>Partial Application (Binding)</h3> <p>A slightly more esoteric higher order function that can be useful in some contexts are the various &ldquo;Bind&rdquo; operations (e.g. Bind1Of2) which create functions by binding (fixing) arguments of the function to a particular value. This process is called &ldquo;Partial Application&rdquo;. The result is a new function that requires fewer functions than the original.&nbsp;</p> <p>This advanced example demonstrates a generalized cartesian product function (f(xs[0], ys[0]), f(xs[0], ys[1]) &hellip; f(xs[n], ys[n]). The &ldquo;FlatMap&rdquo; operator applies a function (T -&gt; IArray&lt;U&gt;) to each element of an array (IArray&lt;T&gt;) but instead of returning IArray&lt;IArray&lt;U&gt;&gt; flattens the entire result into an IArray&lt;U&gt;.&nbsp;</p> <p>&nbsp;<img src="/userdata/blogs/chris/MCG_pics/Pic12.png" width="990" height="418" /></p> <p>One area where Bind has become quite useful is dealing with stateful objects like the random number generator. I'll refer you here to another <a href="/blogs/mcgblog/the-low-poly-modifier---part-2">excellent Blog post by Martin Ashton</a> for more detail on this usage of Bind in this context.&nbsp;</p> <h3>Final Words</h3> <p>Thanks for following me down this long rabbit hole. I hope this article whetted your appetite for functional visual programming and that you consider give MCG a try!</p> <p>PS: I'm especially interested in hearing from computer science educators interested in using MCG to teach functional or visual programming to their students.&nbsp;</p>Fri, 30 Oct 2015 23:07:37 UTC 5: Template SystemMaxStation<p>3ds Max 2016 ships with a fully customizable Template System to speed up scene creation</p> <p><a href="/userdata/blogs/maxstation/nicolas/3dsMax2016-TemplateSystem-FacebookPost.jpg"><img src="/userdata/blogs/maxstation/nicolas/3dsMax2016-TemplateSystem-FacebookPost-small.jpg" width="640" height="640" /></a></p>Fri, 30 Oct 2015 14:33:23 UTC to the Futureeperlberg<p>Hey everyone, Tom Hudson here.</p> <p>October 31st, 2015 marks 3ds Max's 25th aniversary. To mark the occasion, I thought it would be fun to go back and look at where we&rsquo;ve been on the journey to make 3ds Max what it is today &ndash; a lot of things have changed, and some have not.</p> <p><strong>In The Beginning&hellip;</strong></p> <p>For me, like a lot of people in the computer graphics world, when the film TRON came out in 1982, it was an eye-opening experience that was incredibly inspiring. &nbsp;The film isn&rsquo;t a masterpiece on the level of Dr. Zhivago, but its ground-breaking use of 3D computer graphics got a lot of us thinking &ndash; I wanted to create cool graphics like the ones in that film!</p> <p><img src="/userdata/blogs/max/2016/BTTF/Sark.png" width="748" height="487" /></p> <p><em>Sark&rsquo;s carrier (TRON)</em></p> <p>At the time, I was working with Atari 8-bit computers at ANALOG Computing Magazine, and those systems were a far cry from what they used to create TRON! &nbsp;But the dream to replicate those images was there, and we did what we could to keep it moving, using whatever means we had. &nbsp;If you look at my desk back in that time period, you&rsquo;ll see a mess of diskettes, printouts and books (notably, Newman &amp; Sproull&rsquo;s &ldquo;Principles of Interactive Computer Graphics&rdquo;, the bible for CG work at the time) &ndash; And above the desk is a calendar.</p> <p><span style="line-height: 1.5em;"><img src="/userdata/blogs/max/2016/BTTF/Desk.png" alt="Desk" width="278" height="360" />&nbsp; &nbsp;<img src="/userdata/blogs/max/2016/BTTF/Calendar.png" alt="Calendar" width="278" height="360" /></span></p> <p><em><span style="line-height: 1.5em;">My ANALOG office &amp; The Calendar</span></em></p> <p>The calendar in this photo is full of early CG images &ndash; rudimentary Gouraud-shaded graphics, very primitive by today&rsquo;s standards &ndash; but incredibly inspirational back then!</p> <p>My goal was to be able to duplicate those kinds of images and ultimately create animations and tell stories. Using the Atari&rsquo;s basic graphics capabilities, I started working on various projects that would hopefully get me where I wanted to be.</p> <p>The great-grandfather of 3ds Max is a little program called &ldquo;Solid States&rdquo; &ndash; created for the Atari 8-bit machines and written in BASIC, it allowed you to create and render wireframe representations of objects. &nbsp;By creating a list of viewpoints and targets, you could actually animate a flyby of something like a spaceship &ndash; The first thing I modeled in it was a representation of a model I had scratchbuilt several years earlier. &nbsp;Not Sark&rsquo;s carrier from TRON, by any stretch of the imagination, but it was a step in the right direction!</p> <p><img src="/userdata/blogs/max/2016/BTTF/Physical_Model.png" alt="Physical Model" width="360" height="156" />&nbsp;&nbsp;</p> <p><em>Physical model</em></p> <p><img src="/userdata/blogs/max/2016/BTTF/Sold_States.png" alt="Solid States" width="360" height="157" style="line-height: 1.5em;" /></p> <p><em>Solid States version</em></p> <p>As additional output devices such as Atari&rsquo;s Model 1020 pen plotter came out, we enhanced the software to use them to produce better output, and used those to create cover photos for the magazine. &nbsp;It was a blast.</p> <p>In early 1985, Atari introduced the ST, a Motorola 68000-based computer that I couldn&rsquo;t wait to get my hands on &ndash; it had much better graphics capabilities than the 8-bit systems we had been using &ndash; higher resolution, more colors, more speed; it was the next step in getting where I wanted to be. &nbsp;Fate then stepped in and I met Gary Yost, who wanted to market software for the ST &ndash; I told him I had an idea for a 3D modeling package&hellip;</p> <p>With Gary, Solid States evolved into a much more advanced 3D modeling package called CAD-3D (May, 1986). &nbsp;It had far better modeling capabilities using mouse input, better rendering than the 8-bit systems because the ST could display a whopping 16 colors, and had several fairly powerful tools for the time.</p> <p><img src="/userdata/blogs/max/2016/BTTF/3dCAD1.png" width="360" height="224" alt="3D CAD Model 1" /></p> <p><img src="/userdata/blogs/max/2016/BTTF/3dCAD2.png" alt="3D CAD Model 2" width="360" height="224" /></p> <p><em>CAD-3D Models</em></p> <p>As we moved forward, our team added Mark Kimball, who developed an animation playback system that was the forerunner of tools like Quicktime. &nbsp;We added stereo 3D output, faked texture mapping and more &ndash; but the 16-color limit was a problem that was starting to become a real hindrance to our goal of producing more-realistic output: you just couldn&rsquo;t get high-quality shading. &nbsp;And despite its more powerful processor, the ST would slow to a crawl when performing the calculations necessary to do high-quality shading.</p> <p>The solution to these issues was to move to the IBM PC &ndash; At this point, the 80386 processor was just becoming available. &nbsp;Its companion math coprocessor chip, the 80387, would make these calculations much faster. &nbsp;But the real lure for me was the fact that the PC had a truecolor graphics card available &ndash; the ATVista. &nbsp;It would make our dreams of realistic renderings possible. &nbsp;For the user interface, we&rsquo;d use the then-new VGA graphics cards, which would allow 256 colors onscreen at ONE TIME. &nbsp;Wow!</p> <p>This is where we joined forces with Autodesk to create the original 3D Studio for DOS. &nbsp;And it was no longer a one-programmer setup: Dan Silva, who had written Deluxe Paint for the Amiga, joined us to write the Keyframer module.</p> <p><img src="/userdata/blogs/max/2016/BTTF/3ds_DOS.png" alt="3ds DOS" width="640" height="480" /></p> <p><em>3ds DOS</em></p> <p>The early days of 3ds were pretty simple, really. &nbsp;There was one VGA standard, so I wrote one set of graphics driver code. &nbsp;We supported the ATVista and a couple of other cards for truecolor output, so that was pretty simple. &nbsp;There were no multi-processor systems, so we didn&rsquo;t have to worry about multi-threaded code. There were only two programmers, so managing our code wasn&rsquo;t too complex. &nbsp;Gary managed the project and Jack Powell handled documentation and helped keep things consistent in the program user interface.</p> <p>Despite having relatively fast computers, we still had to be careful about performance. &nbsp;I wrote the original renderer and was always trying to find cheats to make it faster &ndash; but those always cost something in terms of quality. &nbsp;Still, the dream of creating my version of TRON was starting to come true. Every day after work, I&rsquo;d sit down with the software and create something with it. &nbsp;One of the first was created by doing a frame grab from my camcorder using one of our truecolor display adapters and rendering a hovercraft model:</p> <p>&nbsp;<img src="/userdata/blogs/max/2016/BTTF/Hovercraft.png" alt="Hovercraft" width="606" height="481" /></p> <p><em>A hovercraft in my back yard!</em></p> <p>This had me grinning from ear to ear. &nbsp;Looks pretty awful today, but it was better than 16 colors on an Atari ST!</p> <p>The first version of 3ds DOS was released at the end of October, 1990. &nbsp;As part of the rollout, a team at Autodesk created &ldquo;The Bored Room&rdquo;</p> <p></p> <p>and I created &ldquo;Corner Stone&rdquo;</p> <p></p> <p>Simple videos, but we were actually doing what we had dreamed about just a few years earlier.</p> <p>This early software had no Undo/Redo capability, you could only animate certain things and there were no procedural models (once you built something, if you wanted to change its basic attributes you had to go back and re-create it). System memory was very limited. &nbsp;Looking back, it was awfully primitive.</p> <p>As we moved forward, the two-programmer team just wasn&rsquo;t adequate for developing new tools, so we added a plug-in interface for expansion. Networking was becoming affordable, so 3ds got networked rendering capabilities.</p> <p>In 1994, the Yost Group expanded its development team again, adding Don Brittain and Rolf Berteig for the push to create 3ds Max.</p> <p>&nbsp;<img src="/userdata/blogs/max/2016/BTTF/Yost_Group.jpg" alt="Yost Group" width="705" height="495" /></p> <p><em>Yost Group, 1994. (L-R) Don Brittain, Tom Hudson,&nbsp;<span style="line-height: 1.5em;">Rolf Berteig, Gary Yost, Jack Powell, Dan Silva</span></em></p> <p>The larger team meant having to set up more complex source code control, but it was still very small compared to today&rsquo;s 3ds Max development team!</p> <p>Over the years since we started developing 3ds Max, a lot has changed. &nbsp;Back then:</p> <p>-<span class="Apple-tab-span" style="white-space: pre;"> </span>1 Processor</p> <p>-<span class="Apple-tab-span" style="white-space: pre;"> </span>Basic VGA graphics, no GPUs</p> <p>-<span class="Apple-tab-span" style="white-space: pre;"> </span>Very limited and expensive memory</p> <p>-<span class="Apple-tab-span" style="white-space: pre;"> </span>Limited tools, slow Internet made collaboration difficult</p> <p>-<span class="Apple-tab-span" style="white-space: pre;"> </span>Small team; we could only do so much</p> <p>Now, computers have lots of cores, virtually unlimited memory and an amazing variety of display adapters with GPU acceleration. &nbsp;Networking and Cloud functionality has opened up incredible possibilities for collaboration. &nbsp;And the Max team is huge, distributed all over the world &ndash; this includes the third-party plugin developers, who do simply amazing things.</p> <p><strong>What hasn&rsquo;t changed?</strong></p> <p>I was thinking about this recently when looking at Autodesk&rsquo;s motto &ndash; Imagine, Design, Create. &nbsp;It fits perfectly with what Max is at its core, and why it was created in the first place.</p> <p>The original dream behind 3ds Max was the goal of being able to create just about any kinds of graphics or animation you want &ndash; from abstract to cartoony to realistic. &nbsp;To take your inspiration, whether it&rsquo;s an image from TRON, a concept for a skyscraper or anything else and turn it into reality.</p> <p>Some things change; some things never do.</p> <p>P.S. My desk is still a mess.</p> <p>-----</p> <p>A full writeup on the Atari roots of 3ds Max can be found at: <a href=""></a></p>Thu, 29 Oct 2015 23:46:45 UTC Monday - Bifrost time warp effectdobert<iframe width="560" height="315" src="" frameborder="0" allowfullscreen></iframe>Mon, 26 Oct 2015 14:52:06 UTC en Español - 3DS Max y Maya 2016Rodrigo Assaf<p class="MsoNormal" style="text-align: left;"><span style="font-family: 'Calibri Light', sans-serif; font-size: 14pt; line-height: 1.5em;"><img src="/userdata/blogs/rodrigo/web.jpg" width="715" height="281" /></span></p> <p class="MsoNormal" style="text-align: left;"><span style="font-family: 'Calibri Light', sans-serif; font-size: 14pt; line-height: 1.5em;">Autodesk Le Invita para<br /></span><b style="line-height: 1.5em;"><span lang="ES" style="font-size: 24.0pt; font-family: 'Calibri Light',sans-serif; mso-ansi-language: ES;">WEBINARS: 3DS MAX y MAYA 2016</span></b></p> <p class="MsoNormal"></p> <p></p> <p class="MsoNormal"><span lang="ES" style="font-size: 16.0pt; font-family: 'Calibri Light',sans-serif; mso-ansi-language: ES;">Webinars:<br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">19/11: 3DS Max 2016: Novedades y Tecnolog&iacute;as<br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">Registro: </span><a href="" style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;"></a></p> <p class="MsoNormal"><span lang="ES" style="font-size: 12.0pt; font-family: 'Calibri Light',sans-serif; mso-ansi-language: ES;">26/11: Maya 2016: Novedades y Tecnolog&iacute;as<br /> Registro: <a href=""></a><u5:p></u5:p></span><o:p></o:p></p> <p><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">03/12: 3DS Max: La Renderizaci&oacute;n en la Nube y Character Generator<br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">Registro: </span><a href="" style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;"></a></p> <p class="MsoNormal"></p> <p class="MsoNormal"><span lang="ES" style="font-size: 16.0pt; font-family: 'Calibri Light',sans-serif; mso-ansi-language: ES;">Descripci&oacute;n:<br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">El objetivo del Webinars de Autodesk es demonstrar las nuevas herramientas desarrolladas en 3DS Max y Maya 2016. Abordaremos tambi&eacute;n las novedades incluidas en la versi&oacute;n Extension 1 de toda la l&iacute;nea 2016.</span></p> <p class="MsoNormal" style="margin-bottom: 12.0pt;"><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">En lo que a 3DS Max refiere, podemos destacar herramientas para Broadcast y Motion Graphics como Animation Offset y el nuevo TextPlus para crear textos m&aacute;s modernos. Tambi&eacute;n comentaremos el poder de MCG (Max Creation Graph), que es una herramienta que crea nueva herramientas, nuevos algoritmos para manejar Skin y la velocidad que se logra con archivos Alembic y GPU.<br /><br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">Por otro lado, con Maya vamos a platicar del gran rendimiento para manejar personajes con la tarjeta gr&aacute;fica y todo el procesador del ordenador. Nuevas herramientas de escultura digital, pinceles para manejar UV y la simulaci&oacute;n de l&iacute;quidos y humo son tambi&eacute;n aspectos muy interesantes incluidos&nbsp; en esta versi&oacute;n de Maya 2016.<br /><br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">La renderizaci&oacute;n en la nube de Autodesk&reg; 360 aprovecha la potencia de computaci&oacute;n virtualmente infinita para crear im&aacute;genes fotorealistas y de alta resoluci&oacute;n en una fracci&oacute;n de tiempo. Este servicio est&aacute; disponible con la compra de Autodesk&reg; Subscription o licencias de renta para productos Autodesk seleccionados.<br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;"><br />Con Character Generator es posible reduzir dr&aacute;sticamente el tiempo necesario para crear personajes en 3D personalizados, ataviados y listos para animar</span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">&nbsp;</span></p> <p class="MsoNormal" style="margin-bottom: 12.0pt;"><span style="font-family: 'Calibri Light', sans-serif; font-size: 16pt; line-height: 1.5em;">Conferencista:<br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">Rodrigo Assaf &ndash; Technical Specialist &ndash; Autodesk&nbsp; Latin America</span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">&nbsp;<br /><br /></span><span style="font-family: 'Calibri Light', sans-serif; font-size: 12pt; line-height: 1.5em;">Saludos,</span></p> <p><span lang="ES" style="font-size: 12.0pt; font-family: 'Calibri Light',sans-serif; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: ES; mso-fareast-language: PT-BR; mso-bidi-language: AR-SA;">Rodrigo Assaf<u5:p></u5:p></span></p>Fri, 23 Oct 2015 17:14:14 UTC 4: iray SectionMaxStation<p class="MsoNormal"><span style="font-size: 10.0pt; line-height: 115%; font-family: 'Arial',sans-serif;">Show interior details of your 3ds Max 2016 designs with the new iray Section.&nbsp;</span></p> <p class="MsoNormal"><a href="/userdata/blogs/maxstation/nicolas/3dsMax2016-IraySection-FacebookPost.jpg"><img src="/userdata/blogs/maxstation/nicolas/3dsMax2016-IraySection-FacebookPost-small.jpg" /></a></p>Wed, 21 Oct 2015 09:19:20 UTC Xgen Grooming WorkflowCory Mogk<p>Here's a great new couple of videos from the Maya Learning Team on using Xgen to groom the fur of a chimpanzee.</p> <p>This tutorial folls a different style from what the team typically does. From the Maya Learning Team:</p> <p style="padding-left: 30px;">Just to give a bit of context to the lack of sound: This was a conscious decision on our part for a couple of reasons. &nbsp;One was that we literally set up a screen capture on an expert's computer and allowed him to just "do his thing," so to speak. &nbsp;In fact, part of the agreement in getting the footage at all was that we wouldn't distract him by forcing him to prepare a script or talk to himself (something most people don't usually do at the office). &nbsp;In that sense, think of this as less of a tutorial and more of a "demonstration." &nbsp;We mainly provided the captions in post-processing as a helpful tool rather than a strict step-by-step.</p> <p>What do you think of these kinds of videos? Want to see more?</p> <p><iframe width="560" height="315" src="" frameborder="0" allowfullscreen=""></iframe></p> <p><iframe width="560" height="315" src="" frameborder="0" allowfullscreen=""></iframe></p>Tue, 20 Oct 2015 14:48:58 UTC Monday - Render Passes in Maya 2016dobert<p><iframe width="560" height="315" src="" frameborder="0" allowfullscreen=""></iframe></p>Tue, 20 Oct 2015 13:18:28 UTC