2017-05-01 20:13:22 -07:00

2631 lines
52 KiB
Markdown

---
layout: docs
title: Math
categories: [Documentation]
---
Script: Math {#Math}
===========================
The Math script provides `Vec3`, `Mat4` and `Quat` classes to manage three dimensional vectors, four by four matrices and quaternions respectively.
### Generics:
One very interesting thing to point about the Math script is that all `Vec3`, `Mat4` and `Quat` methods are generics. This means that all
instance methods of `Vec3`, `Mat4`, and `Quat` can also be accessed as static methods in which the first parameter of the static method is the receiver.
The receiver does not *have to be* an instance of the class but can instead be a `Vec3`-like, `Mat4`-like or `Quat`-like object.
This means that a simple array (i.e `[]`) can be used as the receiver for these methods.
Although the *syntax* section for each method will include the generic and non-generic one, the arguments for each method will be described as with the instance
method syntax.
### Chainable Methods:
All methods that do not return something in particular in the math package are chainable.
### Conventions:
Say you want to add two `Vec3` vectors, `v1` and `v2`. Then there are three ways of performing this operation:
1. `v1.add(v2)` Returns a new instance with the result of adding `v1` and `v2`. This operation does not modify `v1` or `v2`.
2. `v1.$add(v2)` Returns the result of adding `v1` to `v2`, but it alters `v1` updating it with the result.
3. `vResult.add2(v1, v2)` Stores the result of adding `v1` to `v2` in `vResult`, another `Vec3` instance.
These are the conventions we will be using for method naming. Methods altering the receiver will have a dollar sign (i.e. `$`), as opposed to
methods creating a new instance with the result. Methods requiring a receiver *and* the instances involved in the operation as formal parameters
will be suffixed with the number `2`.
### Notes:
All classes extend from `Array` or some
`DataView` class (i.e. some typed array). This means that `Vec3`, `Mat4`
and `Quat`-like objects are plain arrays and not plain objects. Getters
have been added for all properties in `Vec3`, `Mat4` and `Quat`
classes so you can still access them via `vec.x`, etc, but remember
that the inner implementation is an array, so `vec3[0]` will also
work.
Class: Vec3 {#Vec3}
===========================
A class to handle three dimensional vectors.
Vec3 Static Method: fromQuat {#Vec3:fromQuat}
-----------------------------------------------
Create a new `Vec3` instance from the `x`, `y`, `z` coordinates of a [Quat](#Quat).
### Syntax:
Vec3.fromQuat(q);
### Arguments:
1. q - (*object*) A `Quat` instance.
### Examples:
Create a vector from a Quaternion.
{% highlight js %}
var q = new Quat(1, 2, 3, 4),
v = Vec3.fromQuat(q); //Vec3(1, 2, 3)
{% endhighlight %}
Vec3 Method: constructor {#Vec3:constructor}
----------------------------------------------------
Creates a new `Vec3` instance.
### Syntax:
var v = new Vec3(x, y, z);
### Arguments:
1. x - (*number*, optional) The x component. If not provided is 0.
2. y - (*number*, optional) The y component. If not provided is 0.
3. z - (*number*, optional) The z component. If not provided is 0.
### Examples:
Create a (0, 0, 0) vector.
{% highlight js %}
var v = new Vec3();
{% endhighlight %}
Create a (1, 2, 3) vector.
{% highlight js %}
var v = new Vec3(1, 2, 3);
{% endhighlight %}
Vec3 Method: setVec3 {#Vec3:setVec3}
------------------------------------
Set `x`, `y`, `z` coordinates of one `Vec3` into another `Vec3`.
### Syntax:
v1.setVec3(v2);
Vec3.setVec3(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and assign one vectors components to the other one.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.setVec3(v2); //v1 now contains (x=4, y=5, z=6)
{% endhighlight %}
Set an object's `x`, `y`, `z` components to another object.
{% highlight js %}
var v1 = [],
v2 = [ 4, 5, 6 ];
Vec3.setVec3(v1, v2); //v1 now has [4, 5, 6]
{% endhighlight %}
Vec3 Method: set {#Vec3:set}
-------------------------------
Set `x`, `y`, `z` coordinates.
### Syntax:
v1.set(x, y, z);
Vec3.set(v1, x, y, z);
### Arguments:
1. x - (*number*) The x coordinate.
2. y - (*number*) The y coordinate.
3. z - (*number*) The z coordinate.
### Examples:
Create two vectors and assign one vectors components to the other one.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.set(v2.x, v2.y, v2.z); //v1 now contains (x=4, y=5, z=6)
{% endhighlight %}
Set an object's `x`, `y`, `z` components to another object.
{% highlight js %}
var v1 = [],
v2 = [ 4, 5, 6 ];
Vec3.set(v1, v2.x, v2.y, v2.z); //v1 now has [4, 5, 6]
{% endhighlight %}
Vec3 Method: add {#Vec3:add}
-----------------------------
Adds the `x`, `y`, `z` components of two `Vec3` objects. Creates a new `Vec3` instance and does not modify the original objects.
### Syntax:
v1.add(v2);
Vec3.add(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and add them.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.add(v2); //v1 and v2 are still the same but a new Vec3(5, 7, 9) was created.
{% endhighlight %}
Create two `x`, `y`, `z` objects and add them.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
Vec3.add(v1, v2); //v1 and v2 are still the same but a new Vec3(5, 7, 9) was created.
{% endhighlight %}
Vec3 Method: $add {#Vec3:$add}
------------------------------------
Adds the `x`, `y`, `z` components of two `Vec3` objects. Modifies the original object.
### Syntax:
v1.$add(v2);
Vec3.$add(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and add them.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.$add(v2); //v1 is now Vec3(5, 7, 9).
{% endhighlight %}
Create two `x`, `y`, `z` objects and add them.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
Vec3.$add(v1, v2); //v1 is now [ 5, 7, 9 ].
{% endhighlight %}
Vec3 Method: add2 {#Vec3:add2}
------------------------------------
Adds the `x`, `y`, `z` components of two `Vec3` objects and stores the result in the receiver.
### Syntax:
v1.add2(v2, v3);
Vec3.add2(v1, v2, v3);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
2. v3 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and add them.
{% highlight js %}
var v1 = new Vec3(),
v2 = new Vec3(1, 2, 3),
v3 = new Vec3(4, 5, 6);
v1.add2(v2, v3); //v1 is now Vec3(5, 7, 9), v2 and v3 are unchanged.
{% endhighlight %}
Create two `x`, `y`, `z` objects and add them.
{% highlight js %}
var v1 = [],
v2 = [ 1, 2, 3 ],
v3 = [ 4, 5, 6 ];
Vec3.add2(v1, v2, v3); //v2 and v3 are still the same but v1 is [ 5, 7, 9 ].
{% endhighlight %}
Vec3 Method: sub {#Vec3:sub}
------------------------------------
Substracts the `x`, `y`, `z` components of two `Vec3` objects. Creates a new `Vec3` instance and does not modify the original objects.
### Syntax:
v1.sub(v2);
Vec3.sub(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and substract them.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.sub(v2); //v1 and v2 are still the same but a new Vec3(-3, -3, -3) was created.
{% endhighlight %}
Create two `x`, `y`, `z` objects and substract them.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
Vec3.sub(v1, v2); //v1 and v2 are still the same but a new Vec3(-3, -3, -3) was created.
{% endhighlight %}
Vec3 Method: $sub {#Vec3:$sub}
------------------------------------
Substracts the `x`, `y`, `z` components of two `Vec3` objects. Modifies the original object.
### Syntax:
v1.$sub(v2);
Vec3.$sub(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and substract them.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.$sub(v2); //v1 is now Vec3(-3, -3, -3).
{% endhighlight %}
Create two `x`, `y`, `z` objects and add them.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
Vec3.$sub(v1, v2); //v1 is now [ -3, -3, -3 ].
{% endhighlight %}
Vec3 Method: sub2 {#Vec3:sub2}
------------------------------------
Substracts the `x`, `y`, `z` components of two `Vec3` objects and stores the result in the receiver.
### Syntax:
v1.sub2(v2, v3);
Vec3.sub2(v1, v2, v3);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
2. v3 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and substract them.
{% highlight js %}
var v1 = new Vec3(),
v2 = new Vec3(1, 2, 3),
v3 = new Vec3(4, 5, 6);
v1.sub2(v2, v3); //v1 is now Vec3(-3, -3, -3), v2 and v3 are unchanged.
{% endhighlight %}
Create two `x`, `y`, `z` objects and substract them.
{% highlight js %}
var v1 = [],
v2 = [ 1, 2, 3 ],
v3 = [ 4, 5, 6 ];
Vec3.sub2(v1, v2, v3); //v2 and v3 are still the same but v1 is { x: -3, y: -3, z: -3 }.
{% endhighlight %}
Vec3 Method: scale {#Vec3:scale}
------------------------------------
Scales the Vec3 vector by a real number. Creates a new Vec3 with the scaled components.
### Syntax:
v1.scale(s);
Vec3.scale(v1, s);
### Arguments:
1. s - (*number*) A real number to scale the Vec3.
### Examples:
Create a vector and scale it by 2.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
v1.scale(2); //v1 is unchanged but a new Vec3(2, 4, 6) is created.
{% endhighlight %}
Create an `x`, `y`, `z` object and scale it by 2.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
Vec3.scale(v1, 2); //v1 is still the same but a new Vec3(2, 4, 6) was created.
{% endhighlight %}
Vec3 Method: $scale {#Vec3:$scale}
------------------------------------
Scales the Vec3 vector by a real number. Changes the original object.
### Syntax:
v1.$scale(s);
Vec3.$scale(v1, s);
### Arguments:
1. s - (*number*) A real number to scale the Vec3.
### Examples:
Create a vector and scale it by 2.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
v1.$scale(2); //v1 is now Vec3(2, 4, 6).
{% endhighlight %}
Create an `x`, `y`, `z` object and scale it by 2.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
Vec3.$scale(v1, 2); //v1 is now [ 2, 4, 6 ].
{% endhighlight %}
Vec3 Method: neg {#Vec3:neg}
------------------------------------
Negates a `Vec3`. Returns a new instance.
### Syntax:
v1.neg();
Vec3.neg(v1);
### Examples:
Create a vector and negate it.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
v1.neg(); //v1 is unchanged but a new Vec3(-1, -2, -3) is created.
{% endhighlight %}
Create an `x`, `y`, `z` object and negate it.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
Vec3.neg(v1); //v1 is still the same but a new Vec3(-1, -2, -3).
{% endhighlight %}
Vec3 Method: $neg {#Vec3:$neg}
------------------------------------
Negates a `Vec3`. Changes the original object.
### Syntax:
v1.$neg();
Vec3.$neg(v1);
### Examples:
Create a vector and negate it.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
v1.$neg(); //v1 is now Vec3(-1, -2, -3).
{% endhighlight %}
Create an `x`, `y`, `z` object and negate it.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
Vec3.neg(v1); //v1 is now [ -1, -2, -3 ].
{% endhighlight %}
Vec3 Method: unit {#Vec3:unit}
------------------------------------
Creates a unit vector from the coordinates of `Vec3`.
### Syntax:
v1.unit();
Vec3.unit(v1);
### Examples:
Create a vector and make a unit vector from it.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
v1.unit(); //v1 is unchanged but a new unit vector Vec3 is created.
{% endhighlight %}
Create an `x`, `y`, `z` object and make a unit vector from it.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
Vec3.unit(v1); //v1 is still the same but a new Vec3 that is a unit vector is created.
{% endhighlight %}
Vec3 Method: $unit {#Vec3:$unit}
------------------------------------
Creates a unit vector from the `Vec3` coordinates. Changes the original object.
### Syntax:
v1.$unit();
Vec3.$unit(v1);
### Examples:
Create a vector and make a unit vector from it.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
v1.$unit(); //v1 is now a unit vector.
{% endhighlight %}
Create an `x`, `y`, `z` object make a unit vector from it.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
Vec3.$unit(v1); //v1 is now a unit vector object.
{% endhighlight %}
Vec3 Method: cross {#Vec3:cross}
------------------------------------
Makes a cross product of two `Vec3` instances. Creates a new `Vec3` and does not modify the original objects.
You can find more information about the cross product [here](http://en.wikipedia.org/wiki/Cross_product).
### Syntax:
v1.cross(v2);
Vec3.cross(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and make a cross product.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.cross(v2); //v1 and v2 are still the same but a new Vec3 was created with the result.
{% endhighlight %}
Create two `x`, `y`, `z` objects and make a cross product.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
//v1 and v2 are still the same but a new Vec3 with the result was created.
var ans = Vec3.cross(v1, v2);
{% endhighlight %}
Vec3 Method: $cross {#Vec3:$cross}
------------------------------------
Makes a cross product of two `Vec3` instances. Modifies the original object.
You can find more information about the cross product [here](http://en.wikipedia.org/wiki/Cross_product).
### Syntax:
v1.$cross(v2);
Vec3.$cross(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and make a cross product.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.$cross(v2); //v1 contains now the result.
{% endhighlight %}
Create two `x`, `y`, `z` objects and make a cross product.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
//v1 contains now the result.
var ans = Vec3.$cross(v1, v2);
{% endhighlight %}
Vec3 Method: distTo {#Vec3:distTo}
------------------------------------
Calculates the distance between two `Vec3`.
### Syntax:
v1.distTo(v2);
Vec3.distTo(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and calculate the distance.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.distTo(v2); //a real value with the distance is returned.
{% endhighlight %}
Create two `x`, `y`, `z` objects and calculate their distance.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
//a real number with the distance is returned.
var ans = Vec3.distTo(v1, v2);
{% endhighlight %}
Vec3 Method: distToSq {#Vec3:distToSq}
------------------------------------
Calculates the squared distance between two `Vec3`.
### Syntax:
v1.distToSq(v2);
Vec3.distToSq(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and calculate the squared distance.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.distToSq(v2); //a real value with the squared distance is returned.
{% endhighlight %}
Create two `x`, `y`, `z` objects and calculate their squared distance.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
//a real number with the squared distance is returned.
var ans = Vec3.distToSq(v1, v2);
{% endhighlight %}
Vec3 Method: norm {#Vec3:norm}
------------------------------------
Calculates the norm of `Vec3`.
### Syntax:
v1.norm();
Vec3.norm(v1);
### Examples:
Create a vector and calculate its norm.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
vi.norm(); //returns the real valued norm.
{% endhighlight %}
Create an `x`, `y`, `z` object and calculate its norm.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
//A real number with the norm is returned.
var ans = Vec3.norm(v1);
{% endhighlight %}
Vec3 Method: normSq {#Vec3:normSq}
------------------------------------
Calculates the squared norm of `Vec3`.
### Syntax:
v1.normSq();
Vec3.normSq(v1);
### Examples:
Create a vector and calculate its squared norm.
{% highlight js %}
var v1 = new Vec3(1, 2, 3);
vi.normSq(); //returns the real valued norm.
{% endhighlight %}
Create an `x`, `y`, `z` object and calculate its squared norm.
{% highlight js %}
var v1 = [ 1, 2, 3 ];
//A real number with the squared norm is returned.
var ans = Vec3.normSq(v1);
{% endhighlight %}
Vec3 Method: dot {#Vec3:dot}
------------------------------------
Calculates the dot product between two `Vec3`. You can find more information about the
dot product [here](http://en.wikipedia.org/wiki/Dot_product).
### Syntax:
v1.dot(v2);
Vec3.dot(v1, v2);
### Arguments:
1. v2 - (*object*) A `Vec3` instance.
### Examples:
Create two vectors and calculate the dot product.
{% highlight js %}
var v1 = new Vec3(1, 2, 3),
v2 = new Vec3(4, 5, 6);
v1.dot(v2); //a real value with the dot product is returned.
{% endhighlight %}
Create two `x`, `y`, `z` objects and calculate the dot product.
{% highlight js %}
var v1 = [ 1, 2, 3 ],
v2 = [ 4, 5, 6 ];
//a real number with the dot product is returned.
var ans = Vec3.dot(v1, v2);
{% endhighlight %}
Vec3 Method: clone {#Vec3:clone}
------------------------------------
Clones a vector.
### Syntax:
v1.clone();
Vec3.clone(v1);
Class: Mat4 {#Mat4}
===========================
A class to handle four by four matrices.
Mat4 Static Method: fromQuat {#Mat4:fromQuat}
-----------------------------------------------
Create a new `Mat4` instance from a [Quat](#Quat) instance. The
Quaternion must be a unit quaternion.
### Syntax:
Mat4.fromQuat(q);
### Arguments:
1. q - (*object*) A `Quat` instance.
### Examples:
Create a matrix from a Quaternion.
{% highlight js %}
var q = new Quat(1, 2, 3, 4).$unit(),
m = Mat4.fromQuat(q); //a new Mat4 instance
{% endhighlight %}
Mat4 Method: constructor {#Mat4:constructor}
----------------------------------------------
Creates a new `Mat4` instance. If no arguments are set then an Identity matrix is created.
### Syntax:
var m = new Mat4();
var m = new Mat4(n11, n12, n13, n14,
n21, n22, n23, n24,
n31, n32, n33, n34,
n41, n42, n43, n44);
### Arguments:
1. n - (*number*) The matrix component.
### Examples:
Create an identity matrix.
{% highlight js %}
var m = new Mat4();
{% endhighlight %}
Create a null matrix.
{% highlight js %}
var m = new Mat4( 0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0 );
{% endhighlight %}
Mat4 Method: id {#Mat4:id}
---------------------------
Modifies the matrix to be an Identity matrix.
### Syntax:
m.id();
Mat4.id(m);
### Examples:
Create an identity matrix from some random matrix.
{% highlight js %}
var m = new Mat4( 1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4 );
m.id(); //m is now the Identity matrix.
{% endhighlight %}
Create an identity matrix object.
{% highlight js %}
var m = [];
Mat4.id(m); //m object components are the Identity matrix ones.
{% endhighlight %}
Mat4 Method: set {#Mat4:set}
-------------------------------
Set all matrix coordinates.
### Syntax:
m.set(n11, n12, n13, n14,
n21, n22, n23, n24,
n31, n32, n33, n34,
n41, n42, n43, n44);
Mat4.set(m, n11, n12, n13, n14,
n21, n22, n23, n24,
n31, n32, n33, n34,
n41, n42, n43, n44);
### Arguments:
1. n - (*number*) The n matrix coordinates.
### Examples:
Create a matrix and set some values to it.
{% highlight js %}
var m = new Mat4();
m.set(1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4);
{% endhighlight %}
Set an empty object matrix coordinates onto some values.
{% highlight js %}
var m = [];
Mat4.set(m, 1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4,
1, 2, 3, 4);
{% endhighlight %}
Mat4 Method: mulVec3 {#Mat4:mulVec3}
-------------------------------------
Multiplies a `Mat4` by a `Vec3`. Returns a new `Vec3` without modifying the passed in object.
### Syntax:
m.mulVec3(v);
Mat4.mulVec3(m, v);
### Arguments:
1. v - (*object*) A `Vec3` instance.
### Examples:
Create a matrix and a vector and multiply them.
{% highlight js %}
var m = new Mat4(),
v = new Vec3(1, 1, 1);
m.mulVec3(v);
{% endhighlight %}
Create a matrix object and a vector object and multiply them.
{% highlight js %}
var m = [],
v = [];
Mat4.id(m);
Vec3.set(v, 1, 1, 1);
Mat4.mulVec3(m, v);
{% endhighlight %}
Mat4 Method: $mulVec3 {#Mat4:$mulVec3}
-------------------------------------
Multiplies a `Mat4` by a `Vec3`. Modifies the receiver.
### Syntax:
m.$mulVec3(v);
Mat4.$mulVec3(m, v);
### Arguments:
1. v - (*object*) A `Vec3` instance.
### Examples:
Create a matrix and a vector and multiply them.
{% highlight js %}
var m = new Mat4(),
v = new Vec3(1, 1, 1);
m.$mulVec3(v);
{% endhighlight %}
Create a matrix object and a vector object and multiply them.
{% highlight js %}
var m = [],
v = [];
Mat4.id(m);
Vec3.set(v, 1, 1, 1);
Mat4.$mulVec3(m, v);
{% endhighlight %}
Mat4 Method: mulMat4 {#Mat4:mulMat4}
-------------------------------------
Multiplies two `Mat4`. Creates a new `Mat4` with the result and does not modify the original instances.
### Syntax:
m.mulMat4(m1);
Mat4.mulMat4(m, m1);
### Arguments:
1. m1 - (*object*) A `Mat4` instance.
### Examples:
Create two matrices and multiply them.
{% highlight js %}
var m = new Mat4(),
m1 = new Mat4();
m.mulMat4(m1); //the result is a new Identity matrix
{% endhighlight %}
Create a two matrices objects and multiply them.
{% highlight js %}
var m = [],
m1 = [];
Mat4.id(m);
Mat4.id(m1);
Mat4.mulMat4(m, m1);
{% endhighlight %}
Mat4 Method: $mulMat4 {#Mat4:$mulMat4}
-------------------------------------
Multiplies two `Mat4`, storing the result in the receiver.
### Syntax:
m.$mulMat4(m1);
Mat4.$mulMat4(m, m1);
### Arguments:
1. m1 - (*object*) A `Mat4` instance.
### Examples:
Create two matrices and multiply them.
{% highlight js %}
var m = new Mat4(),
m1 = new Mat4();
m.$mulMat4(m1); //the result is stored in m.
{% endhighlight %}
Create a two matrices objects and multiply them.
{% highlight js %}
var m = [],
m1 = [];
Mat4.id(m);
Mat4.id(m1);
Mat4.$mulMat4(m, m1);
{% endhighlight %}
Mat4 Method: mulMat42 {#Mat4:mulMat42}
-------------------------------------
Multiplies two `Mat4`, storing the result in the receiver.
### Syntax:
m.mulMat42(m1, m2);
Mat4.mulMat42(m, m1, m2);
### Arguments:
1. m1 - (*object*) A `Mat4` instance.
2. m2 - (*object*) A `Mat4` instance.
### Examples:
Create two matrices and multiply them.
{% highlight js %}
var m = new Mat4(),
m1 = new Mat4(),
m2 = new Mat4();
m.mulMat42(m1, m2); //the result is stored in m.
{% endhighlight %}
Create a two matrices objects and multiply them.
{% highlight js %}
var m = [],
m1 = [],
m2 = [];
Mat4.id(m1);
Mat4.id(m2);
Mat4.mulMat42(m, m1, m2);
{% endhighlight %}
Mat4 Method: add {#Mat4:add}
-------------------------------------
Adds two `Mat4`. Creates a new `Mat4` with the result and does not modify the original instances.
### Syntax:
m.add(m1);
Mat4.add(m, m1);
### Arguments:
1. m1 - (*object*) A `Mat4` instance.
### Examples:
Create two matrices and add them.
{% highlight js %}
var m = new Mat4(),
m1 = new Mat4();
m.add(m1); //the result is a new matrix
{% endhighlight %}
Create a two matrices objects and add them.
{% highlight js %}
var m = [],
m1 = [];
Mat4.id(m);
Mat4.id(m1);
Mat4.add(m, m1);
{% endhighlight %}
Mat4 Method: $add {#Mat4:$add}
-------------------------------------
Adds two `Mat4`, storing the result in the receiver.
### Syntax:
m.$add(m1);
Mat4.$add(m, m1);
### Arguments:
1. m1 - (*object*) A `Mat4` instance.
### Examples:
Create two matrices and add them.
{% highlight js %}
var m = new Mat4(),
m1 = new Mat4();
m.$add(m1); //the result is stored in m.
{% endhighlight %}
Create a two matrices objects and add them.
{% highlight js %}
var m = [],
m1 = [];
Mat4.id(m);
Mat4.id(m1);
Mat4.$add(m, m1);
{% endhighlight %}
Mat4 Method: transpose {#Mat4:transpose}
-------------------------------------
Transposes a `Mat4` matrix. More info about this operation can be found [here](http://en.wikipedia.org/wiki/Matrix_transpose).
Creates a new `Mat4` with the result.
### Syntax:
m.transpose();
Mat4.transpose(m);
### Examples:
Create a `Mat4` matrix and transpose it.
{% highlight js %}
var m = new Mat4();
m.transpose(); //the result is a new Identity matrix
{% endhighlight %}
Mat4 Method: $transpose {#Mat4:$transpose}
-------------------------------------
Transposes a `Mat4` matrix. More info about this operation can be found [here](http://en.wikipedia.org/wiki/Matrix_transpose).
Modifies the current matrix.
### Syntax:
m.$transpose();
Mat4.$transpose(m);
### Examples:
Create a `Mat4` matrix and transpose it.
{% highlight js %}
var m = new Mat4();
m.$transpose(); //the result is stored in m
{% endhighlight %}
Mat4 Method: rotateAxis {#Mat4:rotateAxis}
-------------------------------------------
Applies a rotation of `theta` by `vec` to a `Mat4` matrix returning the result in a new matrix.
### Syntax:
m.rotateAxis(theta, vec);
Mat4.rotateAxis(m, theta, vec);
### Arguments:
1. theta - (*number*) An angle in radians.
2. vec - (*object*) A `Vec3` (or array).
### Examples:
Create a rotation by `theta` and `v`.
{% highlight js %}
var m = new Mat4(),
v = new Vec3(1, 1, 1);
m.rotateAxis(Math.PI, v); //the result is a new matrix
{% endhighlight %}
Another way of doing the same thing without creating a `Vec3`.
{% highlight js %}
var m = new Mat4(),
v = [ 1, 1, 1 ];
m.rotateAxis(Math.PI, v); //the result is a new matrix
{% endhighlight %}
Mat4 Method: $rotateAxis {#Mat4:$rotateAxis}
-------------------------------------------
Applies a rotation of angle `theta` by vector `vec` to a `Mat4` altering the current matrix.
### Syntax:
m.$rotateAxis(theta, vec);
Mat4.$rotateAxis(m, theta, vec);
### Arguments:
1. theta - (*number*) An angle in radians.
2. vec - (*object*) A `Vec3` (or array).
### Examples:
Create a rotation by `theta` and `v`.
{% highlight js %}
var m = new Mat4(),
v = new Vec3(1, 1, 1);
m.$rotateAxis(Math.PI, v); //the result is in m
{% endhighlight %}
Another way of doing the same thing without creating a `Vec3`.
{% highlight js %}
var m = new Mat4(),
v = [ 1, 1, 1 ];
m.$rotateAxis(Math.PI, v); //the result is in m
{% endhighlight %}
Mat4 Method: rotateXYZ {#Mat4:rotateXYZ}
-------------------------------------------
Applies a rotation of angle `rx` in the x-axis, `ry` in the y-axis and `rz` in the z-axis.
Creates a new `Mat4` with the result.
### Syntax:
m.rotateXYZ(rx, ry, rz);
Mat4.rotateXYZ(m, rx, ry, rz);
### Arguments:
1. rx - (*number*) An angle in radians.
2. ry - (*number*) An angle in radians.
3. rz - (*number*) An angle in radians.
### Examples:
Create a rotation on the x-axis.
{% highlight js %}
var m = new Mat4();
m.rotateXYZ(Math.PI, 0, 0); //the result is a new matrix
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [];
Mat4.id(m);
Mat4.rotateXYZ(m, Math.PI, 0, 0); //creates a new Mat4 with the result.
{% endhighlight %}
Mat4 Method: $rotateXYZ {#Mat4:$rotateXYZ}
-------------------------------------------
Applies a rotation of angle `rx` in the x-axis, `ry` in the y-axis and `rz` in the z-axis.
Alters the matrix.
### Syntax:
m.$rotateXYZ(rx, ry, rz);
Mat4.$rotateXYZ(m, rx, ry, rz);
### Arguments:
1. rx - (*number*) An angle in radians.
2. ry - (*number*) An angle in radians.
3. rz - (*number*) An angle in radians.
### Examples:
Create a rotation on the x-axis.
{% highlight js %}
var m = new Mat4();
m.$rotateXYZ(Math.PI, 0, 0); //alters m
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [];
Mat4.id(m);
Mat4.$rotateXYZ(m, Math.PI, 0, 0); //alters m
{% endhighlight %}
Mat4 Method: translate {#Mat4:translate}
-------------------------------------------
Applies a translation to `Mat4` in the directions `x`, `y` and `z`.
Stores the result in a new `Mat4` instance.
### Syntax:
m.translate(x, y, z);
Mat4.translate(m, x, y, z);
### Arguments:
1. x - (*number*) The amount to be translated in the x direction.
2. y - (*number*) The amount to be translated in the y direction.
3. z - (*number*) The amount to be translated in the z direction..
### Examples:
Create a translation on the x-axis.
{% highlight js %}
var m = new Mat4();
m.translate(10, 0, 0); //the result is a new matrix
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [];
Mat4.id(m);
Mat4.translate(m, 10, 0, 0); //creates a new Mat4 with the result.
{% endhighlight %}
Mat4 Method: $translate {#Mat4:$translate}
-------------------------------------------
Applies a translation to `Mat4` in the directions `x`, `y` and `z`.
Alters the original matrix.
### Syntax:
m.$translate(x, y, z);
Mat4.$translate(m, x, y, z);
### Arguments:
1. x - (*number*) The amount to be translated in the x direction.
2. y - (*number*) The amount to be translated in the y direction.
3. z - (*number*) The amount to be translated in the z direction..
### Examples:
Create a translation on the x-axis.
{% highlight js %}
var m = new Mat4();
m.$translate(10, 0, 0); //the result is in m
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [];
Mat4.id(m);
Mat4.$translate(m, 10, 0, 0); //the result is in m
{% endhighlight %}
Mat4 Method: scale {#Mat4:scale}
-------------------------------------------
Applies scaling to `Mat4` in the directions `x`, `y` and `z`.
Stores the result in a new `Mat4` instance.
### Syntax:
m.scale(x, y, z);
Mat4.scale(m, x, y, z);
### Arguments:
1. x - (*number*) The amount to be scaled in the x direction.
2. y - (*number*) The amount to be scaled in the y direction.
3. z - (*number*) The amount to be scaled in the z direction..
### Examples:
Create a scaling on the x-axis.
{% highlight js %}
var m = new Mat4();
m.scale(10, 0, 0); //the result is a new matrix
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [];
Mat4.id(m);
Mat4.scale(m, 10, 0, 0); //creates a new Mat4 with the result.
{% endhighlight %}
Mat4 Method: $scale {#Mat4:$scale}
-------------------------------------------
Applies scaling to `Mat4` in the directions `x`, `y` and `z`.
Alters the original matrix.
### Syntax:
m.$scale(x, y, z);
Mat4.$scale(m, x, y, z);
### Arguments:
1. x - (*number*) The amount to be scaled in the x direction.
2. y - (*number*) The amount to be scaled in the y direction.
3. z - (*number*) The amount to be scaled in the z direction..
### Examples:
Create a scaling on the x-axis.
{% highlight js %}
var m = new Mat4();
m.$scale(10, 0, 0); //the result is in m
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [];
Mat4.id(m);
Mat4.$scale(m, 10, 0, 0); //the result is in m
{% endhighlight %}
Mat4 Method: invert {#Mat4:invert}
-------------------------------------
Inverts a `Mat4` matrix. The matrix has to be invertible.
Creates a new `Mat4` with the result.
### Syntax:
m.invert();
Mat4.invert(m);
### Examples:
Create a `Mat4` matrix and invert it.
{% highlight js %}
var m = new Mat4();
m.invert(); //the result is a new matrix
{% endhighlight %}
Mat4 Method: $invert {#Mat4:$invert}
-------------------------------------
Inverts a `Mat4` matrix. The matrix has to be invertible.
Modifies the current matrix.
### Syntax:
m.$invert();
Mat4.$invert(m);
### Examples:
Create a `Mat4` matrix and invert it.
{% highlight js %}
var m = new Mat4();
m.$invert(); //the result is stored in m
{% endhighlight %}
Mat4 Method: lookAt {#Mat4:lookAt}
-----------------------------------
Performs a `lookAt` operation on a matrix. Modifies the current matrix.
Ths method is useful when setting a camera matrix class.
For more information about the `lookAt` operation look [here](http://www.euclideanspace.com/maths/algebra/vectors/lookat/index.htm).
### Syntax:
m.lookAt(eye, center, up);
Mat4.lookAt(m, eye, center, up);
### Arguments:
1. eye - (*object*) The eye position as a `Vec3` (or x,y,z object).
2. center - (*number*) The center position as a `Vec3` (or x,y,z object).
3. up - (*number*) The up vector of the "camera" as a `Vec3` (or x,y,z object).
### Examples:
Create a lookAt matrix. The eye is looking at the origin.
{% highlight js %}
var m = new Mat4(),
eye = [ 1, 0, 1 ],
center = [ 0, 0, 0 ],
up = [ 0, 1, 0 ];
m.lookAt(eye, center, up); //the original matrix is modified.
{% endhighlight %}
Another way of doing it with generics:
{% highlight js %}
var m = [],
eye = [ 1, 0, 1 ],
center = [ 0, 0, 0 ],
up = [ 0, 1, 0 ];
Mat4.lookAt(m, eye, center, up); //the original object is modified.
{% endhighlight %}
Mat4 Method: frustum {#Mat4:frustum}
-------------------------------------
Performs a `frustum` operation on a matrix. Modifies the current matrix.
This method is useful when setting a camera projection matrix class.
For more information about the `frustum` geometry look [here](http://en.wikipedia.org/wiki/Frustum).
### Syntax:
m.frustum(left, right, bottom, top, near, far);
Mat4.frustum(m, left, right, bottom, top, near, far);
### Arguments:
1. left - (*number*) The left part of the frustum.
2. right - (*number*) The right part of the frustum.
3. bottom - (*number*) The bottom part of the frustum.
4. top - (*number*) The top part of the frustum.
5. near - (*number*) The nearest part of the frustum.
6. far - (*number*) The furthest part of the frustum.
Mat4 Method: ortho {#Mat4:ortho}
-------------------------------------
Creates an orthographic projection. Modifies the current matrix.
For more information about the `orthographic projection` geometry look [here](http://en.wikipedia.org/wiki/Orthographic_projection).
### Syntax:
m.ortho(left, right, bottom, top, near, far);
Mat4.ortho(m, left, right, bottom, top, near, far);
### Arguments:
1. left - (*number*) The left part of the orthographic projection.
2. right - (*number*) The right part of the orthographic projection.
3. bottom - (*number*) The bottom part of the orthographic projection.
4. top - (*number*) The top part of the orthographic projection.
5. near - (*number*) The nearest part of the orthographic projection.
6. far - (*number*) The furthest part of the orthographic projection.
Mat4 Method: perspective {#Mat4:perspective}
---------------------------------------------
Creates a perspective matrix. This operation is based on creating a frustum matrix. Modifies the current matrix.
This method is useful when setting a camera projection matrix class.
### Syntax:
m.perspective(fov, aspect, near, far);
Mat4.perspective(m, fov, aspect, near, far);
### Arguments:
1. fov - (*number*) The field of view. An angle in degrees.
2. aspect - (*number*) The aspect ratio. Generally `canvas.width / canvas.height`.
3. near - (*number*) The nearest part to be captured by the camera.
4. far - (*number*) The furthest part to be captured by the camera.
Mat4 Method: toFloat32Array {#Mat4:toFloat32Array}
---------------------------------------------------
Converts the matrix in a [Float32Array](https://developer.mozilla.org/en/JavaScript_typed_arrays/Float32Array). Useful when setting matrix uniforms.
### Syntax:
m.toFloat32Array();
Mat4 Method: clone {#Mat4:clone}
------------------------------------
Clones a matrix.
### Syntax:
m.clone();
Mat4.clone(m);
Class: Quat {#Quat}
===========================
A class to handle Quaternions. More information on quternions can be
found [here](http://en.wikipedia.org/wiki/Quaternion). The quaternion
will be represented by an instance with `x`, `y`, `z`, `w` components
that make a quaternion like: `xi + yj + zk + w`.
Quat Static Method: fromVec3 {#Quat:fromVec3}
-----------------------------------------------
Create a new `Quat` instance from the `x`, `y`, `z` coordinates of a [Vec3](#Vec3) and a real component.
### Syntax:
Quat.fromVec3(v[, r]);
### Arguments:
1. v - (*object*) A `Vec3` instance.
2. r - (*number*, optional) The real component. Default's `0`.
### Examples:
Create a Quaternion from a Vec3.
{% highlight js %}
var v = new Vec3(1, 2, 3),
q = Quat.fromVec3(v, 7); //Quat(1, 2, 3, 7)
{% endhighlight %}
Quat Static Method: fromMat4 {#Quat:fromMat4}
-----------------------------------------------
Create a new `Quat` instance from a [Mat4](#Mat4). The `Mat4` instance
must be an orthogonal matrix.
### Syntax:
Quat.fromMat4(m);
### Arguments:
1. m - (*object*) A `Mat4` instance.
### Examples:
Create a Quaternion from a `Mat4`.
{% highlight js %}
var m = new Mat4(),
q = Quat.fromMat4(m); //Quat
{% endhighlight %}
Quat Static Method: fromXRotation {#Quat:fromXRotation}
--------------------------------------------------------
Create a new `Quat` instance from a rotation around the x-axis in
radians.
### Syntax:
Quat.fromXRotation(angle);
### Arguments:
1. angle - (*number*) The angle in radians.
### Examples:
Create a Quaternion from an x-axis rotation.
{% highlight js %}
var q = Quat.fromXRotation(Math.PI); //Quat(1, 0, 0, 0)
{% endhighlight %}
Quat Static Method: fromYRotation {#Quat:fromYRotation}
--------------------------------------------------------
Create a new `Quat` instance from a rotation around the y-axis in
radians.
### Syntax:
Quat.fromYRotation(angle);
### Arguments:
1. angle - (*number*) The angle in radians.
### Examples:
Create a Quaternion from an y-axis rotation.
{% highlight js %}
var q = Quat.fromYRotation(Math.PI); //Quat(0, 1, 0, 0)
{% endhighlight %}
Quat Static Method: fromZRotation {#Quat:fromZRotation}
--------------------------------------------------------
Create a new `Quat` instance from a rotation around the z-axis in
radians.
### Syntax:
Quat.fromZRotation(angle);
### Arguments:
1. angle - (*number*) The angle in radians.
### Examples:
Create a Quaternion from an z-axis rotation.
{% highlight js %}
var q = Quat.fromZRotation(Math.PI); //Quat(0, 0, 1, 0)
{% endhighlight %}
Quat Static Method: fromAxisRotation {#Quat:fromAxisRotation}
--------------------------------------------------------------
Create a new `Quat` instance from a rotation around an axis.
### Syntax:
Quat.fromAxisRotation(v, angle);
### Arguments:
1. v - (*object*) A `Vec3`-like object (i.e an array of three components).
2. angle - (*number*) The angle in radians.
### Examples:
Create a Quaternion from an z-axis rotation.
{% highlight js %}
var v = new Vec3(0, 0, 1),
q = Quat.fromAxisRotation(v, Math.PI); //Quat(0, 0, 1, 0)
{% endhighlight %}
Quat Method: constructor {#Quat:constructor}
----------------------------------------------------
Creates a new `Quat` instance.
### Syntax:
var q = new Quat(x, y, z, w);
### Arguments:
1. x - (*number*, optional) The x component. If not provided is 0.
2. y - (*number*, optional) The y component. If not provided is 0.
3. z - (*number*, optional) The z component. If not provided is 0.
4. w - (*number*, optional) The non-imaginary component. If not provided
is 0.
### Examples:
Create a (0, 0, 0, 0) quaternion.
{% highlight js %}
var q = new Quat();
{% endhighlight %}
Create a (1, 2, 3, 4) quaternion.
{% highlight js %}
var q = new Quat(1, 2, 3, 4);
{% endhighlight %}
Quat Method: setQuat {#Quat:setQuat}
------------------------------------
Set `x`, `y`, `z`, `w` coordinates of one `Quat` into another `Quat`.
### Syntax:
q1.setQuat(q2);
Quat.setQuat(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two quaternions and assign one quaternions components to the other one.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4),
q2 = new Quat(4, 5, 6, 7);
q1.setQuat(q2); //v1 now contains [ 4, 5, 6, 7 ]
{% endhighlight %}
Set an object's `x`, `y`, `z`, `w` components to another object.
{% highlight js %}
var q1 = [],
q2 = [ 4, 5, 6, 7 ];
Quat.setQuat(q1, q2); //q1 now has [ 4, 5, 6, 7 ]
{% endhighlight %}
Quat Method: set {#Quat:set}
-------------------------------
Set `x`, `y`, `z`, `w` coordinates.
### Syntax:
q1.set(x, y, z, w);
Quat.set(q1, x, y, z, w);
### Arguments:
1. x - (*number*) The x coordinate.
2. y - (*number*) The y coordinate.
3. z - (*number*) The z coordinate.
4. w - (*number*) The w coordinate.
### Examples:
Create two quaternions and assign one quaternions components to the other one.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4),
q2 = new Quat(4, 5, 6, 7);
q1.set(q2.x, q2.y, q2.z, q2.w); //q1 now contains [ 4, 5, 6, 7 ]
{% endhighlight %}
Set an object's `x`, `y`, `z`, `w` components to another object.
{% highlight js %}
var q1 = [],
q2 = [ 4, 5, 6, 7 ];
Quat.set(q1, q2.x, q2.y, q2.z, q2.w); //q1 now has [ 4, 5, 6, 7 ]
{% endhighlight %}
Quat Method: add {#Quat:add}
-----------------------------
Adds the `x`, `y`, `z` components of two `Quat` objects. Creates a new `Quat` instance and does not modify the original objects.
### Syntax:
q1.add(q2);
Quat.add(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two quaternions and add them.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4),
q2 = new Quat(4, 5, 6, 7);
q1.add(q2); //q1 and q2 are still the same but a new Quat(5, 7, 9, 11) was created.
{% endhighlight %}
Create two `x`, `y`, `z`, `w` objects and add them.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ],
q2 = [ 4, 5, 6, 7 ];
Quat.add(q1, q2); //q1 and q2 are still the same but a new Quat(5, 7, 9, 11) was created.
{% endhighlight %}
Quat Method: $add {#Quat:$add}
------------------------------------
Adds the `x`, `y`, `z`, `w` components of two `Quat` objects. Modifies the original object.
### Syntax:
q1.$add(q2);
Quat.$add(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two quaternions and add them.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4),
q2 = new Quat(4, 5, 6, 7);
q1.$add(q2); //q1 is now Quat(5, 7, 9, 11).
{% endhighlight %}
Create two `x`, `y`, `z`, `w` objects and add them.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ],
q2 = [ 4, 5, 6, 7 ];
Quat.$add(q1, q2); //q1 is now [ 5, 7, 9, 11 ].
{% endhighlight %}
Quat Method: sub {#Quat:sub}
------------------------------------
Substracts the `x`, `y`, `z`, `w` components of two `Quat` objects. Creates a new `Quat` instance and does not modify the original objects.
### Syntax:
q1.sub(q2);
Quat.sub(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two quaternions and substract them.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4),
q2 = new Quat(4, 5, 6, 7);
q1.sub(q2); //q1 and q2 are still the same but a new Quat(-3, -3, -3, -3) was created.
{% endhighlight %}
Create two `x`, `y`, `z`, `w` objects and substract them.
{% highlight js %}
var q1 = {
x: 1,
y: 2,
z: 3,
w: 4
},
q2 = [ 4, 5, 6, 7 ];
Quat.sub(q1, q2); //q1 and q2 are still the same but a new Quat(-3, -3, -3, -3) was created.
{% endhighlight %}
Quat Method: $sub {#Quat:$sub}
------------------------------------
Substracts the `x`, `y`, `z`, `w` components of two `Quat` objects. Modifies the original object.
### Syntax:
q1.$sub(q2);
Quat.$sub(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two quaternions and substract them.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4),
q2 = new Quat(4, 5, 6, 7);
q1.$sub(q2); //q1 is now Quat(-3, -3, -3, -3).
{% endhighlight %}
Create two `x`, `y`, `z`, `w` objects and add them.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ],
q2 = [ 4, 5, 6, 7 ];
Quat.$sub(q1, q2); //q1 is now [ -3, -3, -3, -3 ].
{% endhighlight %}
Quat Method: mulQuat {#Quat:mulQuat}
-------------------------------------
Multiplies two quaternions returning a new `Quat` instance with the result.
The original object is not modified.
### Syntax:
q1.mulQuat(q2);
Quat.mulQuat(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two Quaternions and multiply them.
{% highlight js %}
var q1 = new Quat(1, 0, 0, 0),
q2 = new Quat(1, 0, 0, 0);
q1.mulQuat(q2); //q1 is unchanged but a new Quat(-1, 0, 0, 0) is created.
{% endhighlight %}
Quat Method: $mulQuat {#Quat:$mulQuat}
---------------------------------------
Multiplies two quaternions returning and modifies the receiver with the result.
### Syntax:
q1.$mulQuat(q2);
Quat.$mulQuat(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two Quaternions and multiply them.
{% highlight js %}
var q1 = new Quat(1, 0, 0, 0),
q2 = new Quat(1, 0, 0, 0);
q1.$mulQuat(q2); //q1 is now Quat(-1, 0, 0, 0).
{% endhighlight %}
Quat Method: divQuat {#Quat:divQuat}
-------------------------------------
Divides two quaternions returning a new `Quat` instance with the result.
The original object is not modified.
### Syntax:
q1.divQuat(q2);
Quat.divQuat(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two Quaternions and divide them.
{% highlight js %}
var q1 = new Quat(1, 0, 0, 0),
q2 = new Quat(1, 0, 0, 0);
q1.divQuat(q2); //q1 is unchanged but a new Quat(1, 0, 0, 0) is created.
{% endhighlight %}
Quat Method: $divQuat {#Quat:$divQuat}
---------------------------------------
Divides two quaternions returning and modifies the receiver with the result.
### Syntax:
q1.$divQuat(q2);
Quat.$divQuat(q1, q2);
### Arguments:
1. q2 - (*object*) A `Quat` instance.
### Examples:
Create two Quaternions and divide them.
{% highlight js %}
var q1 = new Quat(1, 0, 0, 0),
q2 = new Quat(1, 0, 0, 0);
q1.$divQuat(q2); //q1 is now Quat(1, 0, 0, 0).
{% endhighlight %}
Quat Method: scale {#Quat:scale}
------------------------------------
Scales the Quat quaternion by a real number. Creates a new Quat with the scaled components.
### Syntax:
q1.scale(s);
Quat.scale(q1, s);
### Arguments:
1. s - (*number*) A real number to scale the Quat.
### Examples:
Create a quaternion and scale it by 2.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.scale(2); //q1 is unchanged but a new Quat(2, 4, 6, 8) is created.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and scale it by 2.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.scale(q1, 2); //q1 is still the same but a new Quat(2, 4, 6, 8) was created.
{% endhighlight %}
Quat Method: $scale {#Quat:$scale}
------------------------------------
Scales the Quat quaternion by a real number. Changes the original object.
### Syntax:
q1.$scale(s);
Quat.$scale(q1, s);
### Arguments:
1. s - (*number*) A real number to scale the Quat.
### Examples:
Create a quaternion and scale it by 2.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.$scale(2); //q1 is now Quat(2, 4, 6, 8).
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and scale it by 2.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.$scale(q1, 2); //q1 is now [ 2, 4, 6, 8 ].
{% endhighlight %}
Quat Method: conjugate {#Quat:conjugate}
-----------------------------------------
Conjugates a `Quat`. Returns a new instance.
### Syntax:
q1.conjugate();
Quat.conjugate(q1);
### Examples:
Create a quaternion and conjugate it.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.conjugate(); //q1 is unchanged but a new Quat(-1, -2, -3, 4) is created.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and conjugate it.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.conjugate(q1); //q1 is still the same but a new Quat(-1, -2, -3, 4).
{% endhighlight %}
Quat Method: $conjugate {#Quat:$conjugate}
-------------------------------------------
conjugates a `Quat`. Changes the original object.
### Syntax:
q1.$conjugate();
Quat.$conjugate(q1);
### Examples:
Create a quaternion and conjugate it.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.$conjugate(); //q1 is now Quat(-1, -2, -3, 4).
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and conjugate it.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.conjugate(q1); //q1 is now [ -1, -2, -3, 4 ].
{% endhighlight %}
Quat Method: neg {#Quat:neg}
------------------------------------
Negates a `Quat`. Returns a new instance.
### Syntax:
q1.neg();
Quat.neg(q1);
### Examples:
Create a quaternion and negate it.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.neg(); //q1 is unchanged but a new Quat(-1, -2, -3, -4) is created.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and negate it.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.neg(q1); //q1 is still the same but a new Quat(-1, -2, -3, -4).
{% endhighlight %}
Quat Method: $neg {#Quat:$neg}
------------------------------------
Negates a `Quat`. Changes the original object.
### Syntax:
q1.$neg();
Quat.$neg(q1);
### Examples:
Create a quaternion and negate it.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.$neg(); //q1 is now Quat(-1, -2, -3, -4).
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and negate it.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.neg(q1); //q1 is now [ -1, -2, -3, -4 ].
{% endhighlight %}
Quat Method: unit {#Quat:unit}
------------------------------------
Creates a unit quaternion from the coordinates of `Quat`. The original
object is not modified.
### Syntax:
q1.unit();
Quat.unit(q1);
### Examples:
Create a quaternion and make a unit quaternion from it.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.unit(); //q1 is unchanged but a new unit quaternion Quat is created.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and make a unit quaternion from it.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.unit(q1); //q1 is still the same but a new Quat that is a unit quaternion is created.
{% endhighlight %}
Quat Method: $unit {#Quat:$unit}
------------------------------------
Creates a unit quaternion from the `Quat` coordinates. Changes the original object.
### Syntax:
q1.$unit();
Quat.$unit(q1);
### Examples:
Create a quaternion and make a unit quaternion from it.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
q1.$unit(); //q1 is now a unit quaternion.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and make a unit quaternion from it.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
Quat.$unit(q1); //q1 is now a unit quaternion vector.
{% endhighlight %}
Quat Method: norm {#Quat:norm}
------------------------------------
Calculates the norm of `Quat`.
### Syntax:
q1.norm();
Quat.norm(q1);
### Examples:
Create a quaternion and calculate its norm.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
vi.norm(); //returns the real valued norm.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and calculate its norm.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
//A real number with the norm is returned.
var ans = Quat.norm(q1);
{% endhighlight %}
Quat Method: normSq {#Quat:normSq}
------------------------------------
Calculates the squared norm of `Quat`.
### Syntax:
q1.normSq();
Quat.normSq(q1);
### Examples:
Create a quaternion and calculate its squared norm.
{% highlight js %}
var q1 = new Quat(1, 2, 3, 4);
vi.normSq(); //returns the real valued norm.
{% endhighlight %}
Create an `x`, `y`, `z`, `w` object and calculate its squared norm.
{% highlight js %}
var q1 = [ 1, 2, 3, 4 ];
//A real number with the squared norm is returned.
var ans = Quat.normSq(q1);
{% endhighlight %}
Quat Method: clone {#Quat:clone}
------------------------------------
Clones a quaternion.
### Syntax:
q1.clone();
Quat.clone(q1);