mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-30 02:42:54 +08:00
75 lines
2.2 KiB
C#
75 lines
2.2 KiB
C#
|
using SharpDX;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
namespace CodeWalker
|
|||
|
{
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public static class QuaternionExtension
|
|||
|
{
|
|||
|
public static Vector3 Multiply(this Quaternion a, Vector3 b)
|
|||
|
{
|
|||
|
float axx = a.X * 2.0f;
|
|||
|
float ayy = a.Y * 2.0f;
|
|||
|
float azz = a.Z * 2.0f;
|
|||
|
float awxx = a.W * axx;
|
|||
|
float awyy = a.W * ayy;
|
|||
|
float awzz = a.W * azz;
|
|||
|
float axxx = a.X * axx;
|
|||
|
float axyy = a.X * ayy;
|
|||
|
float axzz = a.X * azz;
|
|||
|
float ayyy = a.Y * ayy;
|
|||
|
float ayzz = a.Y * azz;
|
|||
|
float azzz = a.Z * azz;
|
|||
|
return new Vector3(((b.X * ((1.0f - ayyy) - azzz)) + (b.Y * (axyy - awzz))) + (b.Z * (axzz + awyy)),
|
|||
|
((b.X * (axyy + awzz)) + (b.Y * ((1.0f - axxx) - azzz))) + (b.Z * (ayzz - awxx)),
|
|||
|
((b.X * (axzz - awyy)) + (b.Y * (ayzz + awxx))) + (b.Z * ((1.0f - axxx) - ayyy)));
|
|||
|
}
|
|||
|
|
|||
|
public static Matrix ToMatrix(this Quaternion q)
|
|||
|
{
|
|||
|
float xx = q.X * q.X;
|
|||
|
float yy = q.Y * q.Y;
|
|||
|
float zz = q.Z * q.Z;
|
|||
|
float xy = q.X * q.Y;
|
|||
|
float zw = q.Z * q.W;
|
|||
|
float zx = q.Z * q.X;
|
|||
|
float yw = q.Y * q.W;
|
|||
|
float yz = q.Y * q.Z;
|
|||
|
float xw = q.X * q.W;
|
|||
|
Matrix result = new Matrix();
|
|||
|
result.M11 = 1.0f - (2.0f * (yy + zz));
|
|||
|
result.M12 = 2.0f * (xy + zw);
|
|||
|
result.M13 = 2.0f * (zx - yw);
|
|||
|
result.M14 = 0.0f;
|
|||
|
result.M21 = 2.0f * (xy - zw);
|
|||
|
result.M22 = 1.0f - (2.0f * (zz + xx));
|
|||
|
result.M23 = 2.0f * (yz + xw);
|
|||
|
result.M24 = 0.0f;
|
|||
|
result.M31 = 2.0f * (zx + yw);
|
|||
|
result.M32 = 2.0f * (yz - xw);
|
|||
|
result.M33 = 1.0f - (2.0f * (yy + xx));
|
|||
|
result.M34 = 0.0f;
|
|||
|
result.M41 = 0.0f;
|
|||
|
result.M42 = 0.0f;
|
|||
|
result.M43 = 0.0f;
|
|||
|
result.M44 = 1.0f;
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
public static Vector4 ToVector4(this Quaternion q)
|
|||
|
{
|
|||
|
return new Vector4(q.X, q.Y, q.Z, q.W);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|