[DEBUG] auqternion and transform error

This commit is contained in:
Edouard DUPIN 2017-05-17 22:41:21 +02:00
parent e81cbbac0b
commit 7037d83d6f
3 changed files with 56 additions and 36 deletions

View File

@ -534,7 +534,7 @@ namespace etk {
* @param[in] _obj2 Second quaternion * @param[in] _obj2 Second quaternion
* @param[in] _ttt linar coefficient interpolation to be such that [0..1] * @param[in] _ttt linar coefficient interpolation to be such that [0..1]
*/ */
Quaternion slerp(const Quaternion& _obj1, const Quaternion& _obj2, float _ttt); static Quaternion slerp(const Quaternion& _obj1, const Quaternion& _obj2, float _ttt);
/** /**
* @brief Configure the quaternion with euler angles. * @brief Configure the quaternion with euler angles.
* @param[out] _angles Eular angle of the quaternion. * @param[out] _angles Eular angle of the quaternion.

View File

@ -0,0 +1,36 @@
/** @file
* @author Edouard DUPIN
* @copyright 2011, Edouard DUPIN, all right reserved
* @license MPL v2.0 (see license file)
*/
#include <etk/types.hpp>
#include <etk/math/Transform3D.hpp>
etk::Transform3D::Transform3D():
m_position(vec3(0.0, 0.0, 0.0)),
m_orientation(Quaternion::identity()) {
}
etk::Transform3D::Transform3D(const vec3& _position, const Matrix3x3& _orientation):
m_position(_position),
m_orientation(Quaternion(_orientation)) {
}
etk::Transform3D::Transform3D(const vec3& _position, const Quaternion& _orientation):
m_position(_position),
m_orientation(_orientation) {
}
etk::Transform3D::Transform3D(const Transform3D& _other):
m_position(_other.m_position),
m_orientation(_other.m_orientation) {
}
etk::Transform3D etk::Transform3D::identity() {
return etk::Transform3D(vec3(0.0, 0.0, 0.0), Quaternion::identity());
}

View File

@ -17,26 +17,14 @@ namespace etk {
*/ */
class Transform3D { class Transform3D {
public: public:
Transform3D(): Transform3D();
m_position(vec3(0.0, 0.0, 0.0)), Transform3D(const vec3& _position, const Matrix3x3& _orientation);
m_orientation(Quaternion::identity()) { Transform3D(const vec3& _position, const Quaternion& _orientation);
Transform3D(const Transform3D& _other);
} /**
Transform3D(const vec3& _position, const Matrix3x3& _orientation): * @brief Get the identity of the transformation
m_position(_position), */
m_orientation(Quaternion(_orientation)) { static Transform3D identity();
}
Transform3D(const vec3& _position, const Quaternion& _orientation):
m_position(_position),
m_orientation(_orientation) {
}
Transform3D(const Transform3D& _other):
m_position(_other.m_position),
m_orientation(_other.m_orientation) {
}
protected: protected:
vec3 m_position; //! Position vec3 m_position; //! Position
public: public:
@ -76,17 +64,17 @@ namespace etk {
/// Get the OpenGL matrix of the transform /// Get the OpenGL matrix of the transform
void getOpenGLMatrix(float* _matrix) const { void getOpenGLMatrix(float* _matrix) const {
const Matrix3x3& matrix = m_orientation.getMatrix(); const Matrix3x3& matrix = m_orientation.getMatrix();
_matrix[0] = matrix[0][0]; _matrix[0] = matrix.m_mat[0];
_matrix[1] = matrix[1][0]; _matrix[1] = matrix.m_mat[3];
_matrix[2] = matrix[2][0]; _matrix[2] = matrix.m_mat[6];
_matrix[3] = 0.0; _matrix[3] = 0.0;
_matrix[4] = matrix[0][1]; _matrix[4] = matrix.m_mat[1];
_matrix[5] = matrix[1][1]; _matrix[5] = matrix.m_mat[4];
_matrix[6] = matrix[2][1]; _matrix[6] = matrix.m_mat[7];
_matrix[7] = 0.0; _matrix[7] = 0.0;
_matrix[8] = matrix[0][2]; _matrix[8] = matrix.m_mat[2];
_matrix[9] = matrix[1][2]; _matrix[9] = matrix.m_mat[5];
_matrix[10] = matrix[2][2]; _matrix[10] = matrix.m_mat[8];
_matrix[11] = 0.0; _matrix[11] = 0.0;
_matrix[12] = m_position.x(); _matrix[12] = m_position.x();
_matrix[13] = m_position.y(); _matrix[13] = m_position.y();
@ -103,17 +91,13 @@ namespace etk {
Transform3D interpolateTransforms(const Transform3D& _old, Transform3D interpolateTransforms(const Transform3D& _old,
const Transform3D& _new, const Transform3D& _new,
float _interpolationFactor) { float _interpolationFactor) {
vec3 interPosition = _old.m_position * (decimal(1.0) - _interpolationFactor) + vec3 interPosition = _old.m_position * (1.0f - _interpolationFactor) +
_new.m_position * _interpolationFactor; _new.m_position * _interpolationFactor;
Quaternion interOrientation = Quaternion::slerp(_old.m_orientation, Quaternion interOrientation = Quaternion::slerp(_old.m_orientation,
_naw.m_orientation, _new.m_orientation,
_interpolationFactor); _interpolationFactor);
return Transform3D(interPosition, interOrientation); return Transform3D(interPosition, interOrientation);
} }
/// Return the identity transform
Transform3D identity() {
return Transform3D(vec3(0, 0, 0), Quaternion::identity());
}
/// Return the transformed vector /// Return the transformed vector
vec3 operator*(const vec3& _vector) const { vec3 operator*(const vec3& _vector) const {
return (m_orientation.getMatrix() * _vector) + m_position; return (m_orientation.getMatrix() * _vector) + m_position;