Vega Prime 桌面教程(三)

创建场景 

         我们将要创建的场景是一个包含别墅、谷仓、悍马的乡村,下一节我们将把飓风加进场景里,它能破坏其路径上的任何东西,此外我们还将加入一头奶牛到场景。首先,我们要用LP添加模型,这些模型(*.flt)是VP中类的实例。模型都是用MultiGen Creator创建的。

我们把OpenFlights 文件作为模型加进场景里。这些模型包含别墅、地形、悍马车。我们可以定位并引导这些模型,以便交互式的观察这些模型。

一、添加地形。地形是场景的基础,我们借助LP导入地形模型文件,并保存它。

A、在你的磁盘上建立一个文件夹,并命名为MultiGen—VP。我们将把ACF文件存储在这里。

B、启动VP。

C、点击文件-》Save as  存储到A建立的文件夹中,名称为chapter2.acf.

D、在VP右边的场景树中找到MyObject,并双击,显示其属性视图。点击Filename域右边的紫色按钮,按如下顺序找到模型文件。

E、在LP面板的下边把MyObject改名为terrain。

F、选择MyInstance作为terrain的父节点。

G、保存并预览。画面如下:

 

 在场景中加入物体,例如房屋、汽车、谷仓等等·

1、在MyScence视图中的子项目区域点击“增添新实例”。

2、高亮显示新的MyObject,然后转到其视图。

3、在Filename域点击浏览按钮,找到相应的flt模型文件。分别为:

farmhouse.flt。esprit-dirty.flt。grainStorage.flt。

为上述对象设置其位置,(1960,1000,0),(1990,1000,0),(2460,2465,0)

4、在对象视图下面的API域,将其名称改为farmhouse,car,grainhouse.

5、保存并预览。场景如下图所示:

点击文件菜单,选择导出CPP文件,然后用VC打开这个文件,文件内容如下:

//
// This file was automatically generated from D:/Program Files/MultiGen-Paradigm1.2/MyACF/chapter2.acf
//
#include "vpModule.h"
#include "vpKernel.h"
#include "vpSearchPath.h"
#include "vpPipeline.h"
#include "vpWindow.h"
#include "vpChannel.h"
#include "vpObserver.h"
#include "vpScene.h"
#include "vpObject.h"
#include "vpEnv.h"
#include "vpEnvSun.h"
#include "vpEnvMoon.h"
#include "vpEnvSkyDome.h"
#include "vpEnvCloudLayer.h"
#include "vpMotionUFO.h"
#include "vpApp.h"

//
// Define a static list to hold the instances we create, so that we
// can unref them when unconfigure is called
//
typedef vuVector< vuField< vuBase* > > InstancesList;
static InstancesList* s_pInstancesToUnref = NULL;

 

void define( void )
{
    // Create static instances list that we use to track what we create
    s_pInstancesToUnref = new InstancesList;

    //
    // Initialize all modules
    //

    vpModule::initializeModule( "vpEnv" );
    vpModule::initializeModule( "vpMotion" );


    //
    // Create all instances
    //

    vpKernel* pKernel_myKernel = vpKernel::instance();
    pKernel_myKernel->setNotifyLevel( vuNotify::LEVEL_WARN );
    pKernel_myKernel->setNotifyColorEnable( false );
    pKernel_myKernel->setPriority( vuThread::PRIORITY_NORMAL );
    pKernel_myKernel->setProcessor( -1 );
    pKernel_myKernel->setDesiredFrameRate( 0.000000 );
    pKernel_myKernel->setNotifyClassTypeMode( vuNotify::CLASS_TYPE_MODE_INCLUSIVE );

    vpSearchPath* pSearchPath_mySearchPath = vpSearchPath::instance();
    pSearchPath_mySearchPath->append( "$(MPI_INSTALL_RESOURCE_DEFAULT)/resources/data/databases/town" );
    pSearchPath_mySearchPath->append( "D:/Program Files/MultiGen-Paradigm1.2/resources/tutorials/vegaprime/desktop_tutor/tornado/data/land" );
    pSearchPath_mySearchPath->append( "D:/Program Files/MultiGen-Paradigm1.2/resources/tutorials/vegaprime/desktop_tutor/tornado/data/farmhouse" );
    pSearchPath_mySearchPath->append( "D:/Program Files/MultiGen-Paradigm1.2/resources/tutorials/vegaprime/desktop_tutor/tornado/data/dirtyesprit" );
    pSearchPath_mySearchPath->append( "D:/Program Files/MultiGen-Paradigm1.2/resources/tutorials/vegaprime/desktop_tutor/tornado/data/grainstorage" );

    vpPipeline* pPipeline_myPipeline = new vpPipeline();
    pPipeline_myPipeline->setName( "myPipeline" );
    pPipeline_myPipeline->setMultiThread( vsPipeline::MULTITHREAD_INLINE );
    pPipeline_myPipeline->setId( 0 );
    pPipeline_myPipeline->setNumCullThreads( 0 );
    pPipeline_myPipeline->setCullThreadPriority( vuThread::PRIORITY_NORMAL );
    pPipeline_myPipeline->setCullThreadProcessor( -1 );
    pPipeline_myPipeline->setDrawThreadPriority( vuThread::PRIORITY_NORMAL );
    pPipeline_myPipeline->setDrawThreadProcessor( -1 );

    s_pInstancesToUnref->push_back( pPipeline_myPipeline );

    vpWindow* pWindow_myWindow = new vpWindow();
    pWindow_myWindow->setName( "myWindow" );
    pWindow_myWindow->setLabel( "Vega Prime Window" );
    pWindow_myWindow->setOrigin( 0 ,  0 );
    pWindow_myWindow->setSize( 1024 ,  768 );
    pWindow_myWindow->setFullScreenEnable( false );
    pWindow_myWindow->setBorderEnable( true );
    pWindow_myWindow->setInputEnable( true );
    pWindow_myWindow->setCursorEnable( true );
    pWindow_myWindow->setStereoEnable( false );
    pWindow_myWindow->setAntiAliasEnable( true );
    pWindow_myWindow->setNumColorBits( 8 );
    pWindow_myWindow->setNumAlphaBits( 0 );
    pWindow_myWindow->setNumDepthBits( 24 );
    pWindow_myWindow->setNumStencilBits( 0 );
    pWindow_myWindow->setNumAccumColorBits( 0 );
    pWindow_myWindow->setNumAccumAlphaBits( 0 );
    pWindow_myWindow->setNumMultiSampleBits( 0 );

    s_pInstancesToUnref->push_back( pWindow_myWindow );

    vpChannel* pChannel_myChannel = new vpChannel();
    pChannel_myChannel->setName( "myChannel" );
    pChannel_myChannel->setOffsetTranslate( 0.000000 ,  0.000000 ,  0.000000 );
    pChannel_myChannel->setOffsetRotate( 0.000000 ,  0.000000 ,  0.000000 );
    pChannel_myChannel->setCullMask( 0x0FFFFFFFF );
    pChannel_myChannel->setRenderMask( 0x0FFFFFFFF );
    pChannel_myChannel->setClearColor( 0.000000f ,  0.500000f ,  1.000000f ,  0.000000f );
    pChannel_myChannel->setClearBuffers( 0x03 );
    pChannel_myChannel->setDrawArea( 0.000000 ,  1.000000 ,  0.000000 ,  1.000000 );
    pChannel_myChannel->setFOVSymmetric( 45.000000f ,  -1.000000f );
    pChannel_myChannel->setNearFar( 1.000000f ,  35000.000000f );
    pChannel_myChannel->setLODVisibilityRangeScale( 1.000000 );
    pChannel_myChannel->setLODTransitionRangeScale( 1.000000 );
    pChannel_myChannel->setCullThreadPriority( vuThread::PRIORITY_NORMAL );
    pChannel_myChannel->setCullThreadProcessor( -1 );
    pChannel_myChannel->setGraphicsModeEnable( vpChannel::GRAPHICS_MODE_WIREFRAME ,  false );
    pChannel_myChannel->setGraphicsModeEnable( vpChannel::GRAPHICS_MODE_TRANSPARENCY ,  true );
    pChannel_myChannel->setGraphicsModeEnable( vpChannel::GRAPHICS_MODE_TEXTURE ,  true );
    pChannel_myChannel->setGraphicsModeEnable( vpChannel::GRAPHICS_MODE_LIGHT ,  true );
    pChannel_myChannel->setGraphicsModeEnable( vpChannel::GRAPHICS_MODE_FOG ,  true );
    pChannel_myChannel->setLightPointThreadPriority( vuThread::PRIORITY_NORMAL );
    pChannel_myChannel->setLightPointThreadProcessor( -1 );

    s_pInstancesToUnref->push_back( pChannel_myChannel );

    vpObserver* pObserver_myObserver = new vpObserver();
    pObserver_myObserver->setName( "myObserver" );
    pObserver_myObserver->setStrategyEnable( true );
    pObserver_myObserver->setTranslate( 2300.000000 ,  2500.000000 ,  15.000000 );
    pObserver_myObserver->setRotate( -90.000000 ,  0.000000 ,  0.000000 );
    pObserver_myObserver->setLatencyCriticalEnable( false );

    s_pInstancesToUnref->push_back( pObserver_myObserver );

    vpScene* pScene_myScene = new vpScene();
    pScene_myScene->setName( "myScene" );

    s_pInstancesToUnref->push_back( pScene_myScene );

    vpObject* pObject_terrain = new vpObject();
    pObject_terrain->setName( "terrain" );
    pObject_terrain->setCullMask( 0x0FFFFFFFF );
    pObject_terrain->setRenderMask( 0x0FFFFFFFF );
    pObject_terrain->setIsectMask( 0x0FFFFFFFF );
    pObject_terrain->setStrategyEnable( false );
    pObject_terrain->setTranslate( 0.000000 ,  0.000000 ,  0.000000 );
    pObject_terrain->setRotate( 0.000000 ,  0.000000 ,  0.000000 );
    pObject_terrain->setScale( 1.000000 ,  1.000000 ,  1.000000 );
    pObject_terrain->setStaticEnable( false );
    pObject_terrain->setFileName( "Prime_Junction.flt" );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_VERTEX_ARRAYS ,  true );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_DISPLAY_LISTS ,  true );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMBINE_LIGHT_POINTS ,  true );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_PRESERVE_QUADS ,  false );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_OPTIMIZE_GEOM ,  true );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPUTE_NORMALS ,  false );
    pObject_terrain->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPATIBILITY_MODE ,  true );
    pObject_terrain->setFlattenEnable( true );
    pObject_terrain->setCleanEnable( true );
    pObject_terrain->setAutoPage( vpObject::AUTO_PAGE_SYNCHRONOUS );

    s_pInstancesToUnref->push_back( pObject_terrain );

    vpObject* pObject_farmhouse = new vpObject();
    pObject_farmhouse->setName( "farmhouse" );
    pObject_farmhouse->setCullMask( 0x0FFFFFFFF );
    pObject_farmhouse->setRenderMask( 0x0FFFFFFFF );
    pObject_farmhouse->setIsectMask( 0x0FFFFFFFF );
    pObject_farmhouse->setStrategyEnable( true );
    pObject_farmhouse->setTranslate( 1960.000000 ,  1000.000000 ,  -1.000000 );
    pObject_farmhouse->setRotate( 0.000000 ,  0.000000 ,  0.000000 );
    pObject_farmhouse->setScale( 1.000000 ,  1.000000 ,  1.000000 );
    pObject_farmhouse->setStaticEnable( false );
    pObject_farmhouse->setFileName( "farmhouse.flt" );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_VERTEX_ARRAYS ,  true );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_DISPLAY_LISTS ,  true );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMBINE_LIGHT_POINTS ,  true );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_PRESERVE_QUADS ,  false );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_OPTIMIZE_GEOM ,  true );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPUTE_NORMALS ,  false );
    pObject_farmhouse->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPATIBILITY_MODE ,  true );
    pObject_farmhouse->setFlattenEnable( true );
    pObject_farmhouse->setCleanEnable( true );
    pObject_farmhouse->setAutoPage( vpObject::AUTO_PAGE_SYNCHRONOUS );

    s_pInstancesToUnref->push_back( pObject_farmhouse );

    vpObject* pObject_car = new vpObject();
    pObject_car->setName( "car" );
    pObject_car->setCullMask( 0x0FFFFFFFF );
    pObject_car->setRenderMask( 0x0FFFFFFFF );
    pObject_car->setIsectMask( 0x0FFFFFFFF );
    pObject_car->setStrategyEnable( true );
    pObject_car->setTranslate( 1990.000000 ,  1000.000000 ,  0.000000 );
    pObject_car->setRotate( 140.000000 ,  0.000000 ,  0.000000 );
    pObject_car->setScale( 1.000000 ,  1.000000 ,  1.000000 );
    pObject_car->setStaticEnable( false );
    pObject_car->setFileName( "esprit-dirty.flt" );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_VERTEX_ARRAYS ,  true );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_DISPLAY_LISTS ,  true );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMBINE_LIGHT_POINTS ,  true );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_PRESERVE_QUADS ,  false );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_OPTIMIZE_GEOM ,  true );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPUTE_NORMALS ,  false );
    pObject_car->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPATIBILITY_MODE ,  true );
    pObject_car->setFlattenEnable( true );
    pObject_car->setCleanEnable( true );
    pObject_car->setAutoPage( vpObject::AUTO_PAGE_SYNCHRONOUS );

    s_pInstancesToUnref->push_back( pObject_car );

    vpObject* pObject_grainStorage = new vpObject();
    pObject_grainStorage->setName( "grainStorage" );
    pObject_grainStorage->setCullMask( 0x0FFFFFFFF );
    pObject_grainStorage->setRenderMask( 0x0FFFFFFFF );
    pObject_grainStorage->setIsectMask( 0x0FFFFFFFF );
    pObject_grainStorage->setStrategyEnable( true );
    pObject_grainStorage->setTranslate( 2450.000000 ,  2460.000000 ,  0.000000 );
    pObject_grainStorage->setRotate( 0.000000 ,  0.000000 ,  0.000000 );
    pObject_grainStorage->setScale( 1.000000 ,  1.000000 ,  1.000000 );
    pObject_grainStorage->setStaticEnable( false );
    pObject_grainStorage->setFileName( "grainStorage.flt" );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_VERTEX_ARRAYS ,  true );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_GENERATE_DISPLAY_LISTS ,  true );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMBINE_LIGHT_POINTS ,  true );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_PRESERVE_QUADS ,  false );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_OPTIMIZE_GEOM ,  true );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPUTE_NORMALS ,  false );
    pObject_grainStorage->setLoaderAttribute( vpGeometryPageable::LOADER_ATTRIBUTE_COMPATIBILITY_MODE ,  true );
    pObject_grainStorage->setFlattenEnable( true );
    pObject_grainStorage->setCleanEnable( true );
    pObject_grainStorage->setAutoPage( vpObject::AUTO_PAGE_SYNCHRONOUS );

    s_pInstancesToUnref->push_back( pObject_grainStorage );

    vpEnv* pEnv_myEnv = new vpEnv();
    pEnv_myEnv->setName( "myEnv" );
    pEnv_myEnv->setDate( 29 ,  3 ,  2008 );
    pEnv_myEnv->setTimeOfDay( 11.040000f );
    pEnv_myEnv->setTimeMultiplier( 1.000000f );
    pEnv_myEnv->setEphemerisUpdateInterval( 0.000000f );
    pEnv_myEnv->setReferencePosition( -96.790001f ,  32.790001f );
    pEnv_myEnv->setEphemerisTimeZoneOffset( -10000 );
    pEnv_myEnv->setSkyColor( 0.513725f ,  0.701961f ,  0.941176f ,  1.000000f );
    pEnv_myEnv->setVisibilityRange( 80000.000000f );
    pEnv_myEnv->setVisibilityColor( 1.000000f ,  1.000000f ,  1.000000f ,  1.000000f );
    pEnv_myEnv->setAmbientLightingColor( 0.000000f ,  0.000000f ,  0.000000f ,  1.000000f );
    pEnv_myEnv->setWindSpeed( 0.000000f );
    pEnv_myEnv->setWindDirection( 0.000000f ,  1.000000f );

    s_pInstancesToUnref->push_back( pEnv_myEnv );

    vpEnvSun* pEnvSun_myEnvSun = new vpEnvSun();
    pEnvSun_myEnvSun->setName( "myEnvSun" );
    pEnvSun_myEnvSun->setEnable( true );
    pEnvSun_myEnvSun->setTwilightDip( -18.000000f );
    pEnvSun_myEnvSun->setTextureFile( "sun.inta" );
    pEnvSun_myEnvSun->setColor( 0.992156f ,  1.000000f ,  0.949019f ,  1.000000f );
    pEnvSun_myEnvSun->setHorizonColor( 1.000000f ,  0.545098f ,  0.239216f ,  1.000000f );

    s_pInstancesToUnref->push_back( pEnvSun_myEnvSun );

    vpEnvMoon* pEnvMoon_myEnvMoon = new vpEnvMoon();
    pEnvMoon_myEnvMoon->setName( "myEnvMoon" );
    pEnvMoon_myEnvMoon->setEnable( true );
    pEnvMoon_myEnvMoon->setBrightness( 0.250000f );
    pEnvMoon_myEnvMoon->setTextureFile( "moon.inta" );
    pEnvMoon_myEnvMoon->setColor( 0.811765f ,  0.886275f ,  0.937255f ,  1.000000f );

    s_pInstancesToUnref->push_back( pEnvMoon_myEnvMoon );

    vpEnvSkyDome* pEnvSkyDome_myEnvSkyDome = new vpEnvSkyDome();
    pEnvSkyDome_myEnvSkyDome->setName( "myEnvSkyDome" );
    pEnvSkyDome_myEnvSkyDome->setEnable( true );
    pEnvSkyDome_myEnvSkyDome->setGroundColor( 0.211765f ,  0.286275f ,  0.149020f ,  1.000000f );

    s_pInstancesToUnref->push_back( pEnvSkyDome_myEnvSkyDome );

    vpEnvCloudLayer* pEnvCloudLayer_myEnvCloudLayer = new vpEnvCloudLayer();
    pEnvCloudLayer_myEnvCloudLayer->setName( "myEnvCloudLayer" );
    pEnvCloudLayer_myEnvCloudLayer->setEnable( true );
    pEnvCloudLayer_myEnvCloudLayer->setColor( 0.956863f ,  0.976471f ,  0.984314f ,  1.000000f );
    pEnvCloudLayer_myEnvCloudLayer->setElevation( 3000.000000f ,  5000.000000f );
    pEnvCloudLayer_myEnvCloudLayer->setTransitionRange( 500.000000f ,  500.000000f );
    pEnvCloudLayer_myEnvCloudLayer->setScudEnable( false );
    pEnvCloudLayer_myEnvCloudLayer->setTextureFile( "cloud_scattered.inta" );
    pEnvCloudLayer_myEnvCloudLayer->setTextureTiling( 3.000000f ,  3.000000f );

    s_pInstancesToUnref->push_back( pEnvCloudLayer_myEnvCloudLayer );

    vpMotionUFO* pMotionUFO_myMotion = new vpMotionUFO();
    pMotionUFO_myMotion->setName( "myMotion" );
    pMotionUFO_myMotion->setSpeed( 10.000000 );
    pMotionUFO_myMotion->setBoost( 50.000000 );
    pMotionUFO_myMotion->setBoostTurning( 5.000000 );
    pMotionUFO_myMotion->setRateHeading( 40.000000 );
    pMotionUFO_myMotion->setRatePitch( 20.000000 );

    s_pInstancesToUnref->push_back( pMotionUFO_myMotion );

 

    //
    // Satisfy all references
    //

 

    pPipeline_myPipeline->addWindow( pWindow_myWindow );

    pWindow_myWindow->addChannel( pChannel_myChannel );


    pObserver_myObserver->setStrategy( pMotionUFO_myMotion );
    pObserver_myObserver->addChannel( pChannel_myChannel );
    pObserver_myObserver->addAttachment( pEnv_myEnv );
    pObserver_myObserver->setScene( pScene_myScene );

    pScene_myScene->addChild( pObject_terrain );
    pScene_myScene->addChild( pObject_farmhouse );
    pScene_myScene->addChild( pObject_car );
    pScene_myScene->addChild( pObject_grainStorage );

 

 

    pEnv_myEnv->addEnvFx( pEnvSun_myEnvSun );
    pEnv_myEnv->addEnvFx( pEnvMoon_myEnvMoon );
    pEnv_myEnv->addEnvFx( pEnvSkyDome_myEnvSkyDome );
    pEnv_myEnv->addEnvFx( pEnvCloudLayer_myEnvCloudLayer );

 

 


}

 


void unconfigure( void )
{
    //
    // Unref all created instances
    //

    s_pInstancesToUnref->clear();
    delete s_pInstancesToUnref;
}

 

 

//
// Main Program
//

void main(int argc, char *argv[])
{
    // initialize Vega Prime
    vp::initialize(argc, argv);

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

    // use the code generated by LynX Prime
    define();

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

    // execute the main runtime loop
    app->run();

    // call the unconfig code generated by LynX Prime
    unconfigure();

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

    // shutdown Vega Prime
    vp::shutdown();

}

这个CPP文件主要分为三部分:

第一、包含的头文件。

第二、定义了define()和unconfig()两个函数。define()函数包含了场景中的所有对象的属性信息。这些函数调用的作用和lynx Prime面板设置的作用是一样的。但是我们应该认真研究每个函数的作用。我建议当把地形加入以后就导出CPP文件,看看里面具体内容,然后每加入一个对象导出CPP文件,看看其内容的变化。这样我们就会熟悉函数的作用。

第三、是一个主函数main(),里面是一个vega prime函数的主要过程。

 

 

 

 

 

 

 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值