示例#1
0
void hsMatrix44::MakeCameraMatrices(const hsPoint3& from, const hsPoint3& at, const hsVector3& up, hsMatrix44& worldToCamera, hsMatrix44& cameraToWorld)
{
    hsVector3 dirZ(&at, &from);

    hsVector3 dirX(dirZ % up);
    dirX.Normalize();

    hsVector3 dirY(dirX % dirZ);
    dirY.Normalize();

    worldToCamera.Reset(false);
    cameraToWorld.Reset(false);
    int i;
    for( i = 0; i < 3; i++ )
    {
        worldToCamera.fMap[0][i] = dirX[i];
        worldToCamera.fMap[1][i] = dirY[i];
        worldToCamera.fMap[2][i] = dirZ[i];

        cameraToWorld.fMap[i][0] = dirX[i];
        cameraToWorld.fMap[i][1] = dirY[i];
        cameraToWorld.fMap[i][2] = dirZ[i];
    }
    hsPoint3 trans = -from;
    worldToCamera.fMap[0][3] = dirX.InnerProduct(trans);
    worldToCamera.fMap[1][3] = dirY.InnerProduct(trans);
    worldToCamera.fMap[2][3] = dirZ.InnerProduct(trans);

    cameraToWorld.fMap[0][3] = from.fX;
    cameraToWorld.fMap[1][3] = from.fY;
    cameraToWorld.fMap[2][3] = from.fZ;
}
示例#2
0
//
// Camera matrix
//
hsMatrix44& hsMatrix44::MakeCameraUpPreserving(const hsPoint3* from, const hsPoint3* at,
                                                    const hsVector3* up)
{
    hsVector3 dirZ(at, from);
    hsVector3 trans( -from->fX, -from->fY, -from->fZ );
    hsVector3 dirY( up->fX, up->fY, up->fZ );
    hsVector3 dirX;
    hsMatrix44 rmat;
    
    dirX =   dirY % dirZ;
    dirX.Normalize();

    dirY.Normalize();
    dirZ = dirX % dirY;
    dirZ.Normalize();

    this->Reset();
    this->Translate(&trans);
    rmat.Reset();
    for(int i = 0; i < 3; i++)
    {
        rmat.fMap[0][i] = -dirX[i];
        rmat.fMap[1][i] = dirY[i];
        rmat.fMap[2][i] = dirZ[i];
    }
    rmat.NotIdentity();
    *this = rmat * *this;
    return *this;
}
示例#3
0
//
// Camera matrix
//
hsMatrix44& hsMatrix44::MakeCamera(const hsPoint3* from, const hsPoint3* at,
                                                    const hsVector3* up)
{
    hsVector3 dirZ(at, from);
    hsVector3 trans( -from->fX, -from->fY, -from->fZ );
    hsVector3 dirY, dirX;
    hsMatrix44 rmat;
    
    dirX = (*up) % dirZ; // Stop passing in down!!! // mf_flip_up - mf
    if (dirX.MagnitudeSquared())
        dirX.Normalize();

    if (dirZ.MagnitudeSquared())
        dirZ.Normalize();
    dirY = dirZ % dirX;
    if (dirY.MagnitudeSquared())
        dirY.Normalize();

    this->Reset();
    this->Translate(&trans);
    rmat.Reset();
    for(int i = 0; i < 3; i++)
    {
        rmat.fMap[0][i] = -dirX[i];
        rmat.fMap[1][i] = dirY[i];
        rmat.fMap[2][i] = dirZ[i];
    }
    rmat.NotIdentity();
    *this = rmat * *this;
    return *this;
}
bool ContactDistanceCalc<BasicTraits,BVOL,Metric>::InitDouble 
(GroupType* g0, const TransformType& m0, const TransformType& f0, 
 GroupType* g1, const TransformType& m1, const TransformType& f1)
{
   // transformation matrix model1 to model0
   // m0^(-1) * m1
   if (!m_M1ToM0.invertFrom(m0)) {
      return false;
   }
   m_M1ToM0.mult(m1);
   // m1^(-1) * m0
   m_M0ToM1.invertFrom(m_M1ToM0);
   m_M0 = m0;

   u32 k, kk;
   VectorClass trans(m_M1ToM0[3][0], m_M1ToM0[3][1], m_M1ToM0[3][2]);
   VectorClass dirX(m_M1ToM0[0][0], m_M1ToM0[0][1], m_M1ToM0[0][2]);
   VectorClass dirY(m_M1ToM0[1][0], m_M1ToM0[1][1], m_M1ToM0[1][2]);
   VectorClass dirZ(m_M1ToM0[2][0], m_M1ToM0[2][1], m_M1ToM0[2][2]);
   for (k=0; k<BVOL::Size; ++k) {
      m_proj[k][0]  = BVOL::getDirection()[k].dot(dirX);
      m_proj[k][1]  = BVOL::getDirection()[k].dot(dirY);
      m_proj[k][2]  = BVOL::getDirection()[k].dot(dirZ);
      m_M1Offset[k] = BVOL::getDirection()[k].dot(trans);
   }

#if 0
   for (k=0, kk=BVOL::Size; k<BVOL::Size; ++k, ++kk) {
      m_M1ToM0.mult(BVOL::getDirection()[k], m_M1Direction[k]);
      m_M1Direction[kk] = -m_M1Direction[k]; 
   }
#endif
   m_scale = m_proj[0].length();

   u32 i;
   Real value, maxValue, sx, sy;
   for (k=0, kk=BVOL::Size; k<BVOL::Size; ++k, ++kk) {
      // calc remapping m_perm
      m_perm[k] = 0;
      maxValue = m_proj[k].dot(BVOL::getDirection()[0]); 
      for (i=1; i<2*BVOL::Size; ++i) {
	 if ((value=m_proj[k].dot(BVOL::getDirection()[i])) > maxValue) {
	    maxValue  = value;
	    m_perm[k] = i;
	 }
      }
      if (m_perm[k] < BVOL::Size) {
	 m_perm[kk] = m_perm[k]+BVOL::Size;
      } else {
	 m_perm[kk] = m_perm[k]-BVOL::Size;
      }

      maxValue /= m_scale;
      // mask
      for (m_mask[k]=0; m_mask[k]<OccTableHighestBit; ++m_mask[k]) {
	 if (maxValue >= BVOL::unitDopAngleTable()[m_mask[k]]) {
            break;
	 }
      }
      m_mask[kk] = m_mask[k];
#ifdef GV_WITH_SUBCONES
      // calc ring section index m_submask[k],m_submask[kk]
      dirZ = BVOL::getDirection()[m_perm[k]]-(maxValue*m_scale)*m_proj[k];
      m_M1ToM0.mult(BVOL::BVolGeometry::getFrameX()[m_perm[k]], dirX);
      //dirX -= dirX.dot(BVOL::getDirection()[k])*M1Direction[m_perm[k]];
      //dirX = BVOL::BVolGeometry::getFrameX()[k];
      m_M1ToM0.mult(BVOL::BVolGeometry::getFrameY()[m_perm[k]], dirY);
      //dirY -= dirY.dot(BVOL::getDirection()[k])*M1Direction[m_perm[k]];
      //dirY = BVOL::BVolGeometry::getFrameY()[k];
      sx = dirZ.dot(dirX)/(dirZ.length()*dirX.length());
      sy = dirZ.dot(dirY)/(dirZ.length()*dirY.length());
      //std::cout << "k=" << k << ": (" << sx << ", " << sy << ")" << std::endl;
      m_submask[k] = (sx < 0 ? 2 : 0) 
	+ (sx <  0 && sy >= 0 ? 1 : 0) 
	+ (sx >= 0 && sy <  0 ? 1 : 0);
      assert(m_submask[k] < 4);
      if (m_submask[k] < 2) {
         m_submask[kk] = m_submask[k]+2;
      } else {
         m_submask[kk] = m_submask[k]-2;
      }
      assert(m_submask[kk] < 4);
#endif
   }
   m_intersect = false;

   return true;
}