# Custom Solvers/Deformers

mGear custom C++ Solvers/Deformers Documentation

## mgear_add10Scalar

Add 10 scalar values. This node is deprecated. Only kept for backwards compatibility reasons.

## mgear_curveCns

Generate a curve based on the input positions. This is used in the Shifter guides to create the visual connections with the guide locations.

## mgear_ikfk2Bone

IK FK 2 bones chain solver.

Mainly used for legs and arms. The solver encapsulate many functions that will be very complex and expensive to evaluate using vanilla Maya nodes and other techniques like expressions.

Some of the features are, soft IK, reverse IK, squash, stretch, independent bone length, slide and roll.

**Blend:**IK fk blend**Length A:**Rest length of the bone A (Arm)**Length B:**Rest length of the bone B (Forearm)**Negate:**Negate the solver direction (i.e: the right side arm negates the direction)**Scale A:**Length multiplier for the arm.**Scale B:**Length multiplier for the forearm.**Roll:**Roll value. This value is complementarity to the Up Vector control.**Max stretch:**Maximum stretching value for the IK behavior. Value 1 will represent the original size and not scale.**Slide:**Slide the elbow position between the lengths of the arm and forearm. Value of .5 represents the middle point, whatever the proportions ratio is between the arm and forearm.**Reverse:**Reverse the IK solver direction. (i.e: human leg vs Chicken leg)**root:**Matrix. Root of the component world matrix**ikref:**Matrix. IK control world matrix**upv:**Matrix. Up vector control world matrix**FK0:**Matrix. FK arm control world matrix**FK1:**Matrix. FK forearm control world matrix**FK2:**Matrix. FK hand control world matrix**in A parent:**Matrix. Output bone A parent matrix (arm)**in B parent:**Matrix. Output bone A parent matrix (forearm)**in Center parent:**Matrix. Output elbow parent matrix**in Eff parent:**Matrix. Output effector parent matrix (hand)**out A:**Matrix. Output world matrix for bone A (arm)**out B:**Matrix. Output world matrix for bone B (forearm)**out Center:**Matrix. Output world matrix for elbow**out Eff:**Matrix. Output world matrix for effector (hand)

## mgear_intMatrix

Interpolate between 2 input matrix using a blend value. The rotation is calculated in quaternion.

**Blend:**Blend between the 2 input matrix**Matrix A:**Input Matrix**Matrix B:**Input Matrix**Output:**Output Matrix

## mgear_inverseRotOrder

Invert the rotation order. For example and input of “XYZ” will output ZYX. This is very useful when you need to negate an animated rotation order to avoid gimbal.

**Rot Order:**Rotation order to invert

## mgear_linearInterpolate3Dvector

Interpolate between 2 input vector using a blend value. i.e: the XYZ position of 2 transforms.

**Blend:**Blend between the 2 input matrix**Vector A:**Input Vector**Vector B:**Input Vector**Out Vector:**Output Vector

## mgear_mulMatrix

Multiply 2 input matrix. The only advantage between this node and the default one, is that with this you can visualize the values in the attribute editor. With the default Maya’s multMatrix node the values are not visible, this make very difficult debugging rigs in some situations. For the rest are exactly the same and interchangeable. In terms of performance there is not noticeable difference.

**Matrix A:**Input Matrix**Matrix B:**Input Matrix**Output:**Output Matrix

## mgear_percentageToU

Converts a percentage values to a curve U value.

**Curve:**Input curve.**Normalized U:**If active will normalize U value between 0 and 1.**Percentage:**Percentage value.**Steps:**Interpolation steps.

## mgear_rayCastPosition

Raycast the contact position using a vector from 2 position inputs The operation is set using Matrix, but usually we will use it only to get the position.

**Mesh Input:**Contact Mesh.**Ray Source:**Matrix. starting position for the vector**Ray Direction:**Matrix. Aim position for the vector**Output:**Output Matrix with the position on the Contact Mesh

## mgear_rollSplineKine

Roll Spline kinematic is a Bezier curve style with roll support. This solver is used in several Shifter components. Mainly arms and legs. This will be the equivalent of or similar to a ribbon setup, with the advantage of been much more lightweight at evaluation time. Every input transform (world matrix plug) represents a point in the Bezier curve. And the scale in X axis of each transform represents the length of the Bezier tangents. The main limitation is that the 2 tangents are always of the same length for each point. In order to workaround this you can use 2 transforms in the same position. One representing each tangent, so the scale can be control independently. Each mgear_rollSplineKine node, outputs only one point in the U value of the curve.

**Ctl Input:**Array of Matrix. Input control points parent matrix.**inputs:**Array of Matrix. Transform controls world matrix**inputs Roll:**Array of Rotations. Transform controls rotation.**Output Parent:**Output transform parent Matrix.**U:**U percentage position represented from 0 to 1. NOTE: Usually the value should be always between 0.0001 and 0.999. The most extreme values are not taking in consideration the tangency for the output transform.**Resample:**Resample the output curve.**Subdiv:**Number of subdivision in the curve. Higher values will create a smoother curve but slower evaluation. Small values will create a more stepped curve, this can cause artifacts when sliding a transform on the U value. NOTE: Also, can have a little discordance between the same component in the left and right side. Due inversion of the direction. Usually the solution is simple as increase the subdivision.

**Absolute:**Change the way that the subdivision are distributed in the curve.**Output:**Output transform Matrix.

## mgear_slideCurve

Deform a curve, sliding it on top of other. i.e: It is used in the Shifter spine component. Use this function to apply the deformer: mgear.core.applyop.gear_curveslide2_op

**Master Crv:**Input Curve.**Master Mat:**Master curve matrix.**Slave Length:**Slave curve length.**Master Length:**Master curve length.**Position:**Slave curve position.**Max stretch:**Maximum stretch of the slave curve.**Max squash:**Maximum squash of the slave curve.**Softness:**Soft clamping for squash and stretch.

## mgear_spinePointAt

Point at an axis direction base in 2 input rotations. Note: This solver was design to handle the spine twist, but currently is not used in any component.

**Rot A:**Input rotation A.**Rot B:**Input rotation B.**Axe:**Aim axis.**Blend:**Blend value between the 2 rotations

## mgear_springNode

Spring dynamic solver based in goal position.

**Goal:**Position goal.**Time:**Current time input.**Stiffness:**Stiffness value.**Damping:**Damping value.**Intensity:**Intensity value.

## mgear_squashStretch_attr

Squash and stretch solver.

**Global Scale:**Global scale reference.**Blend:**Blend to deal down the squash and stretch effect.**Driver:**Driver rest value.**Driver Min:**Driver minimum value where the squash and stretch effect will be calculated.**Driver ctr:**Driver control value.**Driver Max:**Driver maximum value where the squash and stretch effect will be calculated.**Axis:**Axis along the squash and stretch value will be calculated.**Squash:**Multiplication value for the squash direction.**Stretch:**Multiplication value for the stretch direction.

## mgear_trigonometyAngle

Sine and cosine trigonometry node

**Operation:**Sine or Cosine.**Angle:**Input angle.

## mgear_vertexPosition

Get the world position of a given vertex

**Input Shape:**Input mesh shape.**Vertex:**Vertex index number to track.**Output:**Output position.**Driven parent invert Matrix:**Driven parent invert matrix.