coin3d碰撞检测的实现
程序员文章站
2024-03-16 20:54:40
...
coin3d是openinventor的阉割版,很多openinventor有的功能coin3d没有集成,那就要麻烦一些。比如碰撞检测功能,只给出了以下SoIntersectionDetectionAction.h,然而openinventor的collisionManage就很方便,很多文献里面也提到了用法。不过抱怨也没有用,感谢还有这个功能,以下是我搜集到的资料:
1、下面博客给了一个程序,也给定了一些函数的使用方法,但是没给出怎么过滤,root中的节点都会显示碰撞,一直返回回调函数:
2、以下网址是给出了一个coin3d碰撞检测的例子,以及函数的详细介绍:
https://grey.colorado.edu/coin3d/classSoIntersectionDetectionAction.html
具体代码:
#include <cstdlib>
#include <Inventor/SbTime.h>
#include <Inventor/SoDB.h>
#include <Inventor/SoInteraction.h>
#include <Inventor/collision/SoIntersectionDetectionAction.h>
#include <Inventor/errors/SoDebugError.h>
#include <Inventor/nodekits/SoNodeKit.h>
#include <Inventor/nodes/SoSeparator.h>
static SoIntersectionDetectionAction::Resp
intersectionCB(void * closure,
const SoIntersectingPrimitive * pr1,
const SoIntersectingPrimitive * pr2)
{
(void)fprintf(stdout, "intersection hit!\n");
return SoIntersectionDetectionAction::NEXT_PRIMITIVE;
}
int
main(int argc, char ** argv)
{
SoDB::init();
SoNodeKit::init();
SoInteraction::init();
if (argc != 2) {
(void)fprintf(stderr, "\n\tUsage: testapp <filename.iv>\n\n");
exit(1);
}
SoInput in;
SbBool ok = in.openFile(argv[1]);
assert(ok);
SoSeparator * root = SoDB::readAll(&in);
assert(root);
root->ref();
SoIntersectionDetectionAction ida;
ida.addIntersectionCallback(intersectionCB, NULL);
ida.setManipsEnabled(FALSE);
ida.setDraggersEnabled(FALSE);
ida.setIntersectionDetectionEpsilon(10.0f);
SbTime starttime = SbTime::getTimeOfDay();
SoDebugError::postInfo("main", "SoIntersectionDetectionAction::apply");
ida.apply(root);
SoDebugError::postInfo("main", "apply() done after %f seconds.",
(SbTime::getTimeOfDay() - starttime).getValue());
root->unref();
return 0;
}
3、下面网址里面是关于openinventor函数介绍的网址,可以去查阅