我要发帖 回复

高级会员

9

主题

2694

积分

0

专家分

兴趣点(最多三项):

视景仿真

私信
发表时间 : 2012-2-24 21:16:31 | 浏览 : 5886    评论 : 44
本帖最后由 行健 于 2012-2-24 09:31 PM 编辑

搞了一天了,用的是程序自带的示例vpfx_flamethrower,几乎快要奔溃了,但最终还是搞了出来!我实现了将坦克的炮台发射出去的效果。明天再搞无人机发射导弹,两者原理相同。
附图:
未命名图片.png

要想实现发射,需要:
1.在creator中设置好DOF节点,注意要发射出去的DOF节点的translate一定不能有Constraints,否则无法实现自由控制其发射距离,这点非常重要,我的时间基本都花在这上面了,一直以为是vp的问题,后来才发现问题居然出在模型上。程序自带的例子
2.然后再添一个DOF的translate方法就OK了。

所需的资源全在下面给出:
acf与cpp文件.zip (7.77 KB, 下载次数: 324)

评分

参与人数 4积分 +200 收起 理由
asdf12345 + 50
cxsdabizi + 50
hfut + 50
20084791 + 50

查看全部评分

最近VR访客查看更多↓

破除万难,勇往直前!
行健 评论于2012-2-24 21:19:42
我的观点是:不要放弃努力!即使目前一筹莫展,坚持思考,坚持实践,一定会成功的,今天的事给了我很大的鼓励!
破除万难,勇往直前!
八句半对餐 评论于2012-2-24 21:46:30
行健 发表于 2012-2-24 09:19 PM
我的观点是:不要放弃努力!即使目前一筹莫展,坚持思考,坚持实践,一定会成功的,今天的事给了我很大的鼓 ...

支持!!!!
八句半对餐 评论于2012-2-24 21:47:18
行健 发表于 2012-2-24 09:19 PM
我的观点是:不要放弃努力!即使目前一筹莫展,坚持思考,坚持实践,一定会成功的,今天的事给了我很大的鼓 ...

我今天就配置编译环境了!!!系统是Win7,问题一大堆!
八句半对餐 评论于2012-2-24 21:55:12
用的版本比我高,我这用不了!
行健 评论于2012-2-25 08:55:12
八句半对餐 发表于 2012-2-24 09:55 PM
用的版本比我高,我这用不了!

//cpp文件的内容如下,acf文件所有版本都一样
#include <vsDOF.h>
#include <vpApp.h>
#include <vpObject.h>
#include <vpMotionGame.h>
#include <vpEnv.h>
#include <vpFxParticleSystem.h>
#include "vuAllocTracer.h"

vuAllocTracer s_allocTracer(true,true);

class myApp : public vpApp {

public:

    /**
     * Constructor
     */
    myApp() :
      m_pMyTank( NULL ),
      m_pMyFlameThrowerFX( NULL ),
      m_pTurretDOF( NULL ),
      m_pBarrelDOF( NULL ),
      m_myEnv( NULL )
    {}

    /**
     * Destructor
     */
    ~myApp()
    {
        // unreference member variables which cache Vega Prime class instances
        m_pMyTank->unref();
        m_pMyFlameThrowerFX->unref();
        m_myEnv->unref();
        m_pTurretDOF->unref();
        m_pBarrelDOF->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_pMyTank = vpObject::find( "myTank" );
        assert( m_pMyTank );
        m_pMyTank->ref();

        m_myEnv = vpEnv::find( "myEnv" );
        assert( m_myEnv );
        m_myEnv->ref();

        m_pMyFlameThrowerFX = vpFxParticleSystem::find( "myFlameThrowerFX" );
        assert( m_pMyFlameThrowerFX );
        m_pMyFlameThrowerFX->ref();
        m_pMyFlameThrowerFX->setEnvironment( m_myEnv );
        m_pMyFlameThrowerFX->setWindSource( vpFxParticleSystem::WIND_SOURCE_TABLE );
        m_pMyFlameThrowerFX->setVelocitySource( vpFxParticleSystem::VELOCITY_SOURCE_RELATIVE_EMISSION );
        m_pMyFlameThrowerFX->setRelativeEmissionVelocity( 10.0 );

        m_pBarrelDOF = static_cast<vsDOF *>(m_pMyTank->find_named( "barrelDOF" ));
        assert( m_pBarrelDOF );
        m_pBarrelDOF->ref();

        // Let's apply some realistic constraints to the barrel
        vsDOF::Constraint constraint;
        constraint.m_enable = true;
        constraint.m_min    = -10.0;
        constraint.m_max    = 25.0;
        m_pBarrelDOF->setConstraint( vsDOF::COMPONENT_ROTATE_P, constraint );

        // Attach the flame thrower effect to the end of the barrel
        m_pBarrelDOF->push_back_child( m_pMyFlameThrowerFX );

        // Let's also get the turret's DOF, so we can spin it around.
        m_pTurretDOF = static_cast<vsDOF *>(m_pMyTank->find_named( "turretDOF" ));
        assert( m_pTurretDOF );
        m_pTurretDOF->ref();

        return vsgu::SUCCESS;
    }

    /**
     * Override keyboard input
     */
    virtual void onKeyInput( vrWindow::Key key, int mod )
    {
        switch( key )
        {
            case vrWindow::KEY_F1:
            {
                if( m_pMyFlameThrowerFX->getVelocitySource() == vpFxParticleSystem::VELOCITY_SOURCE_TABLE )
                {

                    // If the effect is currently set to VELOCITY_SOURCE_TABLE,
                    // have it switch to using a relative emission velocity and
                    // then set the relative emission velocity to some reasonable
                    // value. This will cause the effect to ignore the velocity
                    // table which was defined by the .acf file.
                    m_pMyFlameThrowerFX->setVelocitySource( vpFxParticleSystem::VELOCITY_SOURCE_RELATIVE_EMISSION );
                    m_pMyFlameThrowerFX->setRelativeEmissionVelocity( 10.0 );
                }
                else
                {
                    // If the effect is currently set to
                    // VELOCITY_SOURCE_RELATIVE_EMISSION, have it switch back to
                    // using the velocity table, which is defined by the .acf file.
                    m_pMyFlameThrowerFX->setVelocitySource( vpFxParticleSystem::VELOCITY_SOURCE_TABLE );
                    m_pMyFlameThrowerFX->setRelativeEmissionVelocity( 0.0 );
                }
            }
            break;

            case vrWindow::KEY_F2:
            {
                if( m_pMyFlameThrowerFX->getWindSource() == vpFxParticleSystem::WIND_SOURCE_TABLE )
                {
                    // Have the effect use the enviroment's wind vector.
                    m_pMyFlameThrowerFX->setWindSource( vpFxParticleSystem::WIND_SOURCE_ENVIRONMENT );
                }
                else
                {
                    // Have the effect use its own table based wind vectors.
                    m_pMyFlameThrowerFX->setWindSource( vpFxParticleSystem::WIND_SOURCE_TABLE );
                }
            }
            break;

            case vrWindow::KEY_j: // Rotate the turret to the left
            case vrWindow::KEY_J:
                m_pTurretDOF->setRotateH(1.0f, true);
                break;

            case vrWindow::KEY_l: // Rotate the turret to the right
            case vrWindow::KEY_L:
                m_pTurretDOF->setRotateH(-1.0f, true);
                break;

            case vrWindow::KEY_i: // Raise the barrel
            case vrWindow::KEY_I:
                 m_pTurretDOF->setTranslateY(30.0f, false);
                break;

            case vrWindow::KEY_k: // Lower the barrel
            case vrWindow::KEY_K:
                 m_pTurretDOF->setTranslateY(-30.0f, true);
                break;

            default:
                vpApp::onKeyInput(key, mod);
                break;
        }
    }

    virtual void run( void )
    {
        while( beginFrame() != 0 )
        {
                        static const float fCenterX       = -216.0f;
                        static const float fCentery       = -517.0f;
            static const float fDriveRadius   = 15.0f;
            static const float fRotationSpeed = 0.1f;

            static float fRotationAngle = 0.0f;
            fRotationAngle += fRotationSpeed;

            if( fRotationAngle > 360.0f )
                fRotationAngle -= 360.0f;

            float fRotationSin;
            float fRotationCos;
            vuSinCos( fRotationAngle, &fRotationSin, &fRotationCos );

            // Move the tank around the center position.
            vuVec3d vTankPos;
            vTankPos[0] = fCenterX + fDriveRadius * fRotationCos;
            vTankPos[1] = fCentery + fDriveRadius * fRotationSin;
                        vTankPos[2] = 55.0;
            m_pMyTank->setTranslate( vTankPos[0], vTankPos[1], vTankPos[2] );

            // Re-orient the tank's heading so it seems to be driving along
            // the chosen path.
            m_pMyTank->setRotate( fRotationAngle, 0.0f, 0.0f );

            endFrame();
        }
    }

private:

    vpObject* m_pMyTank;
    vpFxParticleSystem* m_pMyFlameThrowerFX;
    vsDOF* m_pTurretDOF;
    vsDOF* m_pBarrelDOF;
    vpEnv* m_myEnv;
};

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

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

    // load acf file
    app->define( (argc <= 1) ? "vpfx_flamethrower.acf" : argv[1] );
   
    // configure my app
    app->configure();

    // runtime loop
    app->run();

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

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

    // shutdown vega prime
    vp::shutdown();

    return 0;
}
破除万难,勇往直前!
hfut 评论于2012-2-25 12:06:23
太有帮助了 谢谢楼主!
hfut 评论于2012-2-25 12:06:40
楼主好人啊
kdzheng 评论于2012-2-25 12:39:31
不错,谢谢。。
zeilejile 评论于2012-3-5 12:25:06
好东西 谢谢楼主
白象 评论于2012-4-8 16:14:09
先下下来,再研究
大风 评论于2012-4-9 21:01:01
看看,学习一下。
1638289459 评论于2012-4-11 18:53:46
额  好有爱的楼主
liyanwen112233 评论于2012-4-13 14:16:06
版本比我的高,可能是我的机器配置也太低了。只有蓝色背景下的一个坦克。。。不过对我还是有帮助的,新手问题比较多啊,以后希望多看到一些实际例子。谢谢
白象 评论于2012-4-20 20:05:19
搂着能看看我这个问题吗,跟你这个很相关
给予解决啊
http://www.52vr.com/bbs/forum.ph ... id=24146&extra=
Liza 评论于2012-5-31 20:16:28 来自手机
谢谢楼主的分享!
Liza 评论于2012-5-31 20:17:30 来自手机
谢谢楼主的分享!
Liza 评论于2012-5-31 20:18:21 来自手机
谢谢楼主的分享!
Liza 评论于2012-5-31 20:18:53 来自手机
谢谢楼主的分享!
llyyww 评论于2012-6-1 11:02:41
感谢分享

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

GMT+8, 2021-1-18 10:27 PM

返回顶部