Vector.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "Vector.h"
  2. #include "Matrix4.h"
  3. #include "Quaternion.h"
  4. USING_NS_BF;
  5. Vector3::Vector3()
  6. {
  7. mX = 0;
  8. mY = 0;
  9. mZ = 0;
  10. }
  11. Vector3::Vector3(float x, float y, float z)
  12. {
  13. mX = x;
  14. mY = y;
  15. mZ = z;
  16. }
  17. float Vector3::GetMagnitude() const
  18. {
  19. return sqrtf(mX*mX + mY*mY + mZ*mZ);
  20. }
  21. float Vector3::GetMagnitudeSquare() const
  22. {
  23. return mX * mX + mY * mY + mZ * mZ;
  24. }
  25. Vector3 Vector3::Normalize(const Vector3& vec)
  26. {
  27. float mag = vec.GetMagnitude();
  28. return Vector3(
  29. vec.mX / mag,
  30. vec.mY / mag,
  31. vec.mZ / mag);
  32. }
  33. float Vector3::Dot(const Vector3& vec, const Vector3& vec2)
  34. {
  35. return vec.mX*vec2.mX + vec.mY*vec2.mY + vec.mZ*vec2.mZ;
  36. }
  37. Vector3 Vector3::CrossProduct(const Vector3& vec1, const Vector3& vec2)
  38. {
  39. return Vector3(
  40. vec1.mY * vec2.mZ - vec1.mZ * vec2.mY,
  41. vec1.mZ * vec2.mX - vec1.mX * vec2.mZ,
  42. vec1.mX * vec2.mY - vec1.mY * vec2.mX);
  43. }
  44. Vector3 Vector3::Transform(const Vector3& vec, const Matrix4& matrix)
  45. {
  46. return Vector3(
  47. (matrix.m00 * vec.mX + matrix.m01 * vec.mY + matrix.m02 * vec.mZ + matrix.m03),
  48. (matrix.m10 * vec.mX + matrix.m11 * vec.mY + matrix.m12 * vec.mZ + matrix.m13),
  49. (matrix.m20 * vec.mX + matrix.m21 * vec.mY + matrix.m22 * vec.mZ + matrix.m23));
  50. }
  51. Vector3 Vector3::TransformW(const Vector3& vec, const Matrix4& matrix)
  52. {
  53. float fInvW = 1.0f / (matrix.m30 * vec.mX + matrix.m31 * vec.mY + matrix.m32 * vec.mZ + matrix.m33);
  54. return Vector3(
  55. (matrix.m00 * vec.mX + matrix.m01 * vec.mY + matrix.m02 * vec.mZ + matrix.m03) * fInvW,
  56. (matrix.m10 * vec.mX + matrix.m11 * vec.mY + matrix.m12 * vec.mZ + matrix.m13) * fInvW,
  57. (matrix.m20 * vec.mX + matrix.m21 * vec.mY + matrix.m22 * vec.mZ + matrix.m23) * fInvW);
  58. }
  59. Vector3 Vector3::Transform(const Vector3& vec, const Quaternion& quat)
  60. {
  61. Vector3 result;
  62. Vector3 uv, uuv;
  63. Vector3 qvec(quat.mX, quat.mY, quat.mZ);
  64. uv = Vector3::CrossProduct(qvec, vec);
  65. uuv = Vector3::CrossProduct(qvec, uv);
  66. uv *= (2.0f * quat.mW);
  67. uuv *= 2.0f;
  68. return vec + uv + uuv;
  69. }
  70. Vector3 Vector3::Transform2(const Vector3& vec, const Quaternion& quat)
  71. {
  72. Vector3 result;
  73. float x = 2 * (quat.mY * vec.mZ - quat.mZ * vec.mY);
  74. float y = 2 * (quat.mZ * vec.mX - quat.mX * vec.mZ);
  75. float z = 2 * (quat.mX * vec.mY - quat.mY * vec.mX);
  76. result.mX = vec.mX + x * quat.mW + (quat.mY * z - quat.mZ * y);
  77. result.mY = vec.mY + y * quat.mW + (quat.mZ * x - quat.mX * z);
  78. result.mZ = vec.mZ + z * quat.mW + (quat.mX * y - quat.mY * x);
  79. return result;
  80. }
  81. ///
  82. Vector4::Vector4(float x, float y, float z, float w)
  83. {
  84. mX = x;
  85. mY = y;
  86. mZ = z;
  87. mW = w;
  88. }