欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

coin3d碰撞检测的实现

程序员文章站 2024-03-16 20:54:40
...

coin3d是openinventor的阉割版,很多openinventor有的功能coin3d没有集成,那就要麻烦一些。比如碰撞检测功能,只给出了以下SoIntersectionDetectionAction.h,然而openinventor的collisionManage就很方便,很多文献里面也提到了用法。不过抱怨也没有用,感谢还有这个功能,以下是我搜集到的资料:
1、下面博客给了一个程序,也给定了一些函数的使用方法,但是没给出怎么过滤,root中的节点都会显示碰撞,一直返回回调函数:

http://download.csdn.net/download/handong1509/6365473

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函数介绍的网址,可以去查阅

http://developer90.openinventor.com/content/c-api?apiurl=http://oivdoc90.vsg3d.com/APIS/RefManCpp/class_so_intersection_detection_action.html