well missing stuff from commit before ...

This commit is contained in:
Hartmut Seichter 2019-01-27 15:22:55 +01:00
parent f95231f339
commit ad13cea0ca
5 changed files with 77 additions and 34 deletions

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
*.user
*.user.*
compile_commands.json
*.autosave

View file

@ -47,51 +47,57 @@ struct axisangle_ {
{
}
static const axisangle_ from_matrix(const matrix_<4,4,T>& m)
{
using std::acos;
using std::sqrt;
axisangle_ aa_res;
aa_res.angle = acos((m(0,0) + m(1,1) + m(2,2) - 1) / T(2));
const T m2112 = m(2,1) - m(1,2);
const T m0220 = m(0,2) - m(2,0);
const T m1001 = m(1,0) - m(0,1);
// no singularity check here ...
const T mrot_denom = sqrt( m2112 * m2112 + m0220 * m0220 + m1001 * m1001 );
aa_res.axis.x() = m2112 / mrot_denom;
aa_res.axis.y() = m0220 / mrot_denom;
aa_res.axis.z() = m1001 / mrot_denom;
return aa_res;
}
matrix_<4,4,T> to_matrix() const
{
// TODO ... Somehow buggy!
using std::cos;
using std::sin;
// result
matrix_<4,4,T> rot_mat; rot_mat.set_identity();
axis_type axis_n = axis.normalized(); // always normalize
// return as identity
if (axis.norm() < std::numeric_limits<T>::epsilon()) return rot_mat;
const T cos_a = cos(angle);
const T sin_a = sin(angle);
const T cos_1_a = T(1) - cos_a;
const T f_cos = cos(angle);
rot_mat(0,0) = cos_a + axis_n.x() * axis_n.x() * cos_1_a;
rot_mat(1,1) = cos_a + axis_n.y() * axis_n.y() * cos_1_a;
rot_mat(2,2) = cos_a + axis_n.z() * axis_n.z() * cos_1_a;
const vector3_<T> cos_axis = axis * (T(1) - f_cos);
const vector3_<T> sin_axis = axis * sin(angle);
T v1 = axis_n.x() * axis_n.y() * cos_1_a;
T v2 = axis_n.z() * sin_a;
rot_mat(1,0) = v1 + v2;
rot_mat(0,1) = v1 - v2;
T val = cos_axis.x() * axis.y();
rot_mat(0,1) = val - sin_axis.z();
rot_mat(1,0) = val + sin_axis.z();
v1 = axis_n.x() * axis_n.z() * cos_1_a;
v2 = axis_n.y() * sin_a;
rot_mat(2,0) = v1 - v2;
rot_mat(0,2) = v1 + v2;
val = cos_axis.x() * axis.z();
rot_mat(0,2) = val + sin_axis.z();
rot_mat(2,0) = val - sin_axis.z();
val = cos_axis.y() * axis.z();
rot_mat(1,2) = val - sin_axis.x();
rot_mat(2,1) = val + sin_axis.x();
rot_mat(0,0) = cos_axis[0] * axis[0] + f_cos;
rot_mat(1,1) = cos_axis[1] * axis[1] + f_cos;
rot_mat(2,2) = cos_axis[2] * axis[2] + f_cos;
// R.at(0) = axis[0] * _vCos(0,0)) + f_cos;
// R.at(4) = axis[0] * _vCos(1,0)) - _vSin(2,0));
// R.at(8) = axis[0] * _vCos(2,0)) + _vSin(1,0));
// R.at(1) = (T) ((vec(1,0) * _vCos(0,0)) + _vSin(2,0));
// R.at(5) = (T) ((vec(1,0) * _vCos(1,0)) + f_cos);
// R.at(9) = (T) ((vec(1,0) * _vCos(2,0)) - _vSin(0,0));
// R.at(2) = (T) ((vec(2,0) * _vCos(0,0)) - _vSin(1,0));
// R.at(6) = (T) ((vec(2,0) * _vCos(1,0)) + _vSin(0,0));
// R.at(10)= (T) ((vec(2,0) * _vCos(2,0)) + f_cos);
v1 = axis_n.y() * axis_n.z() * cos_1_a;
v2 = axis_n.x() * sin_a;
rot_mat(2,1) = v1 + v2;
rot_mat(1,2) = v1 - v2;
return rot_mat;
}

View file

@ -56,6 +56,8 @@ public:
void apply(const matrix4x4& m);
void bounds() const;
void reset();
protected:

View file

@ -6,7 +6,21 @@ namespace pw {
void mesh::apply(const matrix4x4 &m)
{
for (auto &v : _vertices)
v = vector4(m * v.homogenous()).project();
v = vector4(m * v.homogenous()).project();
}
void mesh::bounds() const
{
vector3 max_vec = _vertices.front(),min_vec = _vertices.front();
// compute the AABB
for (auto const & v : _vertices) {
max_vec.x() = std::max(v.x(),max_vec.x());
max_vec.y() = std::max(v.y(),max_vec.y());
max_vec.z() = std::max(v.z(),max_vec.z());
min_vec.x() = std::min(v.x(),min_vec.x());
min_vec.y() = std::min(v.y(),min_vec.y());
min_vec.z() = std::min(v.z(),min_vec.z());
}
}

View file

@ -28,6 +28,26 @@ int main(int argc,char **argv) {
std::cout << "z-axis" << std::endl;
aa.axis = pw::vector3::z_axis();
aa.angle = pw::deg_to_rad(45.f);
std::cout << "aa.matrix() = " << std::endl << pw::serialize::matrix(aa.to_matrix()) << std::endl;
std::cout << "from matrix" << std::endl;
pw::matrix4x4f mrot; mrot.zero();
mrot(0,0) = 1;
mrot(2,1) = 1;
mrot(1,2) = -1;
pw::axisanglef aa_fm = pw::axisangle::from_matrix(mrot);
std::cout << pw::serialize::matrix(aa_fm.axis.transposed()) << " " << pw::rad_to_deg(aa_fm.angle) << "deg" << std::endl;
return 0;
}