Implemented Tranform(Vector, Quaternion) overloads. Fixes issue [#1028]: "[Math] Add vector transformation by quaternion".

This commit is contained in:
the_fiddler 2009-11-03 12:20:21 +00:00
parent b5eb7fdb93
commit eb92aa8223
6 changed files with 194 additions and 0 deletions

View file

@ -885,6 +885,41 @@ namespace OpenTK
#endregion
#region Transform
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <returns>The result of the operation.</returns>
public static Vector2 Transform(Vector2 vec, Quaternion quat)
{
Vector2 result;
Transform(ref vec, ref quat, out result);
return result;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <param name="result">The result of the operation.</param>
public static void Transform(ref Vector2 vec, ref Quaternion quat, out Vector2 result)
{
Quaternion v = new Quaternion() { X = vec.X, Y = vec.Y, Z = 0, W = 0 };
Quaternion i;
Quaternion t;
Quaternion.Invert(ref quat, out i);
t = i * v;
v = t * quat;
result = new Vector2(v.X, v.Y);
}
#endregion
#endregion
#region Operators

View file

@ -773,6 +773,41 @@ namespace OpenTK
#endregion
#region Transform
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <returns>The result of the operation.</returns>
public static Vector2d Transform(Vector2d vec, Quaterniond quat)
{
Vector2d result;
Transform(ref vec, ref quat, out result);
return result;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <param name="result">The result of the operation.</param>
public static void Transform(ref Vector2d vec, ref Quaterniond quat, out Vector2d result)
{
Quaterniond v = new Quaterniond() { X = vec.X, Y = vec.Y, Z = 0, W = 0 };
Quaterniond i;
Quaterniond t;
Quaterniond.Invert(ref quat, out i);
t = i * v;
v = t * quat;
result = new Vector2d(v.X, v.Y);
}
#endregion
#endregion
#region Operators

View file

@ -1094,6 +1094,37 @@ namespace OpenTK
result = v4.Xyz;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <returns>The result of the operation.</returns>
public static Vector3 Transform(Vector3 vec, Quaternion quat)
{
Vector3 result;
Transform(ref vec, ref quat, out result);
return result;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <param name="result">The result of the operation.</param>
public static void Transform(ref Vector3 vec, ref Quaternion quat, out Vector3 result)
{
Quaternion v = new Quaternion() { X = vec.X, Y = vec.Y, Z = vec.Z, W = 0 };
Quaternion i;
Quaternion t;
Quaternion.Invert(ref quat, out i);
t = i * v;
v = t * quat;
result = new Vector3(v.X, v.Y, v.Z);
}
/// <summary>Transform a Vector3 by the given Matrix, and project the resulting Vector4 back to a Vector3</summary>
/// <param name="vec">The vector to transform</param>
/// <param name="mat">The desired transformation</param>

View file

@ -1090,6 +1090,37 @@ namespace OpenTK
result = v4.Xyz;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <returns>The result of the operation.</returns>
public static Vector3d Transform(Vector3d vec, Quaterniond quat)
{
Vector3d result;
Transform(ref vec, ref quat, out result);
return result;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <param name="result">The result of the operation.</param>
public static void Transform(ref Vector3d vec, ref Quaterniond quat, out Vector3d result)
{
Quaterniond v = new Quaterniond() { X = vec.X, Y = vec.Y, Z = vec.Z, W = 0 };
Quaterniond i;
Quaterniond t;
Quaterniond.Invert(ref quat, out i);
t = i * v;
v = t * quat;
result = new Vector3d(v.X, v.Y, v.Z);
}
/// <summary>
/// Transform a Vector3d by the given Matrix, and project the resulting Vector4 back to a Vector3
/// </summary>

View file

@ -942,6 +942,37 @@ namespace OpenTK
vec.X * mat.Row0.W + vec.Y * mat.Row1.W + vec.Z * mat.Row2.W + vec.W * mat.Row3.W);
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <returns>The result of the operation.</returns>
public static Vector4 Transform(Vector4 vec, Quaternion quat)
{
Vector4 result;
Transform(ref vec, ref quat, out result);
return result;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <param name="result">The result of the operation.</param>
public static void Transform(ref Vector4 vec, ref Quaternion quat, out Vector4 result)
{
Quaternion v = new Quaternion() { X = vec.X, Y = vec.Y, Z = vec.Z, W = vec.W };
Quaternion i;
Quaternion t;
Quaternion.Invert(ref quat, out i);
t = i * v;
v = t * quat;
result = new Vector4(v.X, v.Y, v.Z, v.W);
}
#endregion
#endregion

View file

@ -945,6 +945,37 @@ namespace OpenTK
vec.X * mat.Row0.W + vec.Y * mat.Row1.W + vec.Z * mat.Row2.W + vec.W * mat.Row3.W);
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <returns>The result of the operation.</returns>
public static Vector4d Transform(Vector4d vec, Quaterniond quat)
{
Vector4d result;
Transform(ref vec, ref quat, out result);
return result;
}
/// <summary>
/// Transforms a vector by a quaternion rotation.
/// </summary>
/// <param name="vec">The vector to transform.</param>
/// <param name="quat">The quaternion to rotate the vector by.</param>
/// <param name="result">The result of the operation.</param>
public static void Transform(ref Vector4d vec, ref Quaterniond quat, out Vector4d result)
{
Quaterniond v = new Quaterniond() { X = vec.X, Y = vec.Y, Z = vec.Z, W = vec.W };
Quaterniond i;
Quaterniond t;
Quaterniond.Invert(ref quat, out i);
t = i * v;
v = t * quat;
result = new Vector4d(v.X, v.Y, v.Z, v.W);
}
#endregion
#endregion