What's New in MCG

Autodesk 3ds Max Extension 1 includes several new features and improvements for Max Creation Graph.

MCG Animation Controllers

You can use MCG to create custom animation controllers to set an object's animatable parameters based on a graph. There are new nodes in the Outputs category for various controller types, such as Float, Position, Rotation, Transform, and others. You can also use the new implicit parameter Transform Controller: Matrix to get the value of the object's parent to use in your calculations.

After MCG-based controllers have been successfully saved and evaluated, they automatically appear in the appropriate Assign Controller window in the Track View and Motion panel.

Several sample controllers are available. You can apply them from the Animation > MCG Controllers menu, or use them as examples for creating your own controllers.

Time-related Nodes

There are several nodes that make it easier to get and work with scene time in graphs. These include:
  • All of the nodes in the new 3ds Max Time category.
  • MeshFromNodeAtTime in the 3ds Max Nodes category.
  • WorldTransformAtTime in the 3ds Max Nodes category.
  • time:int32 in the Implicit parameters category.

Simulations

MCG now lets you create simulations that update iteratively based on the values at the previous frame. You can create simulation graphs for modifiers, controllers, and geometries.

Tools created from simulation graphs have an extra Simulation rollout. When you click Reset Simulation, the caches are cleared and the simulation is rerun from the start to the current time. This is useful, for example, if you have modified the any of the tool's inputs and want to see the correct results on the current frame.

For more information, see Creating a Simulation Graph.

Bullet Physics

The Bullet Physics category contains nodes that let you create rigid-body simulations based on the Bullet Physics engine. You can create a world, add objects and properties to it, and then get their world-space transforms after the world has been updated.

A couple of the sample MCG-based controllers, MCG 1 DOF Rotation Spring Controller and MCG 3 DOF Rotation Spring Controller, are examples of simulations built using the Bullet Physics nodes.

For an outline of how to create your own simulations using the Bullet Physics nodes, see Building a Bullet Rigid Body Simulation.

New Parameter Types

There are new nodes in the Parameters category that allow you to supply your graphs with new data types:
  • Parameter: IArray<INode> specifies an array of objects in the scene.

  • Parameter: IArray<Single> specifies an array of floating-point values.
  • Parameter: Vector3 specifies a 3D vector. You no longer need to use 3 single parameters and build the vector in the graph.

Vector4 Support

4D vectors are supported. In addition to Output: Point4 Controller for building XYZW and RGBA animation controllers, there are nodes in the Vector4 category for building vector4 values from singles, for getting single values from vector4s, and for converting between vector4s and quaternions.

Creating Empty Arrays of Specific Types

The new *EmptyArray nodes in the Arrays category let you create arrays of various types, such as Matrix or Vector3, without the need to add a specific item to the array.

New Operators and Compounds

Here is a list of the new operators and compounds available in MCG.

3ds Max Nodes

  • GetRayToSurfaceIntersections(nodes, rayToSurfacePivot, rayOrigin, flipAxis, rayAxis)

  • MeshFromNodeAtTime(n, time)

  • NodePosAverage(values)

  • WeightedAveragePosition(Targets, Weights)

  • WorldTransformAtTime(node, time)

3ds Max Time

  • AnimationPlaybackEnd()

  • AnimationStartTime()

  • FramesToSeconds(frames)

  • FramesToTicks(frames)

  • SecondsToFrames(seconds)

  • SecondsToTicks(seconds)

  • TicksToFrames(ticks)

  • TicksToSeconds(ticks)

Array

  • BitmapEmptyArray()

  • BooleanEmptyArray()

  • BoundingBoxEmptyArray()

  • BoundingFrustumEmptyArray()

  • BoundingSphereEmptyArray()

  • ConstraintEmptyArray()

  • EdgeEmptyArray()

  • Face3EmptyArray()

  • Face4EmptyArray()

  • INodeEmptyArray()

  • Int32EmptyArray()

  • LineEmptyArray()

  • MapChannelEmptyArray()

  • MatrixEmptyArray()

  • PlaneEmptyArray()

  • QuadMeshEmptyArray()

  • QuaternionEmptyArray()

  • RandomEmptyArray()

  • RayEmptyArray()

  • RayTraceIntersectionEmptyArray()

  • RayTraceSceneEmptyArray()

  • RectangleEmptyArray()

  • RigidBodyDynamicsEmptyArray()

  • SingleEmptyArray()

  • StringEmptyArray()

  • TexmapEmptyArray()

  • TriMeshEmptyArray()

  • Vector3EmptyArray()

  • WorldEmptyArray()

Bullet Physics

  • AddBulletObject(world, worldObject)

  • AddConstraint(world, constraint)

  • AddRigidBody(world, rigidBody)

  • CreateGeneric6DofConstraint(rigidBody1, frame1, rigidBody2, frame2, rotationOrder)

  • CreatePoint2PointConstraint(rigidBody1, pivot1, rigidBody2, pivot2, tau, damping)

  • CreatePointConstraint(rigidBody, pivot, tau, damping)

  • CreateRigidBody(xform, offset, convexHull, rigidBodyDynamics, localInertia, isKinematic)

  • CreateRigidBodyDynamics(mass, friction, rollingFriction, restitution, linearDamping, angularDamping)

  • CreateWorld(initialTime)

  • GetCenterOfMass(convexHull)

  • GetNumberOfRigidBodies(world)

  • GetRigidBodyByIndex(world, index)

  • GetRigidBodyConvexHull(rb)

  • GetRigidBodyWorldTransform(world, rb)

  • GetSimulationTime(world)

  • IsRigidBodyKinematic(rb)

  • ResetWorld(world)

  • SetGeneric6DofConstraintAngularDynamics(constraint, damping, bounce, stiffness)

  • SetGeneric6DofConstraintAngularLimit(constraint, lower, upper, reversed)

  • SetGeneric6DofConstraintLinearDynamics(constraint, damping, bounce, stiffness)

  • SetGeneric6DofConstraintLinearLimit(constraint, lower, upper)

  • AddConstraint(world, constraint)

  • SetGravity(world, gravity)

  • SetRigidBodyVelocity(rb, linear, angular)

  • SetRigidBodyWorldTransform(world, rb, m)

  • SetSimulationTime(world, time)

  • StepSimulation(world, step)

  • TraceRigidBody(world, rb)

Compounds

  • CreateSimulation(constraints, rigidBodies, startTime, gravity, active, preUpdateFn, currentTime)

  • FilterAndSortRayIntersections(intersections, rays)

Control flow

  • IfSingleGreaterThanZero(Value, True, False)

  • LimitSingle(Value, LimitOne, LimitTwo)

  • SwitchOneTwoThree(switchValue, valueIfOne, valueIfTwo, valueIfThree)

Geometry - Matrix

  • CanDecompose(matrix)

  • ConstructBasisFromUpFwd(upAxis, targetUp, forwardAxis, targetForward)

  • Determinant(matrix)

  • FlipMatrixBasis(matrix)

  • GetMatrixRotation(matrix)

  • GetMatrixScaling(matrix)

  • SetMatrixFrom3Rows(Row1, Row2, Row3)

Geometry - Ray

  • RayFromMatrices(origin, destination)

  • RayFromMatrixAxis(origin, flipAxis, axis)

  • RayIntersectsBox(ray, box)

  • RayIntersectsPlane(ray, plane)

  • RayIntersectsSphere(ray, sphere)

Geometry - TriMesh

  • GetMapChannel(mesh, id)

  • GetMapChannelName(id)

Geometry - Vector4

  • QuaternionToVector4(q)

  • Vector4(x, y, z, w)

  • Vector4ToQuaternion(v)

  • Vector4W(v)

  • Vector4X(v)

  • Vector4Y(v)

  • Vector4Z(v)

Geometry - Vectors

  • NormalizedCross(v1, v2)

  • NormalizedCrossWithFlip(Flip, VecOptFlipped, Vec2)

  • PerpToVecInPlane2ndVec(Flip, Vec, Vec2FirstCross)

  • VecNegateIf(Condition, Vec)

Implicit parameters

  • Reference Maker: ReferenceMaker()

  • Time: Int32()

  • Transform Controller: Matrix()

Inputs

  • Input: cache()

  • Input: Constraint()

  • Input: RigidBodyDynamics()

  • Input: World()

Outputs

  • Output: Color Controller(value)

  • Output: Float Controller(value)

  • Output: Point3 Controller(value)

  • Output: Point4 Controller(value)

  • Output: Position Controller(value)

  • Output: Rotation Controller(value)

  • Output: Scale Controller(value)

  • Output: Transform Controller(value)

Parameters

  • Parameter: IArray<INode>()

  • Parameter: IArray<Single>()

  • Parameter: Vector3()

Pass-through

  • Pass-through: cache(x)

  • Pass-through: Constraint(x)

  • Pass-through: RigidBodyDynamics(x)

  • Pass-through: World(x)

Tuple

  • NodeSingleTupleFirst(Tuple2)

  • NodeSingleTupleSecond(Tuple2)