Methods to enable averaging multiple transform matrices - part 2

I wrote some methods to enable weighted averaging of multiple transform matrices in order to obtain a transform which is the "weighted midway" between the given transforms. To achieve this, translations/scales are lerped and rotations are slerped. By definition, more than two Quaternions are slerped by:

```
(q_1^w_1)*(q_2^w_2)* ... *(q_n^w_n)
```

where `w_i` sum to 1. This is particularly useful when transform information from multiple observers must be combined into a single one. 

An example usage is the following, where the red cone's transform is the equal weight average of the green cones' transforms; green cones are scaled by 1, 1.5 and 2 respectively, they are not closer to the screen than one another:
![average](https://cloud.githubusercontent.com/assets/1974284/2985238/e6636a54-dc3a-11e3-95ea-70a4fab04d02.png)
The code that generates these cones is:
```
Model cone = modelBuilder.createCone(20f, 20f, 20f, 20, 
    new Material(ColorAttribute.createDiffuse(Color.GREEN)), Usage.Position | Usage.Normal);
		
ModelInstance cone1 = new ModelInstance(cone);
Quaternion q1 = new Quaternion().setEulerAngles(-10, 60, 0);
Matrix4 tf1 = new Matrix4(new Vector3(-35,-35,100),q1,new Vector3(1,1,1));
cone1.transform.set(tf1);
		
ModelInstance cone2 = new ModelInstance(cone);
Quaternion q2 = new Quaternion().setEulerAngles(-30, 10, -45);
Matrix4 tf2 = new Matrix4(new Vector3(35,-35,100),q2,new Vector3(1.5f,1.5f,1.5f));
cone2.transform.set(tf2);
		
ModelInstance cone3 = new ModelInstance(cone);
Quaternion q3 = new Quaternion().setEulerAngles(0, 40, 20);
Matrix4 tf3 = new Matrix4(new Vector3(35,35,100),q3,new Vector3(2,2,2));
cone3.transform.set(tf3);
		
Model resultCone = modelBuilder.createCone(20f, 20f, 20f, 20, 
    new Material(ColorAttribute.createDiffuse(Color.RED)), Usage.Position | Usage.Normal);
ModelInstance resultCone1 = new ModelInstance(resultCone);
Matrix4[] tfList = new Matrix4[]{tf1,tf2,tf3};//,tf4};
Matrix4 resultTf = new Matrix4().avg(tfList);
resultCone1.transform.set(resultTf);

modelBatch.begin(cam);
modelBatch.render(cone1,environment);
modelBatch.render(cone2,environment);
modelBatch.render(cone3,environment);
modelBatch.render(resultCone1,environment);
modelBatch.end();
```

Changes from part 1: Problem was related to #1859, it is taken into account now.