Browse Source

Better parameter names in Matrix transformation methods.

Mainly it is now explicitly stated in parameter name that rotation axis
must be normalized.
pull/7/head
Vladimír Vondruš 14 years ago
parent
commit
f707e91599
  1. 16
      src/Math/Matrix3.h
  2. 50
      src/Math/Matrix4.h
  3. 2
      src/Math/Test/Matrix4Test.cpp

16
src/Math/Matrix3.h

@ -36,37 +36,37 @@ template<class T> class Matrix3: public Matrix<3, T> {
public: public:
/** /**
* @brief 2D translation matrix * @brief 2D translation matrix
* @param vec Translation vector * @param vector Translation vector
* *
* @see translation(), Matrix4::translation(const Vector3&), * @see translation(), Matrix4::translation(const Vector3&),
* Vector2::xAxis(), Vector2::yAxis() * Vector2::xAxis(), Vector2::yAxis()
*/ */
inline constexpr static Matrix3<T> translation(const Vector2<T>& vec) { inline constexpr static Matrix3<T> translation(const Vector2<T>& vector) {
return Matrix3<T>( /* Column-major! */ return Matrix3<T>( /* Column-major! */
T(1), T(0), T(0), T(1), T(0), T(0),
T(0), T(1), T(0), T(0), T(1), T(0),
vec.x(), vec.y(), T(1) vector.x(), vector.y(), T(1)
); );
} }
/** /**
* @brief 2D scaling matrix * @brief 2D scaling matrix
* @param vec Scaling vector * @param vector Scaling vector
* *
* @see rotationScaling() const, Matrix4::scaling(const Vector3&), * @see rotationScaling() const, Matrix4::scaling(const Vector3&),
* Vector2::xScale(), Vector2::yScale() * Vector2::xScale(), Vector2::yScale()
*/ */
inline constexpr static Matrix3<T> scaling(const Vector2<T>& vec) { inline constexpr static Matrix3<T> scaling(const Vector2<T>& vector) {
return Matrix3<T>( /* Column-major! */ return Matrix3<T>( /* Column-major! */
vec.x(), T(0), T(0), vector.x(), T(0), T(0),
T(0), vec.y(), T(0), T(0), vector.y(), T(0),
T(0), T(0), T(1) T(0), T(0), T(1)
); );
} }
/** /**
* @brief 2D rotation matrix * @brief 2D rotation matrix
* @param angle Rotation angle (counterclockwise, in radians) * @param angle Rotation angle (counterclockwise, in radians)
* *
* @see rotation() const, Matrix4::rotation(T, const Vector3&), deg(), * @see rotation() const, Matrix4::rotation(T, const Vector3&), deg(),
* rad() * rad()

50
src/Math/Matrix4.h

@ -38,40 +38,40 @@ template<class T> class Matrix4: public Matrix<4, T> {
public: public:
/** /**
* @brief 3D translation * @brief 3D translation
* @param vec Translation vector * @param vector Translation vector
* *
* @see translation(), Matrix3::translation(const Vector2&), * @see translation(), Matrix3::translation(const Vector2&),
* Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis() * Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis()
*/ */
inline constexpr static Matrix4<T> translation(const Vector3<T>& vec) { inline constexpr static Matrix4<T> translation(const Vector3<T>& vector) {
return Matrix4<T>( /* Column-major! */ return Matrix4<T>( /* Column-major! */
T(1), T(0), T(0), T(0), T(1), T(0), T(0), T(0),
T(0), T(1), T(0), T(0), T(0), T(1), T(0), T(0),
T(0), T(0), T(1), T(0), T(0), T(0), T(1), T(0),
vec.x(), vec.y(), vec.z(), T(1) vector.x(), vector.y(), vector.z(), T(1)
); );
} }
/** /**
* @brief 3D scaling * @brief 3D scaling
* @param vec Scaling vector * @param vector Scaling vector
* *
* @see rotationScaling() const, Matrix3::scaling(const Vector2&), * @see rotationScaling() const, Matrix3::scaling(const Vector2&),
* Vector3::xScale(), Vector3::yScale(), Vector3::zScale() * Vector3::xScale(), Vector3::yScale(), Vector3::zScale()
*/ */
inline constexpr static Matrix4<T> scaling(const Vector3<T>& vec) { inline constexpr static Matrix4<T> scaling(const Vector3<T>& vector) {
return Matrix4<T>( /* Column-major! */ return Matrix4<T>( /* Column-major! */
vec.x(), T(0), T(0), T(0), vector.x(), T(0), T(0), T(0),
T(0), vec.y(), T(0), T(0), T(0), vector.y(), T(0), T(0),
T(0), T(0), vec.z(), T(0), T(0), T(0), vector.z(), T(0),
T(0), T(0), T(0), T(1) T(0), T(0), T(0), T(1)
); );
} }
/** /**
* @brief 3D rotation around arbitrary axis * @brief 3D rotation around arbitrary axis
* @param angle Rotation angle (counterclockwise, in radians) * @param angle Rotation angle (counterclockwise, in radians)
* @param vec Normalized rotation axis * @param normalizedAxis Normalized rotation axis
* *
* If possible, use faster alternatives like xRotation(), yRotation() * If possible, use faster alternatives like xRotation(), yRotation()
* or zRotation(). * or zRotation().
@ -80,32 +80,32 @@ template<class T> class Matrix4: public Matrix<4, T> {
* @attention Assertion fails on non-normalized rotation vector and * @attention Assertion fails on non-normalized rotation vector and
* identity matrix is returned. * identity matrix is returned.
*/ */
static Matrix4<T> rotation(T angle, const Vector3<T>& vec) { static Matrix4<T> rotation(T angle, const Vector3<T>& normalizedAxis) {
CORRADE_ASSERT(MathTypeTraits<T>::equals(vec.dot(), T(1)), CORRADE_ASSERT(MathTypeTraits<T>::equals(normalizedAxis.dot(), T(1)),
"Math::Matrix4::rotation(): vector must be normalized", {}); "Math::Matrix4::rotation(): axis must be normalized", {});
T sine = std::sin(angle); T sine = std::sin(angle);
T cosine = std::cos(angle); T cosine = std::cos(angle);
T oneMinusCosine = T(1) - cosine; T oneMinusCosine = T(1) - cosine;
T xx = vec.x()*vec.x(); T xx = normalizedAxis.x()*normalizedAxis.x();
T xy = vec.x()*vec.y(); T xy = normalizedAxis.x()*normalizedAxis.y();
T xz = vec.x()*vec.z(); T xz = normalizedAxis.x()*normalizedAxis.z();
T yy = vec.y()*vec.y(); T yy = normalizedAxis.y()*normalizedAxis.y();
T yz = vec.y()*vec.z(); T yz = normalizedAxis.y()*normalizedAxis.z();
T zz = vec.z()*vec.z(); T zz = normalizedAxis.z()*normalizedAxis.z();
return Matrix4<T>( /* Column-major! */ return Matrix4<T>( /* Column-major! */
cosine + xx*oneMinusCosine, cosine + xx*oneMinusCosine,
xy*oneMinusCosine + vec.z()*sine, xy*oneMinusCosine + normalizedAxis.z()*sine,
xz*oneMinusCosine - vec.y()*sine, xz*oneMinusCosine - normalizedAxis.y()*sine,
T(0), T(0),
xy*oneMinusCosine - vec.z()*sine, xy*oneMinusCosine - normalizedAxis.z()*sine,
cosine + yy*oneMinusCosine, cosine + yy*oneMinusCosine,
yz*oneMinusCosine + vec.x()*sine, yz*oneMinusCosine + normalizedAxis.x()*sine,
T(0), T(0),
xz*oneMinusCosine + vec.y()*sine, xz*oneMinusCosine + normalizedAxis.y()*sine,
yz*oneMinusCosine - vec.x()*sine, yz*oneMinusCosine - normalizedAxis.x()*sine,
cosine + zz*oneMinusCosine, cosine + zz*oneMinusCosine,
T(0), T(0),
T(0), T(0), T(0), T(1) T(0), T(0), T(0), T(1)

2
src/Math/Test/Matrix4Test.cpp

@ -97,7 +97,7 @@ void Matrix4Test::rotation() {
Error::setOutput(&o); Error::setOutput(&o);
CORRADE_COMPARE(Matrix4::rotation(deg(-74.0f), {-1.0f, 2.0f, 2.0f}), Matrix4()); CORRADE_COMPARE(Matrix4::rotation(deg(-74.0f), {-1.0f, 2.0f, 2.0f}), Matrix4());
CORRADE_COMPARE(o.str(), "Math::Matrix4::rotation(): vector must be normalized\n"); CORRADE_COMPARE(o.str(), "Math::Matrix4::rotation(): axis must be normalized\n");
Matrix4 matrix( Matrix4 matrix(
0.35612214f, -0.80181062f, 0.47987163f, 0.0f, 0.35612214f, -0.80181062f, 0.47987163f, 0.0f,

Loading…
Cancel
Save