6 Transform::Transform():
7 position(0.0f, 0.0f, 0.0f),
8 euler(Angle::zero(), Angle::zero(), Angle::zero()),
9 scale(1.0f, 1.0f, 1.0f)
12 Transform Transform::from_matrix(const Matrix &matrix)
15 trn.position = matrix.column(3).slice<3>(0);
17 trn.euler.z = Geometry::atan2<float>(matrix(1, 0), matrix(0, 0));
18 Matrix m = Matrix::rotation(-trn.euler.z, Vector3(0.0f, 0.0f, 1.0f))*matrix;
19 trn.euler.y = Geometry::atan2<float>(m(2, 0), m(0, 0));
20 m = Matrix::rotation(-trn.euler.y, Vector3(0.0f, 1.0f, 0.0f))*m;
21 trn.euler.x = Geometry::atan2<float>(m(2, 1), m(1, 1));
22 m = Matrix::rotation(-trn.euler.x, Vector3(1.0f, 0.0f, 0.0f))*m;
24 trn.scale = Vector3(m(0, 0), m(1, 1), m(2, 2));
29 void Transform::set_position(const Vector3 &p)
34 void Transform::set_euler(const AngleVector3 &e)
39 void Transform::set_rotation(const Angle &angle, const Vector3 &axis)
41 euler = from_matrix(Matrix::rotation(angle, axis)).euler;
44 void Transform::set_scale(float s)
46 set_scale(Vector3(s, s, s));
49 void Transform::set_scale(const Vector3 &s)
54 Matrix Transform::to_matrix() const
57 result.translate(position);
58 result.rotate(euler.z, Vector3(0.0f, 0.0f, 1.0f));
59 result.rotate(euler.y, Vector3(0.0f, 1.0f, 0.0f));
60 result.rotate(euler.x, Vector3(1.0f, 0.0f, 0.0f));
66 Transform::Loader::Loader(Transform &t):
67 DataFile::ObjectLoader<Transform>(t)
69 add("position", &Loader::position);
70 add("euler", &Loader::euler);
71 add("rotation", &Loader::rotation);
72 add("scale_uniform", &Loader::scale_uniform);
73 add("scale", &Loader::scale);
76 void Transform::Loader::position(float x, float y, float z)
78 obj.set_position(Vector3(x, y, z));
81 void Transform::Loader::euler(float x, float y, float z)
83 obj.set_euler(AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z)));
86 void Transform::Loader::rotation(float a, float x, float y, float z)
88 obj.set_rotation(Angle::from_degrees(a), Vector3(x, y, z));
91 void Transform::Loader::scale_uniform(float s)
96 void Transform::Loader::scale(float x, float y, float z)
98 obj.set_scale(Vector3(x, y, z));