CG橙子精彩导航: CG橙子搜索引擎 | 博客 | 动画视频
广告|项目|培训|竞价排名  
86CG > CG教程 > 虚拟现实 > Multigen > 怎样在程序中使用vgPicker移动物体

怎样在程序中使用vgPicker移动物体

类型:整理 | 来自:86CG | 时间:2007-11-29 |  点击:
#include       
#include "vg.h"          
#include "pf.h"          
#include "assert.h"    


vgPicker    *picker    = NULL;
vgObserver  *mainObs   = NULL;
vgChannel   *mainChan  = NULL;
vgEnv       *mainEnv   = NULL;
vgWindow    *mainWin   = NULL;
vgGfx       *mainGfx   = NULL;
vgScene     *mainScn   = NULL;


void  setSystemPointers();
void  createPicker();
void  userUpdates();
void  checkPickEvent();

void setSystemPointers(){
//  ####################################################
//  # 获取系统的主要指针,注意必须在vgConfigSys()之后调用     
//  #   
//  ####################################################

    mainWin = vgGetWin( 0 );
    assert(mainWin);

    mainObs = vgGetObserv( 0 );       
    assert(mainObs  );

    mainChan = vgGetObservChan( mainObs, 0 );
    assert(mainChan);

    mainGfx = vgGetObservGfx( mainObs );  
    assert(mainEnv);

    mainEnv = vgGetEnv( 0 );  
    assert(mainEnv);

    mainScn = vgGetScene(0);
    assert(mainScn);

}


void createPicker(){
//  ########################################
//  # 创建一个vgPicker    
//  #
//  ########################################

    picker = vgNewPicker();
    assert( picker );
    vgName( picker, "example_picker" );

    //
    // 指定vgPicker起作用的场景和通道
    //
    vgPickerScene( picker,  mainScn );
    vgPickerChannel( picker,  mainChan  );

    //
    // 设置vgPicker属性,选择物体红色显示
    //
    vgPickerHighLightColor( picker, 1.0f, 0.0f, 0.0f );
    vgProp( picker, VGPICK_TRANSFORM,     VGPICK_TRANSLATE   );
vgProp( picker, VGPICK_TRANSCOORDS, VGPICK_OBJECT_AXES );
vgProp( picker, VGPICK_HL_LEVEL, VGPICK_OBJECT );
    vgProp( picker, VGPICK_HL_STYLE,       VGPICK_HL_LINE     );
    vgProp( picker, VGPICK_TERRAIN_CLAMP,  VG_OFF             );
    vgProp( picker, VGPICK_TRANSOVERRIDE,  VG_OFF             );
    vgProp( picker, VGPICK_DISPLAY_STDOUT, VG_OFF             );
    vgProp( picker, VGPICK_MULTIPLE_PICKS, VG_OFF             );
    vgProp( picker, VGPICK_AUTOTRANSFORM,  VG_OFF             );
    vgProp( picker, VGPICK_TRACKPLANE,     VGPICK_TRACK_XY    );
    vgProp( picker, VGPICK_AUTOTRACKPLANE, VG_OFF             );
    vgProp( picker, VGPICK_DRAG_FACTOR,    1.0f               );
    vgProp( picker, VGPICK_RENDER_ISECT,   VG_OFF             );

    //
    // 设置vgPicker的相交矢量
    //
    vgPickerClampIsector( picker, 0x10000000 );
    vgPickerIsector( picker, 0x10000000 );

    // 启用vgPicker
    vgProp( picker, VGCOMMON_ENABLED,  VG_ON );

}

void checkPickEvent(){
// ###################################################
// # 判断vgPicker当前的动作
// #
// #
// ###################################################
static vgMouse mouse;
static  vgPosition *pos = NULL;
    if( pos == NULL ){
      pos = vgNewPos();
       assert( pos );
        }
    vgGetMouse( &mouse );

    // 鼠标左键:拾取或取消拾取物体
   if( mouse.lb && !mouse.mb && !mouse.rb ) {
        vgGetPos( obs, pos );
        vgPerformPickProcessing( picker, pos) ;
        }
   
    // 拖拽鼠标右键:在指定的平面上移动选定的物体 
    if( !mouse.lb && !mouse.mb && mouse.rb ) {
        vgGetPos( obs, pos );
          vgPickerDoMouseTransform( picker, pos);
        }

}

void userUpdates( ) {
//  ############################################
//  # 响应用户的键盘输入:
//  # 1——在XY平面上移动物体(默认情况)
//  # 2——在XZ平面上移动物体
//  # 3——在YZ平面上移动物体  
//  ############################################
int  key   = 0;
  
    while( (key = vgGetWinKey( mainWin )) != 0 ) {
       
        switch( key ) {
                                           
           case '1':
                vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_XY );
                break;     
 
            case '2':
                vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_XZ );
                break;     
 
            case '3':
                vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_YZ );
                break;     
 
                      
            default: break;                

            }
        } 

}

int main(int argc, char* argv[]) {


   
    if( argc \n", argv[0] );
       exit ( -1 );
       }
    
    vgInitSys();
    vgDefineSys( argv[1] );
    vgConfigSys();

    setSystemPointers();
    createPicker();

    //
    //设置物体mask掩码与vgPicker相一致,使得所有的物体都可以被选中
    //
    for( int  i= 0; i < vgGetNumObj(), i++ ){

        vgObject *obj     = vgGetObj(i);
        unsigned int mask = vgGetObjClass( obj );
        mask |= vgGetPickerIsector( picker );
        vgObjClass( obj, mask );
        }

    while( true ) {

        vgSyncFrame();
        vgFrame();
        userUpdates();
        checkPickEvent();
        }


return 0;
}
(完)
可打印版本 | 文章评论 | 我来纠错

|网友评论

    笔名:

    内容:

        

    |热点关注

    新歌 白狐 左边 拉拉爱 校园网 自由飞翔 感恩的心 边做边爱 为你写诗 北京欢迎你 范跑跑之歌 遇上你是我的缘 坏女人 N81 星星 火花 放生 不值得 手机网 分手那天 忘不掉的伤 电子杂志 网上展会 天使 城府 爱死了昨天 BT电影下载 N70 最后一次的温柔 小小 承诺 有没有人告诉你 N73 光荣 葬爱 大海 日不落 有缘人 躲避的爱 香水有毒 一定要爱你 求佛 爱在离别时 北极星的眼泪 假如 flash 歌曲 启示录 那滋味 独家记忆 放手去爱 丁香花 会呼吸的痛 音乐排行榜 爱上别人的人 对不起我爱你 N70 6300 会有天使替我爱你 DJ 爱上你是我的错 不要在我寂寞的时候说爱我 爱上你是一个错 爱你爱的好疲惫 怎么会狠心伤害我 MP3 音乐手机 拍照手机 智能手机 CDMA手机 怒放的生命 老人与海 等爱的玫瑰 爱情里没有谁对谁错 做你的爱人 感动天感动地 做我老婆好不好 你的承诺 王子 心碎 舍不得 摇啊摇 泪的告白 寂寞才说爱 擦肩而过 阿里阿里 中国基金网 新不了情 小情歌 离歌

    关于我们 - 版权隐私 - 友情链接 - 广告服务 - 项目合作 - 网站地图 - 联系方式

    ©Copyright by 86CG.COM, 2006-2008. All rights reserved 京ICP备06059503号