You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

87 lines
2.8 KiB

#include <igl/read_triangle_mesh.h>
#include <igl/get_seconds.h>
#include <igl/material_colors.h>
#include <igl/swept_volume.h>
#include <igl/opengl/glfw/Viewer.h>
#include <igl/PI.h>
#include <Eigen/Core>
#include <iostream>
int main(int argc, char * argv[])
{
using namespace std;
using namespace igl;
Eigen::MatrixXi F,SF;
Eigen::MatrixXd V,SV,VT;
bool show_swept_volume = false;
// Define a rigid motion
const auto & transform = [](const double t)->Eigen::Affine3d
{
Eigen::Affine3d T = Eigen::Affine3d::Identity();
T.rotate(Eigen::AngleAxisd(t*2.*igl::PI,Eigen::Vector3d(0,1,0)));
T.translate(Eigen::Vector3d(0,0.125*cos(2.*igl::PI*t),0));
return T;
};
// Read in inputs as double precision floating point meshes
read_triangle_mesh(
TUTORIAL_SHARED_PATH "/bunny.off",V,F);
cout<<R"(Usage:
[space] Toggle between transforming original mesh and swept volume
)";
igl::opengl::glfw::Viewer viewer;
viewer.data().set_mesh(V,F);
viewer.data().set_face_based(true);
viewer.core().is_animating = !show_swept_volume;
const int grid_size = 50;
const int time_steps = 200;
const double isolevel = 0.1;
std::cerr<<"Computing swept volume...";
igl::swept_volume(
V,F,transform,time_steps,grid_size,isolevel,SV,SF);
std::cerr<<" finished."<<std::endl;
viewer.callback_pre_draw =
[&](igl::opengl::glfw::Viewer & viewer)->bool
{
if(!show_swept_volume)
{
Eigen::Affine3d T = transform(0.25*igl::get_seconds());
VT = V*T.matrix().block(0,0,3,3).transpose();
Eigen::RowVector3d trans = T.matrix().block(0,3,3,1).transpose();
VT = ( VT.rowwise() + trans).eval();
viewer.data().set_vertices(VT);
viewer.data().compute_normals();
}
return false;
};
viewer.callback_key_down =
[&](igl::opengl::glfw::Viewer & viewer, unsigned char key, int mod)->bool
{
switch(key)
{
default:
return false;
case ' ':
show_swept_volume = !show_swept_volume;
viewer.data().clear();
if(show_swept_volume)
{
viewer.data().set_mesh(SV,SF);
Eigen::Vector3d ambient = Eigen::Vector3d(SILVER_AMBIENT[0], SILVER_AMBIENT[1], SILVER_AMBIENT[2]);
Eigen::Vector3d diffuse = Eigen::Vector3d(SILVER_DIFFUSE[0], SILVER_DIFFUSE[1], SILVER_DIFFUSE[2]);
Eigen::Vector3d specular = Eigen::Vector3d(SILVER_SPECULAR[0], SILVER_SPECULAR[1], SILVER_SPECULAR[2]);
viewer.data().uniform_colors(ambient,diffuse,specular);
}
else
{
viewer.data().set_mesh(V,F);
}
viewer.core().is_animating = !show_swept_volume;
viewer.data().set_face_based(true);
break;
}
return true;
};
viewer.launch();
}