C++ mit unterschiedlichen BoundingBoxes
-
Können Dinge bei euch unterschiedliche Arten von BoundingBoxes haben? (Sphere, Box, Polygon, ...) Es scheint mir sinnvoll, aber wie macht man das am besten in C++? (Ohne dynamic_cast natürlich.) Mit multiple dispatch in der Sprache wäre es wohl leichter.
-
Richtig: Double dispatch bzw. Visitor Pattern ist ein Stichwort...
-
Boxenbinder schrieb:
Können Dinge bei euch unterschiedliche Arten von BoundingBoxes haben? (Sphere, Box, Polygon, ...)
du meinst vermutlich bounding volumes.
direkt zu mischen macht normalerweise nicht soviel sinn. fuer die grobe arbeit nutzt man meistens AABBs (in Octrees, AABBtrees oder grids, meistens).
fuers feine dann die OBBs der objekte und danach die eigentlichen objekte.die paar faelle in denen es besser waere ein anderes volume zu verwenden sind relativ klein. Du willst eher einen sehr schnellen test fuers grobe haben (deswegen nutzt man nur AABB trees etc. statt einem OBB tree), danach den recht genauen mit OBBs, bei dem die meisten objekte gut abgebildet werden.
Es scheint mir sinnvoll, aber wie macht man das am besten in C++? (Ohne dynamic_cast natürlich.) Mit multiple dispatch in der Sprache wäre es wohl leichter.
wenn du es schnell haben willst, dann nimm einen switch ala
switch(objekt1->type()|(object2->type()<<TYPE_BITS)) { case BOX|(BOX<<TYPE_BITS):BoxBox(objekt1,objekt2);break; case BOX|(SPHERE<<TYPE_BITS):BoxSphere(objekt1,objekt2);break; case BOX|(TRIANGLE<<TYPE_BITS):BoxTriangle(objekt1,objekt2);break; case SPHERE|(BOX<<TYPE_BITS):SphereBox(objekt1,objekt2);break; case SPHERE|(SPHERE<<TYPE_BITS):SphereSPHERE(objekt1,objekt2);break; case SPHERE|(TRIANGLE<<TYPE_BITS):SphereTriangle(objekt1,objekt2);break; case TRIANGLE|(BOX<<TYPE_BITS):TriangleBox(objekt1,objekt2);break; case TRIANGLE|(SPHERE<<TYPE_BITS):TriangleSPHERE(objekt1,objekt2);break; case TRIANGLE|(TRIANGLE<<TYPE_BITS):TriangleTriangle(objekt1,objekt2);break; }