# James Dunlop Homepage

# Maya 2 Point HermiteSpline - Part 01

## PREFACE:

Over the last year in my spare time I've been doing some investigations in getting a couple of nodes worked
out at home.

As it turned out, I haven't had a lot of spare time, as last year the show I was on was pretty challenging
time wise etc.

So this year I thought I'd back track a little through my code and wth while I'm at it throw up a post or 2 about
what I've been up to re looking into getting these nodes up and running [for better or for worse!]

DISCLAIMER: I'm still pretty new to c++ so I wouldn't rely "too heavily on the code snippets etc. But the nodes are performing/
behaving pretty well at the moment for me.

**
I should also highlight that I had *NO* idea about hermite stuff before I worked with Raffaele
at Animal Logic.
**

If you're interested in rigging by first principles I highly reccomend you head over to
Cult of Rig and watch Raf's streams.

These are packed full of good info and you can flick him a few bucks via patreon to show support!

### Why hermite?

Well you can do some pretty cool things with a well written node. Some of the things but not limited to;
Running the hermite curve down the arms and legs for twist
Length preservation along ropes etc
General deformation in areas like the face etc

### What was my initial goal?

To investigate the creation of a node in Maya to take 2 inputs and ouput #n of output transforms(to drive joints) that
represent a hermite spline with twist to use in rigs.
To try to make sure this can be run in parallel in Maya.
Extend this node to handle and array of inputs to define the curve.

### What were(are) my hurdles?

Little to no C++ experience (In maya or out of)
No idea about hermite math / math in general / curves!

## What is a hermite?

Hermite interpolation is a way to define a curve. We can use this interpolation to create a new type of curve in maya for use in
rigging. Therefore;

First up I had to look into and try to figure out what the heck a hermite was from a math stand point!

Wikipedia states:

*"In numerical analysis, Hermite interpolation, named after Charles Hermite, is a method of interpolating data
points as a polynomial function."*

But sweet baby jesus it gets confusing fairly quickly on wikipedia.

When looking further into this, I found cubic.org; which states:

*"To calculate a hermite curve you need the following vectors:*

P1: the startpoint of the curve

T1: the tangent (e.g. direction and speed) to how the curve leaves the startpoint

P2: the endpoint of the curve

T2: the tangent (e.g. direction and speed) to how the curves meets the endpoint

...and the base functions for the hermite are:

h1(t) = 2t^3 - 3t^2 + 1

h2(t) = -2t^3 + 3t^2

h3(t) = t^3 - 2t^2 + t

h4(t) = t^3 - t^2

**Note: I changed s to t to represent (t)ime.**

These 4 vectors are simply multiplied with 4 hermite basis functions and added together."

Brilliant! Someone broke it down to some fairly straight forward (math) basics. Much <3!!

Essentially, because to begin with I have reduced the problem down to just 2 input points we can start at point1's position in
worldSpace and end at point2's position in world space. Thus t0 = p1 and t1 = p2.

So what does this mean for the node?

At it's most basic form, we need to create a node in maya with just 2 inputs...
get their positions (p1, p2)
and 2 tangents T1, T2 [and for simplicity use a specific axis from each point as these tangents].
since length is going to be 1 we can work out the increment (time intervals
for the outputs) by dividing the length by the number of outputs minus 1.

increment = length / outputCount-1.

This should give us a 2point hermite curve with a UNIFORM distribution of the outputs along the curve.

Seems easy enough!? Right?