123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include "Vector.h"
- #include "Matrix4.h"
- #include "Quaternion.h"
- USING_NS_BF;
- Vector3::Vector3()
- {
- mX = 0;
- mY = 0;
- mZ = 0;
- }
- Vector3::Vector3(float x, float y, float z)
- {
- mX = x;
- mY = y;
- mZ = z;
- }
- float Vector3::GetMagnitude() const
- {
- return sqrtf(mX*mX + mY*mY + mZ*mZ);
- }
- float Vector3::GetMagnitudeSquare() const
- {
- return mX * mX + mY * mY + mZ * mZ;
- }
- Vector3 Vector3::Normalize(const Vector3& vec)
- {
- float mag = vec.GetMagnitude();
- return Vector3(
- vec.mX / mag,
- vec.mY / mag,
- vec.mZ / mag);
- }
- float Vector3::Dot(const Vector3& vec, const Vector3& vec2)
- {
- return vec.mX*vec2.mX + vec.mY*vec2.mY + vec.mZ*vec2.mZ;
- }
- Vector3 Vector3::CrossProduct(const Vector3& vec1, const Vector3& vec2)
- {
- return Vector3(
- vec1.mY * vec2.mZ - vec1.mZ * vec2.mY,
- vec1.mZ * vec2.mX - vec1.mX * vec2.mZ,
- vec1.mX * vec2.mY - vec1.mY * vec2.mX);
- }
- Vector3 Vector3::Transform(const Vector3& vec, const Matrix4& matrix)
- {
- return Vector3(
- (matrix.m00 * vec.mX + matrix.m01 * vec.mY + matrix.m02 * vec.mZ + matrix.m03),
- (matrix.m10 * vec.mX + matrix.m11 * vec.mY + matrix.m12 * vec.mZ + matrix.m13),
- (matrix.m20 * vec.mX + matrix.m21 * vec.mY + matrix.m22 * vec.mZ + matrix.m23));
- }
- Vector3 Vector3::TransformW(const Vector3& vec, const Matrix4& matrix)
- {
- float fInvW = 1.0f / (matrix.m30 * vec.mX + matrix.m31 * vec.mY + matrix.m32 * vec.mZ + matrix.m33);
- return Vector3(
- (matrix.m00 * vec.mX + matrix.m01 * vec.mY + matrix.m02 * vec.mZ + matrix.m03) * fInvW,
- (matrix.m10 * vec.mX + matrix.m11 * vec.mY + matrix.m12 * vec.mZ + matrix.m13) * fInvW,
- (matrix.m20 * vec.mX + matrix.m21 * vec.mY + matrix.m22 * vec.mZ + matrix.m23) * fInvW);
- }
- Vector3 Vector3::Transform(const Vector3& vec, const Quaternion& quat)
- {
- Vector3 result;
- Vector3 uv, uuv;
- Vector3 qvec(quat.mX, quat.mY, quat.mZ);
- uv = Vector3::CrossProduct(qvec, vec);
- uuv = Vector3::CrossProduct(qvec, uv);
- uv *= (2.0f * quat.mW);
- uuv *= 2.0f;
- return vec + uv + uuv;
- }
- Vector3 Vector3::Transform2(const Vector3& vec, const Quaternion& quat)
- {
- Vector3 result;
- float x = 2 * (quat.mY * vec.mZ - quat.mZ * vec.mY);
- float y = 2 * (quat.mZ * vec.mX - quat.mX * vec.mZ);
- float z = 2 * (quat.mX * vec.mY - quat.mY * vec.mX);
- result.mX = vec.mX + x * quat.mW + (quat.mY * z - quat.mZ * y);
- result.mY = vec.mY + y * quat.mW + (quat.mZ * x - quat.mX * z);
- result.mZ = vec.mZ + z * quat.mW + (quat.mX * y - quat.mY * x);
- return result;
- }
- ///
- Vector4::Vector4(float x, float y, float z, float w)
- {
- mX = x;
- mY = y;
- mZ = z;
- mW = w;
- }
|