1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "Quaternion.h"

Quaternion::Quaternion()
{
	Identity();
}
Quaternion::Quaternion(float ax, float ay, float az, float angle)
{
	float xx,yy,zz;			
	float rad, scale;		
	float length;

	length = sqrtf(ax*ax+ay*ay+az*az);

	if (0.0f==length)			// if axis is zero, then return Quaternion (1,0,0,0)
	{
		w	= 1.0f;
		x	= 0.0f;
		y	= 0.0f;
		z	= 0.0f;		
		return;
	}		

	float lenInv=1.0f/length;
	xx = ax *lenInv;
	yy = ay *lenInv;
	zz = az *lenInv;	    

	rad		= angle / 2;		
	w		= cosf(rad);		
	scale	= sinf(rad);

	x = xx * scale;
	y = yy * scale;
	z = zz * scale;
	//Change by GM, test rotation.
	//x=0;
	//y=0;
	//z=0;
}