====== Collision objects ====== SpeedTree uses capsules as collision objects, providing a cruder representation of a tree object's shape than its detailed geometry. They have no polygonal resolution associated with them. Rather, they are mathematical representations, free to be passed into the collision-handling system in your application. Capsules with the same two position values are treated as spheres. The following code shows how to access the collision objects embedded in a ''CCore'' object, assuming it has been loaded. #include "SpeedTree/Core/Core.h" using SpeedTree::st_uint32; void PrintCollisionObjects(const SpeedTree::CCore& cModel) { st_uint32 uiNumObjects = cModel.CollisionObjects( ).Count( ); for (st_uint32 i = 0; i < uiNumObjects; ++i) { SpeedTree::CCollisionObject cObject = cModel.CollisionObjects( )[i]; printf("collision object [%d of %d]\n", i + 1, uiNumObjects); // each collision object has two position values; when they're identical, // the object is a sphere; when diferent, it's a capsule SpeedTree::Vec3 vPos1 = cObject.Position( ); SpeedTree::Vec3 vPos2 = cObject.Position2( ); if (vPos1 == vPos2) printf(" [Sphere]\n"); else printf(" [Capsule]\n"); printf(" position 1: (%g, %g, %g)\n", vPos1.x, vPos1.y, vPos1.z); printf(" position 2: (%g, %g, %g)\n", vPos2.x, vPos2.y, vPos2.z); printf(" radius: %g\n", cObject.Radius( )); // note the necessary (const char*) typecast printf(" user data: [%s]\n", (const char*)cObject.UserData( ).Data( )); } } The ''CForest'' object (in the Forest library) has a function, ''CForest::CollisionAdjust()'', that will provide the functionality necessary to avoid running through a series of tree models. It works only within the SpeedTree framework but could serve as a useful start for your own application.