Exemple #1
0
Ray Quaternion::applyRotation(const Ray& ray) const
{
	Quaternion origin = (*this) * Quaternion(ray.m_Origin) * (conjugate());
	Quaternion dir = (*this) * Quaternion(ray.m_Dir) * (conjugate());
	return Ray(Vector(origin[1], origin[2], origin[3], ray.m_Origin[3]),
			   Vector(dir[1], dir[2], dir[3], ray.m_Dir[3]));
}
Exemple #2
0
Quaternion Quaternion::rotation(float angle, const Vector& axis)
{
	float len = (float)sqrt(axis[0]*axis[0]+axis[1]*axis[1]+axis[2]*axis[2]);
	if(len!=0.0)
	{
		len = (float)(sin(angle/2.0f)/len);
		return Quaternion((float) cos(angle/2.0f), axis[0]*len, axis[1]*len, axis[2]*len);
	}
	else
	{
		return Quaternion();
	}
}
Exemple #3
0
Quaternion Quaternion::rotation(float angle, float x, float y, float z)
{
	float len = (float)sqrt(x*x+y*y+z*z);
	if(len!=0.0)
	{
		len = (float)(sin(angle/2.0f)/len);
		return Quaternion((float) cos(angle/2.0f), x*len, y*len, z*len);
	}
	else
	{
		return Quaternion();
	}
}
Exemple #4
0
Quaternion Quaternion::operator*(const Quaternion& quat) const
{
	return Quaternion(
			   p[0]*quat[0] - p[1]*quat[1] - p[2]*quat[2] - p[3]*quat[3],
			   p[0]*quat[1] + p[1]*quat[0] + p[2]*quat[3] - p[3]*quat[2],
			   p[0]*quat[2] - p[1]*quat[3] + p[2]*quat[0] + p[3]*quat[1],
			   p[0]*quat[3] + p[1]*quat[2] - p[2]*quat[1] + p[3]*quat[0]
		   );
}
Exemple #5
0
Quaternion Quaternion::power(double scalar)
{
	float Dest[4];
	double theta;
	if(p[0]>=0.9999f)
	{
		theta = 0;
	}
	else if(p[0]<=-0.9999f)
	{
		theta = 2.0*3.1415926535897932384626433832795;
	}
	else
	{
		theta = acos(p[0]);
	}
	double u[3];
	double scale = p[1]*p[1]+p[2]*p[2]+p[3]*p[3];
	scale = sqrt(scale);
	if(p[1]==0.0f && p[2]==0.0f && p[3]==0.0f)
	{
		u[0] = 0.0;
		u[1] = 0.0;
		u[2] = 0.0;
	}
	else
	{
		u[0] = p[1]/scale;
		u[1] = p[2]/scale;
		u[2] = p[3]/scale;
	}
	Dest[0] = (float)cos(scalar*theta);
	Dest[1] = (float)(u[0] * sin(scalar*theta));
	Dest[2] = (float)(u[1] * sin(scalar*theta));
	Dest[3] = (float)(u[2] * sin(scalar*theta));
	return Quaternion(Dest[0], Dest[1], Dest[2], Dest[3]);
}
Exemple #6
0
Vector Quaternion::applyRotation(const Vector& vec) const
{
	Quaternion result = (*this) * Quaternion(vec) * (conjugate());
	return Vector(result[1], result[2], result[3], vec[3]);
}
Exemple #7
0
Quaternion Quaternion::conjugate() const
{
	return Quaternion(p[0], -p[1], -p[2], -p[3]);
}
Exemple #8
0
Quaternion Quaternion::operator/(float scalar) const
{
	return Quaternion(p[0]/scalar, p[1]/scalar, p[2]/scalar, p[3]/scalar);
}
Exemple #9
0
Quaternion Quaternion::operator*(float scalar) const
{
	return Quaternion(p[0]*scalar, p[1]*scalar, p[2]*scalar, p[3]*scalar);
}