Changeset 751 for GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/LBBCKMeansClusterGenerator.cpp
- Timestamp:
- 04/19/06 00:27:14 (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Illum/IBRBillboardCloudTrees/OGRE/src/LBBCKMeansClusterGenerator.cpp
r721 r751 74 74 void KMeansClusterGenerator::recomputeBillboard(BBC::BillboardPtr billboard) 75 75 { 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 86 76 BillboardKMeansClusterData *billboardClusterData = (BillboardKMeansClusterData*)billboard->getBillboardClusterData().get(); 87 77 BBC::EntityClusterPtr entityCluster = billboardClusterData->getEntityCluster(); 88 78 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; 95 116 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 } 114 128 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; 152 148 currY = mA * lastY; 153 149 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 } 169 178 } 170 179
Note: See TracChangeset
for help on using the changeset viewer.