vega中自定義motion model
初學Vega寫的一個鍵盤控制前進后退鼠標控制方向的自定義motion model的例子。 #include stdio.h #include stdlib.h #include math.h #include string.h #include vg.h #include pf.h int my_motion_model(vgMotionCallbackStruct *mot_cb); typedef struct {
初學Vega寫的一個鍵盤控制前進后退鼠標控制方向的自定義motion model的例子。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <vg.h>
#include <pf.h>
int my_motion_model(vgMotionCallbackStruct *mot_cb);
typedef struct
{
float x, y, z;
float h, p, r;
float velocity;
vgPosition *pos;
double now;
} motion_model_data;
int
main(int argc, char **argv)
{
vgObserver *obs;
vgMotion *mot;
vgIDev *idev;
motion_model_data *mot_instance_data;
if (argc < 2)
{
printf("syntax: %s <config file>", argv[0]);
exit(-1);
}
vgInitSys();
vgDefineSys(argv[1]);
vgConfigSys();
obs = vgGetObserv(0);
mot = vgGetObservMot(obs);
if (!mot)
{
/* 創建新的運動模型(motion model)并依附到觀察者(observer) */
mot = vgNewMot();
vgName(mot, "user defined motion model");
vgObservMot(obs, mot);
/* 告訴觀察者(observer)使用依附于其上的運動模型(motion model) */
vgProp(obs, VGOBS_TETHERSTATE, VGOBS_DYNAMIC);
}
/* 創建新的輸入設備實例并依附到運動模型(motion model)上 */
idev = vgNewIDev();
vgName(idev, "KBMouse");
vgIDevOpen(idev);
vgMotIDev(mot, idev);
/* 定義運動模型的回調 */
vgMotRegister(VGMOT_USER1, my_motion_model);
/* 為回調數據分配內存 */
mot_instance_data = pfCalloc(1, sizeof(motion_model_data),
vgGetSharedArena());
/* 為運動模型實例初始化回調數據 */
vgUserData(mot, mot_instance_data);
/* 設置運動模型屬性 */
vgProp(mot, VGMOT_MODEL, VGMOT_USER1);
while (1)
{
vgSyncFrame();
vgFrame();
}
}
int
my_motion_model(vgMotionCallbackStruct *mot_cb)
{
vgMotion *mot;
vgIDev *input_device;
static vgPosition *device_pos = NULL;
float dt;
float sine, cosine;
int toggles[3];
int middlebutton, leftbutton, rightbutton;
float devicex, devicey, devicez, deviceh, devicep, devicer;
bool bChange;
motion_model_data *data;
mot = mot_cb->mot;
data = (motion_model_data *)mot_cb->user_data;
input_device = vgGetMotIDev(mot);
if (!data) {
printf("motion model callback data not available");
return(-1);
}
if (!device_pos)
device_pos = vgNewPos();
switch(mot_cb->reason)
{
case VGMOT_INIT_EVENT:
/* 初始化運動模型數據 */
if (!data->pos)
data->pos = vgNewPos();
vgGetPos(mot, data->pos);
vgGetPosVec(data->pos, &data->x, &data->y, &data->z,
&data->h, &data->p, &data->r);
data->x = 0.0f;
data->y = 0.0f;
data->z = 0.0f;
data->h = 0.0f;
data->p = 0.0f;
data->r = 0.0f;
data->velocity = 100.0f;
data->now = mot_cb->data.now;
break;
case VGMOT_RESET_EVENT:
/* 運動模型重置事件處理代碼 */
vgGetPos(mot, data->pos);
vgGetPosVec(data->pos, &data->x, &data->y, &data->z,
&data->h, &data->p, &data->r);
data->p = 0.0f;
data->r = 0.0f;
data->now = mot_cb->data.now;
break;
case VGMOT_UPDATE_EVENT:
vgGetPos(input_device, device_pos);
vgGetPosVec(device_pos, &devicex, &devicey, &devicez,
&deviceh, &devicep, &devicer);
vgIDevReadToggleData(input_device, toggles, 3);
leftbutton = toggles[0];
middlebutton = toggles[1];
rightbutton = toggles[2];
dt = mot_cb->data.now - data->now;
data->now = mot_cb->data.now;
key = vgGetWinKey(vgGetWin(0));
bChanged = false;
devicey = 0;
if (leftbutton)
{
data->h -= 30.0f * devicex * dt;
if ((data->h < -360.0f) || (data->h > 360.0f))
data->h = fmod(data->h, 360.0f);
vgGetSinCos(data->h, &sine, &cosine);
data->x -= data->velocity * sine * devicey * dt;
data->y += data->velocity * cosine * devicey * dt;
vgPosVec(data->pos, data->x, data->y, data->z,
data->h, data->p, data->r);
}
if (key == VGWIN_UPARROW)
{
devicey = m_nDeviceY;
bChanged = true;
}
if (key == VGWIN_DOWNARROW)
{
devicey = -m_nDeviceY;
bChanged = true;
}
if (key == VGWIN_LEFTARROW)
data->h += m_nDeviceH;
if (key == VGWIN_RIGHTARROW)
data->h -= m_nDeviceH;
if (bChanged)
{
if ((data->h < -360.0f) || (data->h > 360.0f))
data->h = fmod(data->h, 360.0f);
vgGetSinCos(data->h, &sine, &cosine);
data->x -= data->velocity * sine * devicey;
data->y += data->velocity * cosine * devicey;
}
/* 如果不需要碰撞檢測的話可以去掉下面這段代碼 */
if (vgGetIsect(0) != NULL)
{
int status;
float result[3];
vgPos(vgGetIsect(0), data->pos);
vgUpdate(vgGetIsect(0));
status = vgGetIsectResult(vgGetIsect(0), VGIS_GETTRIPOD, result);
if (status != 3)
{
data->x += data->velocity * sine * devicey;
data->y -= data->velocity * cosine * devicey;
vgPosVec(data->pos, data->x, data->y, data->z,
data->h, data->p, data->r);
}
}
break;
case VGMOT_EXIT_EVENT:
/* 清除運動模型數據 */
vgDelPos(data->pos);
data->pos = NULL;
break;
default:
vgNotify(VG_WARN, VG_APP, "My Motion Model: Invalid Callback event",
mot_cb->reason );
break;
}
return(0);
}
原文轉自:http://www.kjueaiud.com
- 評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
-
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|