怎样在程序中使用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;
}
#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;
}
(完)
- 上篇文章: vega prime 浅谈
- 返回:Multigen
- 下篇文章:怎样在程序中设置一个 Navigator的速度
CG橙子精彩导航: 










