coin3d碰撞检测的实现

本文介绍了使用Coin3D进行碰撞检测的方法,并提供了一个具体的示例程序。文章探讨了如何设置碰撞检测动作、添加回调函数及调整检测精度等问题。

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

http://download.youkuaiyun.com/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值