Esempio n. 1
0
/*!
  Enable to set the position of the 3D plane relative to the virtual camera.
  
  \param _cMt : The pose of the plane relative to the virtual camera.
*/
void
vpImageSimulator::setCameraPosition(const vpHomogeneousMatrix &_cMt)
{
  cMt = _cMt;
  vpRotationMatrix R;
  cMt.extract(R);

  normal_Cam = R * normal_obj;	
  
  visible_result = vpColVector::dotProd(normal_Cam,focal);
  
  for(int i = 0; i < 4; i++)
    pt[i].track(cMt);
  
  vpColVector e1(3) ;
  vpColVector e2(3) ;
  vpColVector facenormal(3) ;

  e1[0] = pt[1].get_X() - pt[0].get_X() ;
  e1[1] = pt[1].get_Y() - pt[0].get_Y() ;
  e1[2] = pt[1].get_Z() - pt[0].get_Z() ;

  e2[0] = pt[2].get_X() - pt[1].get_X() ;
  e2[1] = pt[2].get_Y() - pt[1].get_Y() ;
  e2[2] = pt[2].get_Z() - pt[1].get_Z() ;

  facenormal = vpColVector::crossProd(e1,e2) ;

  double angle = pt[0].get_X()*facenormal[0] +  pt[0].get_Y()*facenormal[1]  +  pt[0].get_Z()*facenormal[2]  ;

  if (angle > 0)
    visible=true;
  else 
    visible=false;

  if(visible)
  {
    for(int i = 0; i < 4; i++)
    {
      project(X[i],cMt,X2[i]);
      pt[i].track(cMt);
    }

    vbase_u = X2[1]-X2[0];
    vbase_v = X2[3]-X2[0];

    distance = vpColVector::dotProd(normal_Cam,X2[1]);
    
    if(distance < 0)
    {
      visible = false;
      return;
    }

    for(int i = 0; i < 3; i++)
    {
      normal_Cam_optim[i] = normal_Cam[i];
      X0_2_optim[i] = X2[0][i];
      vbase_u_optim[i] = vbase_u[i];
      vbase_v_optim[i] = vbase_v[i];
    }
    
    vpImagePoint iPa[4];
    for(int i = 0; i < 4; i++)
    {
      iPa[i].set_j(X2[i][0]/X2[i][2]);
      iPa[i].set_i(X2[i][1]/X2[i][2]);
    }
    
    T1.buildFrom(iPa[0],iPa[1],iPa[3]);
    T2.buildFrom(iPa[2],iPa[1],iPa[3]);
  }
}
Esempio n. 2
0
/*!
  Enable to set the position of the 3D plane relative to the virtual camera.
  
  \param cMt_ : The pose of the plane relative to the virtual camera.
*/
void
vpImageSimulator::setCameraPosition(const vpHomogeneousMatrix &cMt_)
{
  cMt = cMt_;
  vpRotationMatrix R;
  cMt.extract(R);
  needClipping = false;

  normal_Cam = R * normal_obj;	
  
  visible_result = vpColVector::dotProd(normal_Cam,focal);
  
  for(unsigned int i = 0; i < 4; i++)
    pt[i].track(cMt);
  
  vpColVector e1(3) ;
  vpColVector e2(3) ;
  vpColVector facenormal(3) ;

  e1[0] = pt[1].get_X() - pt[0].get_X() ;
  e1[1] = pt[1].get_Y() - pt[0].get_Y() ;
  e1[2] = pt[1].get_Z() - pt[0].get_Z() ;

  e2[0] = pt[2].get_X() - pt[1].get_X() ;
  e2[1] = pt[2].get_Y() - pt[1].get_Y() ;
  e2[2] = pt[2].get_Z() - pt[1].get_Z() ;

  facenormal = vpColVector::crossProd(e1,e2) ;

  double angle = pt[0].get_X()*facenormal[0] +  pt[0].get_Y()*facenormal[1]  +  pt[0].get_Z()*facenormal[2]  ;

  if (angle > 0){
    visible=true;
  }
  else {
    visible=false;
  }

  if(visible)
  {
    for(unsigned int i = 0; i < 4; i++)
    {
      project(X[i],cMt,X2[i]);
      pt[i].track(cMt);
      if(pt[i].get_Z() < 0)
        needClipping = true;
    }

    vbase_u = X2[1]-X2[0];
    vbase_v = X2[3]-X2[0];

    distance = vpColVector::dotProd(normal_Cam,X2[1]);
    

    if(distance < 0)
    {
      visible = false;
      return;
    }

    for(unsigned int i = 0; i < 3; i++)
    {
      normal_Cam_optim[i] = normal_Cam[i];
      X0_2_optim[i] = X2[0][i];
      vbase_u_optim[i] = vbase_u[i];
      vbase_v_optim[i] = vbase_v[i];
    }

    std::vector<vpPoint> *ptPtr = &pt;
    if(needClipping){
        vpPolygon3D::getClippedPolygon(pt,ptClipped,cMt,vpPolygon3D::NEAR_CLIPPING);
        ptPtr = &ptClipped;
    }

    listTriangle.clear();
    for(unsigned int i = 1 ; i < (*ptPtr).size()-1 ; i++){
      vpImagePoint ip1, ip2, ip3;
      ip1.set_j((*ptPtr)[0].get_x());
      ip1.set_i((*ptPtr)[0].get_y());

      ip2.set_j((*ptPtr)[i].get_x());
      ip2.set_i((*ptPtr)[i].get_y());

      ip3.set_j((*ptPtr)[i+1].get_x());
      ip3.set_i((*ptPtr)[i+1].get_y());

      vpTriangle tri(ip1,ip2,ip3);
      listTriangle.push_back(tri);
    }
  }
}