Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vuSphVwFlt_Blend.cpp

Go to the documentation of this file.
00001 #include "vuSphVwFlt_Blend.h"
00002 #include <math.h>
00003 
00004 template <int S, class T>
00005 vuSphVwFlt_Blend<S,T>::vuSphVwFlt_Blend()
00006 {
00007 }
00008 
00009 template <int S, class T>
00010 vuSphVwFlt_Blend<S,T>::vuSphVwFlt_Blend(const vuString& filterName)
00011   : vuSphericViewFilter<S,T>(filterName)
00012 {
00013 }
00014 
00015 template <int S, class T>
00016 void vuSphVwFlt_Blend<S,T>::filter(vuCamera *camera)
00017 { 
00018   if (m_NumberOfViews > 0) {
00019     float *factors  = new float[m_NumberOfViews];
00020     float sum       = 0.0f;
00021     vuVector cameraLookAt = camera->getLookAtVector().makeUnit();
00022     vuVector cameraUp     = camera->getUpVector().makeUnit();
00023     vuVector cameraRight  = camera->getRightVector().makeUnit();
00024 
00025     // calculating the factors
00026     for (dword i=0; i<m_NumberOfViews; i++) {
00027       factors[i] = _factor(i, cameraLookAt);
00028       sum       += factors[i];
00029       cerr << factors[i] << ", ";
00030     }
00031     // normalize the factors
00032     for (dword i=0; i<m_NumberOfViews; i++) factors[i] /= sum;
00033 
00034     vuVector viewUp;
00035     float angle, dot;
00036 
00037     // calulate first view
00038     *m_Image  = *m_Views[0]->getMap();
00039     *m_Image *= factors[0];
00040 
00041     viewUp = m_Views[0]->getUp().makeUnit();
00042     angle  = acos(cameraUp.dot(viewUp)) * 180 / M_PI;
00043     dot    = cameraRight.dot(viewUp);
00044     if (dot >= 0) angle *= -1;
00045     m_Image->rotate(angle);
00046 
00047     // calculate rest...
00048     if (m_NumberOfViews > 1) {
00049       vuFixelMap<S,T> tmp(m_Image->getWidth(), m_Image->getHeight()); 
00050       
00051       for (dword i=1; i<m_NumberOfViews; i++) {
00052         viewUp = m_Views[i]->getUp().makeUnit();
00053         angle  = acos(cameraUp.dot(viewUp)) * 180 / M_PI;
00054         dot    = cameraRight.dot(viewUp);
00055         if ( dot >= 0) angle *= -1;
00056 
00057         tmp    = *m_Views[i]->getMap();
00058         tmp   *= factors[i];
00059         tmp.rotate(angle);
00060 
00061         *m_Image += tmp;
00062       }
00063     }
00064   }
00065   else
00066     log("vuSphVwFlt_Blend.filter(): m_NumberOfViews=0");
00067 }
00068 
00069 template <int S, class T>
00070 float vuSphVwFlt_Blend<S,T>::_factor(dword idx, const vuVector &XX)
00071 {
00072   float    result   = 1.0f;
00073   vuVector XXj      = m_Views[idx]->getLookFrom().makeUnit() * -1;
00074   vuVector XXi;
00075 
00076   for (dword i=0; i < m_NumberOfViews; i++) {
00077     if (i != idx) {
00078       XXi     = m_Views[i]->getLookFrom().makeUnit() * -1;
00079       result *= ((XX - XXi).norm() / (XXj - XXi).norm());
00080     }
00081   }
00082   return result;
00083 }

Generated on Wed Dec 15 21:20:37 2004 for vuVolume by  doxygen 1.3.9.1