- Timestamp:
- Nov 22, 2005, 3:19:00 PM (19 years ago)
- Location:
- branches/collision_detection/src/lib/collision_detection
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/collision_detection/src/lib/collision_detection/bounding_volume.cc
r5704 r5706 17 17 18 18 #include "bounding_volume.h" 19 #include "vector.h"20 19 21 20 using namespace std; … … 27 26 BoundingVolume::BoundingVolume () 28 27 { 29 this->setClassID(CL_BOUNDING_VOLUME, "BoundingVolume"); 30 this->center = new Vector(); 31 this->vertices = NULL; 28 this->setClassID(CL_BOUNDING_VOLUME, "BoundingVolume"); 29 this->vertices = NULL; 32 30 } 33 31 … … 39 37 BoundingVolume::~BoundingVolume () 40 38 { 41 // delete what has to be deleted here42 delete this->center;43 44 39 if( this->triangleIndexes) 45 40 delete[] this->triangleIndexes; -
branches/collision_detection/src/lib/collision_detection/bounding_volume.h
r5704 r5706 11 11 #include "abstract_model.h" 12 12 13 class Vector; 13 14 14 template<class T> class tList; 15 15 … … 22 22 virtual ~BoundingVolume(); 23 23 24 inline const Vector *getCenter() const { return this->center; }24 inline const Vector& getCenter() const { return this->center; } 25 25 26 26 const sVec3D* getVertices() const { return this->vertices; } … … 32 32 33 33 public: 34 Vector *center; //!< Center point of box34 Vector center; //!< Center point of box 35 35 36 36 const sVec3D* vertices; //!< if CD_STORE_VERTICES enabled, this is the place, where the vert. will be sotred -
branches/collision_detection/src/lib/collision_detection/obb_tree_node.cc
r5705 r5706 232 232 Vector t1, t2; //!< temporary values 233 233 float covariance[3][3] = {0,0,0, 0,0,0, 0,0,0};//!< the covariance matrix 234 int mode = 0; //!< mode = 0: vertex soup, no connections, mode = 1: 3 following verteces build a triangle 235 236 this->numOfVertices = length; 237 this->vertices = verticesList; 238 239 240 if( likely(mode == 0)) 241 { 242 /* fist compute all the convex hull face/facelets and centroids */ 243 for( int i = 0; i+3 < length ; i+=3) /* FIX-ME-QUICK: hops of 3, array indiscontinuity*/ 244 { 245 p = verticesList[i]; 246 q = verticesList[i + 1]; 247 r = verticesList[i + 2]; 248 249 t1 = p - q; t2 = p - r; 250 251 /* finding the facelet surface via cross-product */ 252 facelet[i] = 0.5f * fabs( t1.cross(t2).len() ); 253 /* update the entire convex hull surface */ 254 face += facelet[i]; 255 256 /* calculate the cetroid of the hull triangles */ 257 centroid[i] = (p + q + r) * 1/3; 258 /* now calculate the centroid of the entire convex hull, weighted average of triangle centroids */ 259 center += centroid[i] * facelet[i]; 260 } 261 /* take the average of the centroid sum */ 262 center /= face; 263 PRINTF(3)("-- Calculated Center\n"); 264 265 266 /* now calculate the covariance matrix - if not written in three for-loops, it would compute faster: minor */ 267 for( int j = 0; j < 3; ++j) 268 { 269 for( int k = 0; k < 3; ++k) 234 235 236 237 /* fist compute all the convex hull face/facelets and centroids */ 238 for( int i = 0; i+3 < length ; i+=3) /* FIX-ME-QUICK: hops of 3, array indiscontinuity*/ 239 { 240 p = verticesList[i]; 241 q = verticesList[i + 1]; 242 r = verticesList[i + 2]; 243 244 t1 = p - q; t2 = p - r; 245 246 /* finding the facelet surface via cross-product */ 247 facelet[i] = 0.5f * fabs( t1.cross(t2).len() ); 248 /* update the entire convex hull surface */ 249 face += facelet[i]; 250 251 /* calculate the cetroid of the hull triangles */ 252 centroid[i] = (p + q + r) * 1/3; 253 /* now calculate the centroid of the entire convex hull, weighted average of triangle centroids */ 254 center += centroid[i] * facelet[i]; 255 } 256 /* take the average of the centroid sum */ 257 center /= face; 258 PRINTF(3)("-- Calculated Center\n"); 259 260 261 /* now calculate the covariance matrix - if not written in three for-loops, 262 it would compute faster: minor */ 263 for( int j = 0; j < 3; ++j) 264 { 265 for( int k = 0; k < 3; ++k) 266 { 267 for( int i = 0; i + 3 < length; i+=3) 270 268 { 271 for( int i = 0; i + 3 < length; i+=3) 272 { 273 p = verticesList[i]; 274 q = verticesList[i + 1]; 275 r = verticesList[i + 2]; 276 277 covariance[j][k] = facelet[i] / (12.0f * face) * (9.0f * centroid[i][j] * centroid[i][k] + p[j] * p[k] + 278 q[j] * q[k] + r[j] * r[k]) - center[j] * center[k]; 279 } 269 p = verticesList[i]; 270 q = verticesList[i + 1]; 271 r = verticesList[i + 2]; 272 273 covariance[j][k] = facelet[i] / (12.0f * face) * (9.0f * centroid[i][j] * centroid[i][k] + p[j] * p[k] + 274 q[j] * q[k] + r[j] * r[k]) - center[j] * center[k]; 280 275 } 281 276 } 282 PRINTF(3)("-- Calculated Covariance\n"); 283 } 284 else if( mode == 1) 285 { 286 for( int i = 0; i + 3 < length; i+=3) /* FIX-ME-QUICK: hops of 3, array indiscontinuity*/ 287 { 288 p = verticesList[i]; 289 q = verticesList[i + 1]; 290 r = verticesList[i + 2]; 291 292 centroid[i] = (p + q + r) / 3.0f; 293 center += centroid[i]; 294 } 295 center /= length; 296 297 for( int j = 0; j < 3; ++j) 298 { 299 for( int k = 0; k < 3; ++k) 300 { 301 for( int i = 0; i + 3 < length; i+=3) 302 { 303 p = verticesList[i]; 304 q = verticesList[i +1]; 305 r = verticesList[i + 2]; 306 307 covariance[j][k] = p[j] * p[k] + q[j] * q[k] + r[j] + r[k]; 308 } 309 covariance[j][k] /= (3.0f * length); 310 } 311 } 312 PRINTF(3)("-- Calculated Covariance\n"); 313 } 314 else if( mode == 2) 315 { 316 /* fist compute all the convex hull face/facelets and centroids */ 317 for(int i = 0; i + 3 < length; i+=3) /* FIX-ME-QUICK: hops of 3, array indiscontinuity*/ 318 { 319 p = verticesList[i]; 320 q = verticesList[i + 1]; 321 r = verticesList[i + 2]; 322 323 t1 = p - q; t2 = p - r; 324 325 /* finding the facelet surface via cross-product */ 326 facelet[i] = 0.5f * fabs( t1.cross(t2).len() ); 327 /* update the entire convex hull surface */ 328 face += facelet[i]; 329 330 /* calculate the cetroid of the hull triangles */ 331 centroid[i] = (p + q + r) * 1/3; 332 /* now calculate the centroid of the entire convex hull, weighted average of triangle centroids */ 333 center += centroid[i] * facelet[i]; 334 } 335 /* take the average of the centroid sum */ 336 center /= face; 337 PRINTF(3)("-- Calculated Center\n"); 338 339 for( int j = 0; j < 3; ++j) 340 { 341 for( int k = 0; k < 3; ++k) 342 { 343 for( int i = 0; i + 3 < length; i+=3) 344 { 345 p = verticesList[i]; 346 q = verticesList[i +1]; 347 r = verticesList[i + 2]; 348 349 covariance[j][k] = p[j] * p[k] + q[j] * q[k] + r[j] + r[k]; 350 } 351 covariance[j][k] /= (3.0f * length); 352 } 353 } 354 PRINTF(3)("-- Calculated Covariance\n"); 355 } 356 else 357 { 358 for( int i = 0; i < length; ++i) /* FIX-ME-QUICK: hops of 3, array indiscontinuity*/ 359 { 360 center += verticesList[i]; 361 } 362 center /= length; 363 364 for( int j = 0; j < 3; ++j) 365 { 366 for( int k = 0; k < 3; ++k) 367 { 368 for( int i = 0; i + 3 < length; i+=3) 369 { 370 p = verticesList[i]; 371 q = verticesList[i +1]; 372 r = verticesList[i + 2]; 373 374 covariance[j][k] = p[j] * p[k] + q[j] * q[k] + r[j] + r[k]; 375 } 376 covariance[j][k] /= (3.0f * length); 377 } 378 } 379 PRINTF(3)("-- Calculated Covariance\n"); 380 } 381 277 } 278 PRINTF(3)("-- Calculated Covariance\n"); 279 280 382 281 PRINTF(3)("\nVertex Data:\n"); 383 282 for(int i = 0; i < length; i++) 384 { 385 PRINTF(3)("vertex %i: %f, %f, %f\n", i, box->vertices[i][0], box->vertices[i][1], box->vertices[i][2]); 386 } 387 388 389 PRINTF(3)("\nCovariance Matrix:\n"); 390 for(int j = 0; j < 3; ++j) 391 { 392 PRINT(3)(" |"); 393 for(int k = 0; k < 3; ++k) 394 { 395 PRINT(3)(" \b%f ", covariance[j][k]); 396 } 397 PRINT(3)(" |\n"); 398 } 399 400 PRINTF(3)("center: %f, %f, %f\n", center.x, center.y, center.z); 283 PRINTF(3)(" Vertex[%i]: %f, %f, %f\n", i, box->vertices[i][0], box->vertices[i][1], box->vertices[i][2]); 284 PRINTF(3)("\nOBB Covariance Matrix:\n"); 285 for(int j = 0; j < 3; ++j) { PRINT(3)(" |"); for(int k = 0; k < 3; ++k) { PRINT(3)(" \b%f ", covariance[j][k]); } PRINT(3)(" |\n"); } 286 PRINTF(3)("OBB Center: %f, %f, %f\n", center.x, center.y, center.z); 401 287 402 288 … … 407 293 box->covarianceMatrix[i][2] = covariance[i][2]; 408 294 } 409 *box->center = center; 410 PRINTF(3)("-- Written Result to obb\n"); 295 box->center = center; 296 297 PRINTF(3)("-- Written Result to OBB\n"); 411 298 } 412 299 … … 479 366 float halfLength[3]; //!< half length of the axis 480 367 float tmpLength; //!< tmp save point for the length 481 Plane p0(box->axis[0], *box->center); //!< the axis planes482 Plane p1(box->axis[1], *box->center);483 Plane p2(box->axis[2], *box->center);368 Plane p0(box->axis[0], box->center); //!< the axis planes 369 Plane p1(box->axis[1], box->center); 370 Plane p2(box->axis[2], box->center); 484 371 float maxLength[3]; 485 372 float minLength[3]; … … 556 443 centerOffset[i] = (maxLength[i] + minLength[i]) / 2.0f; // min length is negatie 557 444 newHalfLength[i] = (maxLength[i] - minLength[i]) / 2.0f; // min length is negative 558 *box->center += (box->axis[i] * centerOffset[i]); // update the new center vector445 box->center += (box->axis[i] * centerOffset[i]); // update the new center vector 559 446 halfLength[i] = newHalfLength[i]; 560 447 } … … 599 486 float tmpDist; //!< temporary distance 600 487 int vertexIndex; 601 Plane middlePlane(box->axis[axisIndex], *box->center); //!< the middle plane488 Plane middlePlane(box->axis[axisIndex], box->center); //!< the middle plane 602 489 603 490 vertexIndex = 0; … … 738 625 if( unlikely(this->nodeRight == NULL && this->nodeLeft == NULL)) 739 626 { 740 nodeA->collidesWith(nodeB, *((OBBTreeNode*)treeNode)->bvElement->center);741 742 nodeB->collidesWith(nodeA, *this->bvElement->center);627 nodeA->collidesWith(nodeB, ((OBBTreeNode*)treeNode)->bvElement->center); 628 629 nodeB->collidesWith(nodeA, this->bvElement->center); 743 630 } 744 631 … … 766 653 rotAxisB[2] = nodeB->getAbsDir().apply(boxB->axis[2]); 767 654 768 t = nodeA->getAbsCoor() + nodeA->getAbsDir().apply(*boxA->center) - ( nodeB->getAbsCoor() + nodeB->getAbsDir().apply(*boxB->center)); 655 656 t = nodeA->getAbsCoor() + nodeA->getAbsDir().apply(boxA->center) - ( nodeB->getAbsCoor() + nodeB->getAbsDir().apply(boxB->center)); 769 657 770 658 // printf("\n"); … … 928 816 glBegin(GL_LINES); 929 817 glColor3f(0.0, 0.4, 0.3); 930 glVertex3f(this->bvElement->center ->x, this->bvElement->center->y, this->bvElement->center->z);931 glVertex3f(this->bvElement->center ->x + this->bvElement->axis[0].x * this->bvElement->halfLength[0],932 this->bvElement->center ->y + this->bvElement->axis[0].y * this->bvElement->halfLength[0],933 this->bvElement->center ->z + this->bvElement->axis[0].z * this->bvElement->halfLength[0]);934 935 glVertex3f(this->bvElement->center ->x, this->bvElement->center->y, this->bvElement->center->z);936 glVertex3f(this->bvElement->center ->x + this->bvElement->axis[1].x * this->bvElement->halfLength[1],937 this->bvElement->center ->y + this->bvElement->axis[1].y * this->bvElement->halfLength[1],938 this->bvElement->center ->z + this->bvElement->axis[1].z * this->bvElement->halfLength[1]);939 940 glVertex3f(this->bvElement->center ->x, this->bvElement->center->y, this->bvElement->center->z);941 glVertex3f(this->bvElement->center ->x + this->bvElement->axis[2].x * this->bvElement->halfLength[2],942 this->bvElement->center ->y + this->bvElement->axis[2].y * this->bvElement->halfLength[2],943 this->bvElement->center ->z + this->bvElement->axis[2].z * this->bvElement->halfLength[2]);818 glVertex3f(this->bvElement->center.x, this->bvElement->center.y, this->bvElement->center.z); 819 glVertex3f(this->bvElement->center.x + this->bvElement->axis[0].x * this->bvElement->halfLength[0], 820 this->bvElement->center.y + this->bvElement->axis[0].y * this->bvElement->halfLength[0], 821 this->bvElement->center.z + this->bvElement->axis[0].z * this->bvElement->halfLength[0]); 822 823 glVertex3f(this->bvElement->center.x, this->bvElement->center.y, this->bvElement->center.z); 824 glVertex3f(this->bvElement->center.x + this->bvElement->axis[1].x * this->bvElement->halfLength[1], 825 this->bvElement->center.y + this->bvElement->axis[1].y * this->bvElement->halfLength[1], 826 this->bvElement->center.z + this->bvElement->axis[1].z * this->bvElement->halfLength[1]); 827 828 glVertex3f(this->bvElement->center.x, this->bvElement->center.y, this->bvElement->center.z); 829 glVertex3f(this->bvElement->center.x + this->bvElement->axis[2].x * this->bvElement->halfLength[2], 830 this->bvElement->center.y + this->bvElement->axis[2].y * this->bvElement->halfLength[2], 831 this->bvElement->center.z + this->bvElement->axis[2].z * this->bvElement->halfLength[2]); 944 832 glEnd(); 945 833 } … … 960 848 if( !(drawMode & DRAW_SINGLE && depth != 0)) 961 849 { 962 Vector cen = *this->bvElement->center;850 Vector cen = this->bvElement->center; 963 851 Vector* axis = this->bvElement->axis; 964 852 float* len = this->bvElement->halfLength; … … 1098 986 Vector a1 = this->bvElement->axis[(this->longestAxisIndex + 1)%3]; 1099 987 Vector a2 = this->bvElement->axis[(this->longestAxisIndex + 2)%3]; 1100 Vector c = *this->bvElement->center;988 Vector c = this->bvElement->center; 1101 989 float l1 = this->bvElement->halfLength[(this->longestAxisIndex + 1)%3]; 1102 990 float l2 = this->bvElement->halfLength[(this->longestAxisIndex + 2)%3];
Note: See TracChangeset
for help on using the changeset viewer.