AABBox<float> CollisionConvexHullShape::toAABBox(const PhysicsTransform &physicsTransform) const { if(!lastTransform.equals(physicsTransform)) { const Quaternion<float> &orientation = physicsTransform.getOrientation(); Point3<float> min(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max()); Point3<float> max(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), -std::numeric_limits<float>::max()); const std::vector<Point3<float>> &convexHullShapePoints = convexHullShape->getPoints(); for (const auto &convexHullShapePoint : convexHullShapePoints) { const Point3<float> point = orientation.rotatePoint(convexHullShapePoint); min.X = std::min(min.X, point.X); min.Y = std::min(min.Y, point.Y); min.Z = std::min(min.Z, point.Z); max.X = std::max(max.X, point.X); max.Y = std::max(max.Y, point.Y); max.Z = std::max(max.Z, point.Z); } const Point3<float> &position = physicsTransform.getPosition(); lastAABBox = AABBox<float>(min + position, max + position); lastTransform = physicsTransform; } return lastAABBox; }
AABBox<float> CollisionCompoundShape::toAABBox(const PhysicsTransform &physicsTransform) const { Point3<float> rotatedTranslation = physicsTransform.getOrientation().rotatePoint(Point3<float>(localizedShapes[0]->translation)); Point3<float> finalPosition = physicsTransform.getPosition().translate(rotatedTranslation.toVector()); PhysicsTransform shapeWorldTransform(finalPosition, physicsTransform.getOrientation()); AABBox<float> globalCompoundBox = localizedShapes[0]->shape->toAABBox(shapeWorldTransform); for(unsigned int i=1; i<localizedShapes.size(); ++i) { rotatedTranslation = physicsTransform.getOrientation().rotatePoint(Point3<float>(localizedShapes[i]->translation)); finalPosition = physicsTransform.getPosition().translate(rotatedTranslation.toVector()); shapeWorldTransform.setPosition(finalPosition); AABBox<float> compoundBox = localizedShapes[i]->shape->toAABBox(shapeWorldTransform); globalCompoundBox = globalCompoundBox.merge(compoundBox); } return globalCompoundBox; }
AABBox<float> CollisionConvexHullShape::toAABBox(const PhysicsTransform &physicsTransform) const { const Point3<float> &pos = physicsTransform.getPosition(); const Matrix3<float> &orientation = physicsTransform.getOrientationMatrix(); //build AABBox Point3<float> min(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max()); Point3<float> max(-std::numeric_limits<float>::max(), -std::numeric_limits<float>::max(), -std::numeric_limits<float>::max()); const std::vector<Point3<float>> &convexHullPoints = convexHull.getPoints(); for(std::vector<Point3<float>>::const_iterator it=convexHullPoints.begin(); it!=convexHullPoints.end(); ++it) { const Point3<float> point = orientation * (*it); if(min.X > point.X) { min.X = point.X; } if(min.Y > point.Y) { min.Y = point.Y; } if(min.Z > point.Z) { min.Z = point.Z; } if(max.X < point.X) { max.X = point.X; } if(max.Y < point.Y) { max.Y = point.Y; } if(max.Z < point.Z) { max.Z = point.Z; } } return AABBox<float>(min + pos, max + pos); }