44 #ifndef vpMbHiddenFaces_HH
45 #define vpMbHiddenFaces_HH
47 #include <visp/vpHomogeneousMatrix.h>
48 #include <visp/vpMeterPixelConversion.h>
49 #include <visp/vpPixelMeterConversion.h>
50 #include <visp/vpMbtPolygon.h>
53 #include <visp/vpAROgre.h>
66 template<
class PolygonType = vpMbtPolygon>
70 std::vector<PolygonType *> Lpol ;
74 unsigned int nbVisiblePolygon;
80 std::vector< Ogre::ManualObject* > lOgrePolygons;
83 unsigned int setVisiblePrivate(
const vpHomogeneousMatrix &_cMo,
const double &angleAppears,
const double &angleDisappears,
85 bool useOgre =
false,
bool testRoi =
false,
108 #ifdef VISP_HAVE_OGRE
126 #ifdef VISP_HAVE_OGRE
135 bool isAppearing(
const unsigned int i){
return Lpol[i]->isAppearing(); }
138 #ifdef VISP_HAVE_OGRE
154 bool isVisible(
const unsigned int i){
return Lpol[i]->isVisible(); }
156 #ifdef VISP_HAVE_OGRE
161 inline PolygonType*
operator[](
const unsigned int i) {
return Lpol[i];}
163 inline const PolygonType*
operator[](
const unsigned int i)
const {
return Lpol[i];}
178 #ifdef VISP_HAVE_OGRE
187 inline unsigned int size(){
return Lpol.size(); }
193 template<
class PolygonType>
196 #ifdef VISP_HAVE_OGRE
197 ogreInitialised =
false;
208 template<
class PolygonType>
211 for(
unsigned int i = 0 ; i < Lpol.size() ; i++){
219 #ifdef VISP_HAVE_OGRE
229 template<
class PolygonType>
233 PolygonType *p_new =
new PolygonType;
234 p_new->index = p->index;
235 p_new->setNbPoint(p->nbpt);
236 p_new->isvisible = p->isvisible;
237 for(
unsigned int i = 0; i < p->nbpt; i++)
238 p_new->p[i]= p->p[i];
239 Lpol.push_back(p_new);
249 template<
class PolygonType>
253 nbVisiblePolygon = 0 ;
255 for(
unsigned int i = 0 ; i < Lpol.size() ; i++){
256 if (Lpol[i]->isVisible(_cMo, depthTest)){
260 return nbVisiblePolygon ;
266 template<
class PolygonType>
270 nbVisiblePolygon = 0;
271 for(
unsigned int i = 0 ; i < Lpol.size() ; i++){
294 template<
class PolygonType>
297 bool &changed,
bool useOgre,
bool testRoi,
302 nbVisiblePolygon = 0;
306 std::vector<vpImagePoint> roi;
309 #ifdef VISP_HAVE_OGRE
313 vpTRACE(
"ViSP doesn't have Ogre3D, simple visibility test used");
317 for (
unsigned int i = 0; i < Lpol.size(); i += 1){
318 Lpol[i]->changeFrame(_cMo);
319 Lpol[i]->isappearing =
false;
321 roi = Lpol[i]->getRoi(_cam);
323 if(Lpol[i]->isVisible())
325 bool testDisappear =
false;
332 #ifdef VISP_HAVE_OGRE
333 testDisappear = ((!Lpol[i]->isVisible(_cMo, angleDisappears)) || !isVisibleOgre(cameraPos,i));
335 testDisappear = (!Lpol[i]->isVisible(_cMo, angleDisappears));
338 testDisappear = (!Lpol[i]->isVisible(_cMo, angleDisappears));
345 Lpol[i]->isvisible =
false;
349 Lpol[i]->isvisible =
true;
354 bool testAppear =
true;
361 #ifdef VISP_HAVE_OGRE
362 testAppear = ((Lpol[i]->isVisible(_cMo, angleAppears)) && isVisibleOgre(cameraPos,i));
364 testAppear = (Lpol[i]->isVisible(_cMo, angleAppears));
367 testAppear = (Lpol[i]->isVisible(_cMo, angleAppears));
372 Lpol[i]->isvisible =
true;
377 Lpol[i]->isvisible =
false;
381 return nbVisiblePolygon;
395 template<
class PolygonType>
399 return setVisible(_I, _cam, _cMo, angle, angle, changed);
414 template<
class PolygonType>
418 return setVisiblePrivate(_cMo,angleAppears,angleDisappears,changed,
false,
true,_I,_cam);
431 template<
class PolygonType>
435 return setVisiblePrivate(_cMo,angleAppears,angleDisappears,changed,
false);
438 #ifdef VISP_HAVE_OGRE
444 template<
class PolygonType>
448 ogreInitialised =
true;
450 ogre->
init(ogreBackground,
false,
true);
452 for(
unsigned int n = 0 ; n < Lpol.size(); n++){
453 Ogre::ManualObject* manual = ogre->
getSceneManager()->createManualObject(Ogre::StringConverter::toString(n));
455 manual->begin(
"BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_STRIP);
456 for(
unsigned int i = 0; i < Lpol[n]->nbpt; i++){
457 manual->position( (Ogre::Real)Lpol[n]->p[i].get_oX(), (Ogre::Real)Lpol[n]->p[i].get_oY(), (Ogre::Real)Lpol[n]->p[i].get_oZ());
458 manual->colour(1.0, 1.0, 1.0);
468 ogre->
getSceneManager()->getRootSceneNode()->createChildSceneNode()->attachObject(manual);
470 lOgrePolygons.push_back(manual);
479 template<
class PolygonType>
484 for(
unsigned int i = 0 ; i < Lpol.size() ; i++){
485 if(Lpol[i]->isVisible()){
486 lOgrePolygons[i]->setVisible(
true);
489 lOgrePolygons[i]->setVisible(
false);
491 ogre->
display(ogreBackground, _cMo);
507 template<
class PolygonType>
511 return setVisiblePrivate(_cMo,angleAppears,angleDisappears,changed,
true,
true,_I,_cam);
524 template<
class PolygonType>
528 return setVisiblePrivate(_cMo,angleAppears,angleDisappears,changed,
true);
539 template<
class PolygonType>
545 if(Lpol[index]->getNbPoint() <= 2){
546 lOgrePolygons[index]->setVisible(
true);
547 Lpol[index]->isvisible =
true;
551 Ogre::Vector3 camera((Ogre::Real)cameraPos[0],(Ogre::Real)cameraPos[1],(Ogre::Real)cameraPos[2]);
552 if(!ogre->
getCamera()->isVisible(lOgrePolygons[index]->getBoundingBox())){
553 lOgrePolygons[index]->setVisible(
false);
554 Lpol[index]->isvisible =
false;
559 Ogre::Vector3 origin(0,0,0);
560 for(
unsigned int j = 0 ; j < Lpol[index]->getNbPoint() ; j++){
561 Ogre::Vector3 tmp((Ogre::Real)Lpol[index]->getPoint(j).get_oX(), (Ogre::Real)Lpol[index]->getPoint(j).get_oY(), (Ogre::Real)Lpol[index]->getPoint(j).get_oZ());
564 origin /= (Ogre::Real)Lpol[index]->getNbPoint();
565 Ogre::Vector3 direction = origin - camera;
567 Ogre::RaySceneQuery *mRaySceneQuery = ogre->
getSceneManager()->createRayQuery(Ogre::Ray(camera, direction));
568 mRaySceneQuery->setSortByDistance(
true);
570 Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();
571 Ogre::RaySceneQueryResult::iterator it = result.begin();
573 bool visible =
false;
574 if(it != result.end()){
577 if(it->movable->getName().find(
"SimpleRenderable") != Ogre::String::npos)
580 if(it != result.end()){
582 if(it->movable->getName() == Ogre::StringConverter::toString(index)){
590 lOgrePolygons[index]->setVisible(
true);
591 Lpol[index]->isvisible =
true;
594 lOgrePolygons[index]->setVisible(
false);
595 Lpol[index]->isvisible =
false;
600 return Lpol[index]->isvisible;
602 #endif //VISP_HAVE_OGRE
const PolygonType * operator[](const unsigned int i) const
operator[] as reader.
bool isAppearing(const unsigned int i)
Implementation of the polygons management for the model-based trackers.
Ogre::Camera * getCamera()
The class provides a data structure for the homogeneous matrices as well as a set of operations on th...
void setDepthTest(const bool &d)
void setShowConfigDialog(const bool showConfigDialog)
PolygonType * operator[](const unsigned int i)
operator[] as modifier.
void initOgre(vpCameraParameters _cam=vpCameraParameters())
Implementation of an augmented reality viewer.
bool renderOneFrame(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMw)
Ogre::SceneManager * getSceneManager()
virtual void display(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMw)
unsigned int setVisibleOgre(const vpImage< unsigned char > &_I, const vpCameraParameters &_cam, const vpHomogeneousMatrix &_cMo, const double &angleAppears, const double &angleDisappears, bool &changed)
bool isVisibleOgre(const vpTranslationVector &cameraPos, const unsigned int &index)
vpAROgre * getOgreContext()
virtual void init(vpImage< unsigned char > &I, bool bufferedKeys=false, bool hidden=false)
void setCameraParameters(const vpCameraParameters &cameraP)
Generic class defining intrinsic camera parameters.
void extract(vpRotationMatrix &R) const
unsigned int getNbVisiblePolygon()
void addPolygon(PolygonType *p)
unsigned int setVisible(const vpHomogeneousMatrix &_cMo)
vpHomogeneousMatrix inverse() const
bool isVisible(const unsigned int i)
void displayOgre(const vpHomogeneousMatrix &_cMo)
static bool roiInsideImage(const vpImage< unsigned char > &I, const std::vector< vpImagePoint > &corners)
Class that consider the case of a translation vector.
std::vector< PolygonType * > & getPolygon()