26 #include "ksVector3.h" 
   28 #define KS_PI 3.14159265358979323846264338327950288419716939937510 
   29 #define KS_DEGREES_TO_RADIANS 0.01745329251994329576923690768489 
   30 #define KS_RADIANS_TO_DEGREES 57.295779513082320876798154814105 
   31 #define KS_FDEGREES_TO_RADIANS 0.01745329251994329576923690768489f 
   32 #define KS_FRADIANS_TO_DEGREES 57.295779513082320876798154814105f 
   40         enum{ X = 0, Y = 1, Z = 2, W = 3 };
 
   47             m_values[X] = (Scalar)0.0;
 
   48             m_values[Y] = (Scalar)0.0;
 
   49             m_values[Z] = (Scalar)0.0;
 
   50             m_values[W] = (Scalar)1.0;
 
   81         Scalar& x() { 
return m_values[X]; }
 
   82         Scalar& y() { 
return m_values[Y]; }
 
   83         Scalar& z() { 
return m_values[Z]; }
 
   84         Scalar& w() { 
return m_values[W]; }
 
   85         const Scalar& x()
 const { 
return m_values[X]; }
 
   86         const Scalar& y()
 const { 
return m_values[Y]; }
 
   87         const Scalar& z()
 const { 
return m_values[Z]; }
 
   88         const Scalar& w()
 const { 
return m_values[W]; }
 
   89         Scalar& operator[] (
const int index) { 
return m_values[index]; }
 
   99             return ksVector3{ m_values[X], m_values[Y], m_values[Z] };
 
  109             for (
int i = 0; i < 4; i++)
 
  111                 if (m_values[i] != 0)
 
  113                     return m_values[i] > 0;
 
  128             double _x = (double)m_values[X];
 
  129             double _y = (double)m_values[Y];
 
  130             double _z = (double)m_values[Z];
 
  131             double _w = (double)m_values[W];
 
  133             double qx = (double)q.x();
 
  134             double qy = (double)q.y();
 
  135             double qz = (double)q.z();
 
  136             double qw = (double)q.w();
 
  139             result.w() = (Scalar)((qw * _w) - (qx * _x) - (qy * _y) - (qz * _z));
 
  140             result.x() = (Scalar)((qw * _x) + (qx * _w) - (qy * _z) + (qz * _y));
 
  141             result.y() = (Scalar)((qw * _y) + (qx * _z) + (qy * _w) - (qz * _x));
 
  142             result.z() = (Scalar)((qw * _z) - (qx * _y) + (qy * _x) + (qz * _w));
 
  154             double _x = (double)m_values[X];
 
  155             double _y = (double)m_values[Y];
 
  156             double _z = (double)m_values[Z];
 
  157             double _w = (double)m_values[W];
 
  158             double _2x = _x * 2.0;
 
  159             double _2y = _y * 2.0;
 
  160             double _2z = _z * 2.0;
 
  161             double _x2x = _x * _2x;
 
  162             double _y2y = _y * _2y;
 
  163             double _z2z = _z * _2z;
 
  164             double _x2y = _x * _2y;
 
  165             double _x2z = _x * _2z;
 
  166             double _y2z = _y * _2z;
 
  167             double _w2x = _w * _2x;
 
  168             double _w2y = _w * _2y;
 
  169             double _w2z = _w * _2z;
 
  171             double px = (double)point.x();
 
  172             double py = (double)point.y();
 
  173             double pz = (double)point.z();
 
  176             result.x() = (Scalar)((1.0 - (_y2y + _z2z)) * px + (_x2y - _w2z) * py + (_x2z + _w2y) * pz);
 
  177             result.y() = (Scalar)((_x2y + _w2z) * px + (1.0 - (_x2x + _z2z)) * py + (_y2z - _w2x) * pz);
 
  178             result.z() = (Scalar)((_x2z - _w2y) * px + (_y2z + _w2x) * py + (1.0 - (_x2x + _y2y)) * pz);
 
  190             return ksQuaternion{ -m_values[X], -m_values[Y], -m_values[Z], -m_values[W] };
 
  202             double _x = (double)m_values[X];
 
  203             double _y = (double)m_values[Y];
 
  204             double _z = (double)m_values[Z];
 
  205             double _w = (double)m_values[W];
 
  207             double qx = (double)q.x();
 
  208             double qy = (double)q.y();
 
  209             double qz = (double)q.z();
 
  210             double qw = (double)q.w();
 
  212             double tw = (qw * _w) - (qx * _x) - (qy * _y) - (qz * _z);
 
  213             double tx = (qw * _x) + (qx * _w) - (qy * _z) + (qz * _y);
 
  214             double ty = (qw * _y) + (qx * _z) + (qy * _w) - (qz * _x);
 
  215             double tz = (qw * _z) - (qx * _y) + (qy * _x) + (qz * _w);
 
  217             m_values[X] = (Scalar)tx;
 
  218             m_values[Y] = (Scalar)ty;
 
  219             m_values[Z] = (Scalar)tz;
 
  220             m_values[W] = (Scalar)tw;
 
  232             return m_values[X] == q.x() && m_values[Y] == q.y() && m_values[Z] == q.z() && m_values[W] == q.w();
 
  243             return !(*
this == q);
 
  255             Scalar m = (m_values[X] < 0.0f) ? -m_values[X] : m_values[X];
 
  256             Scalar absy = (m_values[Y] < 0.0f) ? -m_values[Y] : m_values[Y];
 
  257             Scalar absz = (m_values[Z] < 0.0f) ? -m_values[Z] : m_values[Z];
 
  258             Scalar absw = (m_values[W] < 0.0f) ? -m_values[W] : m_values[W];
 
  260             m = (absy > m) ? absy : m;
 
  261             m = (absz > m) ? absz : m;
 
  262             m = (absw > m) ? absw : m;
 
  273             Scalar length = (Scalar)sqrt(
 
  274                 m_values[X] * m_values[X] 
 
  275                 + m_values[Y] * m_values[Y] 
 
  276                 + m_values[Z] * m_values[Z] 
 
  277                 + m_values[W] * m_values[W]);
 
  279             m_values[X] /= length;
 
  280             m_values[Y] /= length;
 
  281             m_values[Z] /= length;
 
  282             m_values[W] /= length;
 
  293             float num2 = (((m_values[X] * m_values[X])
 
  294                 + (m_values[Y] * m_values[Y]))
 
  295                 + (m_values[Z] * m_values[Z]))
 
  296                 + (m_values[W] * m_values[W]);
 
  297             float num = 1 / num2;
 
  299             ksQuaternion2.x() = (m_values[X] == 0.0f) ? 0.0f : -m_values[X] * num;
 
  300             ksQuaternion2.y() = (m_values[Y] == 0.0f) ? 0.0f : -m_values[Y] * num;
 
  301             ksQuaternion2.z() = (m_values[Z] == 0.0f) ? 0.0f : -m_values[Z] * num;
 
  302             ksQuaternion2.w() = m_values[W] * num;
 
  303             return ksQuaternion2;
 
  334             angle *= (float)KS_DEGREES_TO_RADIANS;
 
  335             return FromAxisAngleRadians(axis, angle);
 
  348                 throw std::runtime_error(
"axis cannot be 0 vector");
 
  350             ksVector3 v = axis * (float)std::sin(0.5 * angle);
 
  351             ksQuaternion result(v.x(), v.y(), v.z(), (
float)std::cos(0.5 * angle));
 
  364             ToAxisAngleRadians(axis, angle);
 
  365             angle *= (float)KS_RADIANS_TO_DEGREES;
 
  376             if (m_values[X] == 0 && m_values[Y] == 0 && m_values[Z] == 0)
 
  384                 ksVector3 v(m_values[X], m_values[Y], m_values[Z]);
 
  389             double msin = std::sqrt(m_values[X] * m_values[X] + m_values[Y] * m_values[Y] + m_values[Z] * m_values[Z]);
 
  390             double mcos = m_values[W];
 
  394                 double maxcoeff = std::fmax(std::abs(m_values[X]), std::fmax(std::abs(m_values[Y]), std::abs(m_values[Z])));
 
  395                 double _x = m_values[X] / maxcoeff;
 
  396                 double _y = m_values[Y] / maxcoeff;
 
  397                 double _z = m_values[Z] / maxcoeff;
 
  398                 msin = std::sqrt(_x * _x + _y * _y + _z * _z);
 
  399                 mcos = m_values[W] / maxcoeff;
 
  402             angle = (float)std::atan2(msin, mcos) * 2;
 
  404                 angle -= 2 * (float)KS_PI;
 
  405             else if (angle <= -KS_PI)
 
  406                 angle += 2 * (float)KS_PI;
 
  419             return q1.x() * q2.x() + q1.y() * q2.y() + q1.z() * q2.z() + q1.w() * q2.w();
 
  451             float num4 = (((from.x() * to.x()) + (from.y() * to.y())) + (from.z() * to.z())) + (from.w() * to.w());
 
  458             if (num4 > 0.999999f)
 
  461                 num2 = flag ? -num : num;
 
  465                 float num5 = std::acos(num4);
 
  466                 float num6 = 1.0f / std::sin(num5);
 
  467                 num3 = std::sin((1.0f - num) * num5) * num6;
 
  468                 num2 = flag ? (-std::sin(num * num5) * num6) : std::sin(num * num5) * num6;
 
  488             float x = angularDisplacement.x();
 
  489             float y = angularDisplacement.y();
 
  490             float z = angularDisplacement.z();
 
  491             float magnitude = std::sqrt(x * x + y * y + z * z);
 
  494             float cos = std::cos(magnitude / 2.0f );
 
  495             float sin = std::sin(magnitude / 2.0f );
 
  497             rot.x() = x * sin / magnitude;
 
  498             rot.y() = y * sin / magnitude;
 
  499             rot.z() = z * sin / magnitude;
 
  503             result.x() = rot.w() * quaternion.x() + rot.x() * quaternion.w()
 
  504                 + rot.y() * quaternion.z() - rot.z() * quaternion.y();
 
  505             result.y() = rot.w() * quaternion.y() - rot.x() * quaternion.z()
 
  506                 + rot.y() * quaternion.w() + rot.z() * quaternion.x();
 
  507             result.z() = rot.w() * quaternion.z() + rot.x() * quaternion.y()
 
  508                 - rot.y() * quaternion.x() + rot.z() * quaternion.w();
 
  509             result.w() = rot.w() * quaternion.w() - rot.x() * quaternion.x()
 
  510                 - rot.y() * quaternion.y() - rot.z() * quaternion.z();
 
  522             return  "X=" + std::to_string(m_values[X]) + 
 
  523                   ", Y=" + std::to_string(m_values[Y]) + 
 
  524                   ", Z=" + std::to_string(m_values[Z]) + 
 
  525                   ", W=" + std::to_string(m_values[W]);
 
  531 #undef KS_DEGREES_TO_RADIANS 
  532 #undef KS_RADIANS_TO_DEGREES 
  533 #undef KS_FDEGREES_TO_RADIANS 
  534 #undef KS_FRADIANS_TO_DEGREES 
Definition: ksQuaternion.h:37
static ksQuaternion FromAxisAngle(ksVector3 axis, float angle)
Definition: ksQuaternion.h:332
bool GetFirstNonZeroComponentSign()
Definition: ksQuaternion.h:107
~ksQuaternion()
Definition: ksQuaternion.h:78
void ToAxisAngle(ksVector3 &axis, float &angle)
Definition: ksQuaternion.h:362
ksQuaternion Inverse() const
Definition: ksQuaternion.h:290
static ksQuaternion FromVectorDelta(ksVector3 startDirection, ksVector3 endDirection)
Definition: ksQuaternion.h:313
void ToAxisAngleRadians(ksVector3 &axis, float &angle)
Definition: ksQuaternion.h:374
std::string ToString()
Definition: ksQuaternion.h:520
void Normalize()
Definition: ksQuaternion.h:250
static Scalar Dot(const ksQuaternion &q1, const ksQuaternion &q2)
Definition: ksQuaternion.h:417
ksQuaternion(Scalar x, Scalar y, Scalar z, Scalar w)
Definition: ksQuaternion.h:67
static ksQuaternion FromAxisAngleRadians(ksVector3 axis, float angle)
Definition: ksQuaternion.h:345
ksQuaternion(const ksQuaternion &q)
Definition: ksQuaternion.h:56
static ksVector3 TransformVector(const ksVector3 &v, const ksQuaternion &q)
Definition: ksQuaternion.h:430
static ksQuaternion AddAngularDisplacementRadians(const ksQuaternion &quaternion, const ksVector3 &angularDisplacement)
Definition: ksQuaternion.h:485
static ksQuaternion Slerp(const ksQuaternion &from, const ksQuaternion &to, float t)
Definition: ksQuaternion.h:445
ksQuaternion()
Definition: ksQuaternion.h:45
ksVector3 Vec() const
Definition: ksQuaternion.h:97
Definition: ksVector3.h:32
static Scalar Dot(const ksVector3 &v1, const ksVector3 &v2)
Definition: ksVector3.h:314
float MagnitudeSquared()
Definition: ksVector3.h:227
void Normalize()
Definition: ksVector3.h:243
static ksVector3 Cross(const ksVector3 &v1, const ksVector3 &v2)
Definition: ksVector3.h:326
Definition: sfDictionaryProperty.h:24
ksVector3 operator*(const Scalar &c, const ksVector3 &v)
Definition: ksVector3.h:352