@ -150,7 +150,7 @@ namespace core
CMatrix4 < T > operator * ( const CMatrix4 < T > & other ) const ;
CMatrix4 < T > operator * ( const CMatrix4 < T > & other ) const ;
//! Multiply by another matrix.
//! Multiply by another matrix.
/** Like calling: (*this) = (*this) * other
/** Like calling: (*this) = (*this) * other
*/
*/
CMatrix4 < T > & operator * = ( const CMatrix4 < T > & other ) ;
CMatrix4 < T > & operator * = ( const CMatrix4 < T > & other ) ;
@ -189,10 +189,10 @@ namespace core
//! Get the rotation, as set by setRotation() when you already know the scale used to create the matrix
//! Get the rotation, as set by setRotation() when you already know the scale used to create the matrix
/** NOTE: The scale needs to be the correct one used to create this matrix.
/** NOTE: The scale needs to be the correct one used to create this matrix.
You can _not_ use the result of getScale(), but have to save your scale
You can _not_ use the result of getScale(), but have to save your scale
variable in another place (like ISceneNode does).
variable in another place (like ISceneNode does).
NOTE: No scale value can be 0 or the result is undefined.
NOTE: No scale value can be 0 or the result is undefined.
NOTE: It does not necessarily return the *same* Euler angles as those set by setRotationDegrees(),
NOTE: It does not necessarily return the *same* Euler angles as those set by setRotationDegrees(),
but the rotation will be equivalent, i.e. will have the same result when used to rotate a vector or node.
but the rotation will be equivalent, i.e. will have the same result when used to rotate a vector or node.
NOTE: It will (usually) give wrong results when further transformations have been added in the matrix (like shear).
NOTE: It will (usually) give wrong results when further transformations have been added in the matrix (like shear).
WARNING: There have been troubles with this function over the years and we may still have missed some corner cases.
WARNING: There have been troubles with this function over the years and we may still have missed some corner cases.
@ -202,9 +202,9 @@ namespace core
//! Returns the rotation, as set by setRotation().
//! Returns the rotation, as set by setRotation().
/** NOTE: You will have the same end-rotation as used in setRotation, but it might not use the same axis values.
/** NOTE: You will have the same end-rotation as used in setRotation, but it might not use the same axis values.
NOTE: This only works correct if no other matrix operations have been done on the inner 3x3 matrix besides
NOTE: This only works correct if no other matrix operations have been done on the inner 3x3 matrix besides
setting rotation (so no scale/shear). Thought it (probably) works as long as scale doesn't flip handedness.
setting rotation (so no scale/shear). Thought it (probably) works as long as scale doesn't flip handedness.
NOTE: It does not necessarily return the *same* Euler angles as those set by setRotationDegrees(),
NOTE: It does not necessarily return the *same* Euler angles as those set by setRotationDegrees(),
but the rotation will be equivalent, i.e. will have the same result when used to rotate a vector or node.
but the rotation will be equivalent, i.e. will have the same result when used to rotate a vector or node.
*/
*/
core : : vector3d < T > getRotationDegrees ( ) const ;
core : : vector3d < T > getRotationDegrees ( ) const ;
@ -233,7 +233,7 @@ namespace core
//! Translate a vector by the inverse of the translation part of this matrix.
//! Translate a vector by the inverse of the translation part of this matrix.
void inverseTranslateVect ( vector3df & vect ) const ;
void inverseTranslateVect ( vector3df & vect ) const ;
//! Tranform (rotate/scale) a vector by the inverse of the rotation part this matrix
//! Trans form (rotate/scale) a vector by the inverse of the rotation part this matrix
void inverseRotateVect ( vector3df & vect ) const ;
void inverseRotateVect ( vector3df & vect ) const ;
//! Transform (rotate/scale) a vector by the rotation part of this matrix.
//! Transform (rotate/scale) a vector by the rotation part of this matrix.
@ -905,8 +905,8 @@ namespace core
//! Returns a rotation which (mostly) works in combination with the given scale
//! Returns a rotation which (mostly) works in combination with the given scale
/**
/**
This code was originally written by by Chev (assuming no scaling back then,
This code was originally written by by Chev (assuming no scaling back then,
we can be blamed for all problems added by regarding scale)
we can be blamed for all problems added by regarding scale)
*/
*/
template < class T >
template < class T >
@ -952,16 +952,16 @@ namespace core
template < class T >
template < class T >
inline core : : vector3d < T > CMatrix4 < T > : : getRotationDegrees ( ) const
inline core : : vector3d < T > CMatrix4 < T > : : getRotationDegrees ( ) const
{
{
// Note: Using getScale() here make it look like it could do matrix decomposition.
// Note: Using getScale() here make it look like it could do matrix decomposition.
// It can't! It works (or should work) as long as rotation doesn't flip the handedness
// It can't! It works (or should work) as long as rotation doesn't flip the handedness
// aka scale swapping 1 or 3 axes. (I think we could catch that as well by comparing
// aka scale swapping 1 or 3 axes. (I think we could catch that as well by comparing
// crossproduct of first 2 axes to direction of third axis, but TODO)
// cross product of first 2 axes to direction of third axis, but TODO)
// And maybe it should also offer the solution for the simple calculation
// And maybe it should also offer the solution for the simple calculation
// without regarding scaling as Irrlicht did before 1.7
// without regarding scaling as Irrlicht did before 1.7
core : : vector3d < T > scale ( getScale ( ) ) ;
core : : vector3d < T > scale ( getScale ( ) ) ;
// We assume the matrix uses rotations instead of negative scaling 2 axes.
// We assume the matrix uses rotations instead of negative scaling 2 axes.
// Otherwise it fails even for some simple cases, like rotating around
// Otherwise it fails even for some simple cases, like rotating around
// 2 axes by 180<38> which getScale thinks is a negative scaling.
// 2 axes by 180<38> which getScale thinks is a negative scaling.
if ( scale . Y < 0 & & scale . Z < 0 )
if ( scale . Y < 0 & & scale . Z < 0 )
{
{
@ -2092,7 +2092,7 @@ namespace core
core : : vector3df v ( vs ) ;
core : : vector3df v ( vs ) ;
v . normalize ( ) ;
v . normalize ( ) ;
// cosinus angle
// cosine angle
T ca = f . dotProduct ( t ) ;
T ca = f . dotProduct ( t ) ;
core : : vector3df vt ( v * ( 1 - ca ) ) ;
core : : vector3df vt ( v * ( 1 - ca ) ) ;
@ -2153,7 +2153,7 @@ namespace core
// axis multiplication by sin
// axis multiplication by sin
const core : : vector3df vs = look . crossProduct ( from ) ;
const core : : vector3df vs = look . crossProduct ( from ) ;
// cosinus angle
// cosine angle
const f32 ca = from . dotProduct ( look ) ;
const f32 ca = from . dotProduct ( look ) ;
core : : vector3df vt ( up * ( 1.f - ca ) ) ;
core : : vector3df vt ( up * ( 1.f - ca ) ) ;