我要发帖 回复

正式会员

16

主题

55

积分

0

专家分

:

私信
发表时间 : 2009-7-8 09:21:20 | 浏览 : 1744    评论 : 7
请问如何做室内的碰撞检测,能否提供一个源代码,websample中的例子用不上呀,请各位专家级的老师、朋友能提供一个源代码,供学生们学习,谢谢各位了

最近VR访客

xiaoyuer 评论于2009-7-24 14:07:44
楼上问题解决了吗?
我现在也在找室内的碰撞检测的例子,能不能把源码传一下
xiaoyuer 评论于2009-7-24 16:16:49
#include <vuAllocTracer.h>
#include <vpApp.h>
#include <vpPositionable.h>
#include <vpMotionWalk.h>
#include <vpIsectorLOS.h>
#include <vpGroundClamp.h>

// track memory leaks
vuAllocTracer m_allocTracer;


class myApp : public vpApp {

public:


    // A simple position strategy for doing collision detection.
    // It uses the user provided vpIsectorLOS for intersection.
    // It caches the previous position (state vector) so that when
    // the collision is deteced, the previous position will be used.
    class myCollisionDetection : public vpPositionable::Strategy {
    public:
        
        // Constructor
        myCollisionDetection(vpIsectorLOS *isector,
                             const vpPositionable::StateVector& sv) :
            m_isector(isector),
            m_previousSV(sv)
        {
            if (m_isector)
                m_isector->ref();
        }

        // Destructor
        ~myCollisionDetection()
        {
            if (m_isector)
                m_isector->unref();
        }


        /**
         * compute method inherited from position strategy
         */
        virtual const vpCoordConverter* compute(vpPositionable::StateVector* sv,
                                                const vpCoordConverter* conv,
                                                double dT)
        {
            // return if we don't have an isector for collision detection
            if (m_isector == NULL)
            {
                // Don't do the isector update
                vuNotify::print( vuNotify::LEVEL_WARN, NULL,
                    "Cannot perform collision detection using NULL isector." );
                return conv;
            }
            
            // get the intersection position
            double x = sv->m_pos[0];
            double y = sv->m_pos[1];
            double z = sv->m_pos[2];
            double h = sv->m_rot[0];
            double p = sv->m_rot[1];
            double r = sv->m_rot[2];

            m_isector->setCoordConverter((vpCoordConverter*)conv);
            m_isector->setPosition( x, y, z );
            m_isector->setOrientation( h, p, r );
            m_isector->update();

            // if no collision, update the previous position
            // else, use the previous position
            if (!m_isector->getHit())
                m_previousSV = *sv;
            else  
                *sv = m_previousSV;
            
            return conv;
        }
        
    private:

        // The LOS isector used for collision detection
        vpIsectorLOS *m_isector;

        // The state vector cache used to store the previous state vector
        // when collision is detected, the incoming sv will be replaced with
        // the previous sv
        vpPositionable::StateVector m_previousSV;
    };

    /**
     * Constructor
     */
    myApp() : m_motion(NULL), m_collision(NULL)
    {}

    /**
     * Destructor
     */
    ~myApp()
    {
        // unreference member variables which cache Vega Prime class instances
        m_motion->unref();
        m_collision->unref();
    }
   
    /**
     * Configure my app
     */
    int configure() {

        // pre-configuration


        // configure vega prime system first
        vpApp::configure();


        // post-configuration

        // Increase the reference count by one for all member variables which
        // cache the Vega Prime class instances.
        //
        // All VSG/Vega Prime class instances are referenced counted.
        // The initial reference count is 0 after the instance is created.
        // When the reference count is smaller or equal to 0 in unref(),
        // the instance will be deleted automatically. Increasing reference
        // count here for all member variables will guarantee that they will
        // not be deleted until myApp is deleted.

        m_motion = *vpMotionWalk::begin();
        assert(m_motion);
        m_motion->ref();

        vpObserver *obs = *vpObserver::begin();
        assert(obs);

        vpIsectorLOS *los = vpIsectorLOS::find("myIsectorLOS");
        assert(los);
        m_collision = new myCollisionDetection(los, obs->getStateVector());
        m_collision->ref();
                m_motion->setNextStrategy(m_collision);
/*
        m_groundClamp = *vpGroundClamp::begin();
        assert(m_groundClamp);
        m_groundClamp->setNextStrategy(m_collision);
*/
        return vsgu::SUCCESS;

    }

    /**
     * Override keyboard input
     */
    virtual void onKeyInput(vrWindow::Key key, int mod)
    {
        double dval;
        vpObserver *observer = *vpObserver::begin();

        switch (key) {

        case vrWindow::KEY_h: // decrease the heading rate
            dval = m_motion->getRateHeading() - 1.0;
            if (dval < 0) dval = 0.0;
            m_motion->setRateHeading(dval);
            printf("heading rate %g\n", dval);
            break;

        case vrWindow::KEY_H: // increase the heading rate
            dval = m_motion->getRateHeading() + 1.0;
            m_motion->setRateHeading(dval);
            printf("heading rate %g\n", dval);
            break;

        case vrWindow::KEY_p: // decrease the pitch rate
            dval = m_motion->getRatePitch() - 1.0;
            if (dval < 0) dval = 0.0;
            m_motion->setRatePitch(dval);
            printf("pitch rate %g\n", dval);
            break;

        case vrWindow::KEY_P: // increase the pitch rate
            dval = m_motion->getRatePitch() + 1.0;
            m_motion->setRatePitch(dval);
            printf("pitch rate %g\n", dval);
            break;

        case vrWindow::KEY_s: // decrease the speed
            dval = m_motion->getSpeed() - 1.0;
            if (dval < 0) dval = 0.0;
            m_motion->setSpeed(dval);
            printf("speed %g\n", dval);
            break;

        case vrWindow::KEY_S: // increase the speed
            dval = m_motion->getSpeed() + 1.0;
            m_motion->setSpeed(dval);
            printf("speed %g\n", dval);
            break;

        case vrWindow::KEY_u: // decrease the lateral speed
            dval = m_motion->getSpeedLateral() - 1.0;
            if (dval < 0) dval = 0.0;
            m_motion->setSpeedLateral(dval);
            printf("lateral speed %g\n", dval);
            break;

        case vrWindow::KEY_U: // increase the lateral speed
            dval = m_motion->getSpeedLateral() + 1.0;
            m_motion->setSpeedLateral(dval);
            printf("lateral speed %g\n", dval);
            break;

        case vrWindow::KEY_v: // decrease the vertical speed
            dval = m_motion->getSpeedVertical() - 1.0;
            if (dval < 0) dval = 0.0;
            m_motion->setSpeedVertical(dval);
            printf("vertical speed %g\n", dval);
            break;

        case vrWindow::KEY_V: // increase the vertical speed
            dval = m_motion->getSpeedVertical() + 1.0;
            m_motion->setSpeedVertical(dval);
            printf("vertical speed %g\n", dval);
            break;

        //Overload the walk motion models up and down keys to change the
        // ground clamp offset.  As the ground clamp offset restricts the
        // motion model, the model's up and down key will not work.  Instead,
        // use the up and down key to set the offsetFromGround of the ground clamp.
        /*               
        case vrWindow::KEY_UP:
            m_groundClamp->
                setOffsetFromGround(
                    m_groundClamp->getOffsetFromGround() +
                    m_motion->getSpeedVertical()*0.05);
            break;            
        case vrWindow::KEY_DOWN:
            {
                float nGroundOffset = m_groundClamp->getOffsetFromGround();
                dval = m_motion->getSpeedVertical();
                nGroundOffset = nGroundOffset - dval*0.05;
                if (nGroundOffset < 5.0) {
                    nGroundOffset = 5.0;
                }
                m_groundClamp->setOffsetFromGround(nGroundOffset);
           }
           break;
*/
        default:
            vpApp::onKeyInput(key, mod);
            break;

        }

    }

private:

    // our motion model
    vpMotionWalk *m_motion;

    // our ground clamp
    vpGroundClamp* m_groundClamp;

    // our collision strategy
    myCollisionDetection *m_collision;

};

int main(int argc, char *argv[])
{
    // initialize vega prime
    vp::initialize(argc, argv);

    // don't need to initialize vpmotion, it's already done by the acf

    // create my app instance
    myApp *app = new myApp;

    // load acf file
    if (argc <= 1)
        app->define("zhongti.acf");
    else
        app->define(argv[1]);

    // configure my app
    app->configure();
        vpObserver *obs = *vpObserver::begin();
        assert(obs);

    // runtime loop
    app->run();

    // unref my app instance
    app->unref();

    // shutdown vega prime
    vp::shutdown();
   
    return 0;
}
xiongzidong123 评论于2009-11-7 10:42:29
真是个好东东,谢谢分享
357677287 评论于2010-1-5 15:06:50
使用中……
cuijin 评论于2010-11-17 19:48:22
跟websample中user_isector差不多
以假代真 评论于2010-11-17 22:56:02
虽然我不用,还是感谢高尚无私的人
fliedbird 评论于2010-12-23 15:51:18
感激涕零,无以言表。。。

手机版|VR开发网 ( 津ICP备18009691号 ) 统计 网安备12019202000257

GMT+8, 2020-10-1 07:38 PM

返回顶部