Ignore:
Timestamp:
04/19/06 00:27:14 (18 years ago)
Author:
igarcia
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/LBBCKMeansClusterGenerator.cpp

    r721 r751  
    7474void KMeansClusterGenerator::recomputeBillboard(BBC::BillboardPtr billboard) 
    7575{ 
    76         Ogre::Matrix3 nmii = Ogre::Matrix3::ZERO; 
    77         Ogre::Matrix3 nmiiSum = Ogre::Matrix3::ZERO; 
    78         Ogre::Matrix3 miiSum = Ogre::Matrix3::ZERO; 
    79         Ogre::Matrix3 mii = Ogre::Matrix3::ZERO;         
    80         Ogre::Matrix3 mijSum = Ogre::Matrix3::ZERO; 
    81         Ogre::Matrix3 mij = Ogre::Matrix3::ZERO;  
    82         Ogre::Vector3 lastY = Ogre::Vector3::ZERO; 
    83         Ogre::Vector3 piSum = Ogre::Vector3::ZERO; 
    84         Ogre::Vector3 normSum = Ogre::Vector3::ZERO; 
    85  
    8676        BillboardKMeansClusterData *billboardClusterData = (BillboardKMeansClusterData*)billboard->getBillboardClusterData().get();                      
    8777        BBC::EntityClusterPtr entityCluster = billboardClusterData->getEntityCluster(); 
    8878 
    89         for (unsigned int iLeaf = 0; iLeaf < entityCluster->getNumEntitiesClusterData(); iLeaf++) 
    90         { 
    91                 Leaf* leaf = (Leaf*)entityCluster->getEntityClusterData(iLeaf)->getEntity().get(); 
    92                 Ogre::Vector3 pi = leaf->getPosition();  
    93                 Ogre::Vector3 norm2 = leaf->getLeafNormal();     
    94                 piSum = piSum + pi * (1.0 / (float)entityCluster->getNumEntitiesClusterData()); 
     79        if (entityCluster->getNumEntitiesClusterData() > 1) 
     80        { 
     81                Ogre::Matrix3 nmii = Ogre::Matrix3::ZERO; 
     82                Ogre::Matrix3 nmiiSum = Ogre::Matrix3::ZERO; 
     83                Ogre::Matrix3 miiSum = Ogre::Matrix3::ZERO; 
     84                Ogre::Matrix3 mii = Ogre::Matrix3::ZERO;         
     85                Ogre::Matrix3 mijSum = Ogre::Matrix3::ZERO; 
     86                Ogre::Matrix3 mij = Ogre::Matrix3::ZERO;  
     87                Ogre::Vector3 lastY = Ogre::Vector3::ZERO; 
     88                Ogre::Vector3 piSum = Ogre::Vector3::ZERO; 
     89                Ogre::Vector3 normSum = Ogre::Vector3::ZERO; 
     90 
     91                for (unsigned int iLeaf = 0; iLeaf < entityCluster->getNumEntitiesClusterData(); iLeaf++) 
     92                { 
     93                        Leaf* leaf = (Leaf*)entityCluster->getEntityClusterData(iLeaf)->getEntity().get(); 
     94                        Ogre::Vector3 pi = leaf->getPosition();  
     95                        Ogre::Vector3 norm2 = leaf->getLeafNormal();     
     96                        piSum = piSum + pi * (1.0 / (float)entityCluster->getNumEntitiesClusterData()); 
     97                                 
     98                        mii[0][0] = pi.x * pi.x; 
     99                        mii[0][1] = pi.x * pi.y; 
     100                        mii[0][2] = pi.x * pi.z; 
     101                        mii[1][0] = pi.y * pi.x; 
     102                        mii[1][1] = pi.y * pi.y; 
     103                        mii[1][2] = pi.y * pi.z; 
     104                        mii[2][0] = pi.z * pi.x; 
     105                        mii[2][1] = pi.z * pi.y; 
     106                        mii[2][2] = pi.z * pi.z;         
     107                        nmii[0][0] = norm2.x * norm2.x; 
     108                        nmii[0][1] = norm2.x * norm2.y; 
     109                        nmii[0][2] = norm2.x * norm2.z; 
     110                        nmii[1][0] = norm2.y * norm2.x; 
     111                        nmii[1][1] = norm2.y * norm2.y; 
     112                        nmii[1][2] = norm2.y * norm2.z; 
     113                        nmii[2][0] = norm2.z * norm2.x; 
     114                        nmii[2][1] = norm2.z * norm2.y; 
     115                        nmii[2][2] = norm2.z * norm2.z;  
    95116                         
    96                 mii[0][0] = pi.x * pi.x; 
    97                 mii[0][1] = pi.x * pi.y; 
    98                 mii[0][2] = pi.x * pi.z; 
    99                 mii[1][0] = pi.y * pi.x; 
    100                 mii[1][1] = pi.y * pi.y; 
    101                 mii[1][2] = pi.y * pi.z; 
    102                 mii[2][0] = pi.z * pi.x; 
    103                 mii[2][1] = pi.z * pi.y; 
    104                 mii[2][2] = pi.z * pi.z;         
    105                 nmii[0][0] = norm2.x * norm2.x; 
    106                 nmii[0][1] = norm2.x * norm2.y; 
    107                 nmii[0][2] = norm2.x * norm2.z; 
    108                 nmii[1][0] = norm2.y * norm2.x; 
    109                 nmii[1][1] = norm2.y * norm2.y; 
    110                 nmii[1][2] = norm2.y * norm2.z; 
    111                 nmii[2][0] = norm2.z * norm2.x; 
    112                 nmii[2][1] = norm2.z * norm2.y; 
    113                 nmii[2][2] = norm2.z * norm2.z;  
     117                        nmiiSum = nmiiSum + ( nmii * (1.0 / (float)entityCluster->getNumEntitiesClusterData())); 
     118 
     119                        miiSum = miiSum + ( mii * (1.0 / (float)entityCluster->getNumEntitiesClusterData())); 
     120 
     121                        // Generate the initial value for the iterative method as the average... 
     122                        Ogre::Vector3 norm = leaf->getLeafNormal(); 
     123                        lastY = lastY + norm; 
     124 
     125                        // Generate the sum normal of all the leaves associated to the plane... 
     126                        normSum = normSum + norm; 
     127                } 
    114128                 
    115                 nmiiSum = nmiiSum + ( nmii * (1.0 / (float)entityCluster->getNumEntitiesClusterData())); 
    116  
    117                 miiSum = miiSum + ( mii * (1.0 / (float)entityCluster->getNumEntitiesClusterData())); 
    118  
    119                 // Generate the initial value for the iterative method as the average... 
    120                 Ogre::Vector3 norm = leaf->getLeafNormal(); 
    121                 lastY = lastY + norm; 
    122  
    123                 // Generate the sum normal of all the leaves associated to the plane... 
    124                 normSum = normSum + norm; 
    125         } 
    126          
    127         mijSum[0][0] = piSum.x * piSum.x; 
    128         mijSum[0][1] = piSum.x * piSum.y; 
    129         mijSum[0][2] = piSum.x * piSum.z; 
    130         mijSum[1][0] = piSum.y * piSum.x; 
    131         mijSum[1][1] = piSum.y * piSum.y; 
    132         mijSum[1][2] = piSum.y * piSum.z; 
    133         mijSum[2][0] = piSum.z * piSum.x; 
    134         mijSum[2][1] = piSum.z * piSum.y; 
    135         mijSum[2][2] = piSum.z * piSum.z;        
    136  
    137         Ogre::Matrix3 mA = miiSum - mijSum; 
    138         mA = mA - (mAlpha * nmiiSum); 
    139         mA = mA.Inverse(); 
    140  
    141         lastY.normalise(); 
    142         normSum.normalise(); 
    143  
    144         // Apply the iterative approach 
    145         Ogre::Vector3 currY; 
    146         currY = mA * lastY; 
    147         currY.normalise(); 
    148  
    149         for(unsigned int icount = 0; icount < 100; icount++) 
    150         { 
    151                 lastY = currY; 
     129                mijSum[0][0] = piSum.x * piSum.x; 
     130                mijSum[0][1] = piSum.x * piSum.y; 
     131                mijSum[0][2] = piSum.x * piSum.z; 
     132                mijSum[1][0] = piSum.y * piSum.x; 
     133                mijSum[1][1] = piSum.y * piSum.y; 
     134                mijSum[1][2] = piSum.y * piSum.z; 
     135                mijSum[2][0] = piSum.z * piSum.x; 
     136                mijSum[2][1] = piSum.z * piSum.y; 
     137                mijSum[2][2] = piSum.z * piSum.z;        
     138 
     139                Ogre::Matrix3 mA = miiSum - mijSum; 
     140                mA = mA - (mAlpha * nmiiSum); 
     141                mA = mA.Inverse(); 
     142 
     143                lastY.normalise(); 
     144                normSum.normalise(); 
     145 
     146                // Apply the iterative approach 
     147                Ogre::Vector3 currY; 
    152148                currY = mA * lastY; 
    153149                currY.normalise(); 
    154         } 
    155  
    156         // Generate the d parameter... 
    157         float sumD = 0; 
    158         for (unsigned int iLeaf = 0; iLeaf < entityCluster->getNumEntitiesClusterData(); iLeaf++) 
    159         { 
    160                 Leaf* leaf = (Leaf*)entityCluster->getEntityClusterData(iLeaf)->getEntity().get(); 
    161                 Ogre::Vector3 pi = leaf->getPosition();  
    162                 sumD = sumD + pi.dotProduct(currY); 
    163         } 
    164  
    165         sumD = - sumD / (float)entityCluster->getNumEntitiesClusterData(); 
    166  
    167         billboardClusterData->setNormal(currY); 
    168         billboardClusterData->setD(sumD); 
     150 
     151                for(unsigned int icount = 0; icount < 100; icount++) 
     152                { 
     153                        lastY = currY; 
     154                        currY = mA * lastY; 
     155                        currY.normalise(); 
     156                } 
     157 
     158                // Generate the d parameter... 
     159                float sumD = 0; 
     160                for (unsigned int iLeaf = 0; iLeaf < entityCluster->getNumEntitiesClusterData(); iLeaf++) 
     161                { 
     162                        Leaf* leaf = (Leaf*)entityCluster->getEntityClusterData(iLeaf)->getEntity().get(); 
     163                        Ogre::Vector3 pi = leaf->getPosition();  
     164                        sumD = sumD + pi.dotProduct(currY); 
     165                } 
     166 
     167                sumD = - sumD / (float)entityCluster->getNumEntitiesClusterData(); 
     168 
     169                billboardClusterData->setNormal(currY); 
     170                billboardClusterData->setD(sumD); 
     171        } 
     172        else if (entityCluster->getNumEntitiesClusterData() == 1) 
     173        { 
     174                Leaf* leaf = (Leaf*)entityCluster->getEntityClusterData(0)->getEntity().get(); 
     175                billboardClusterData->setNormal(leaf->getLeafNormal()); 
     176                billboardClusterData->setD(leaf->getLeafD()); 
     177        } 
    169178} 
    170179 
Note: See TracChangeset for help on using the changeset viewer.