• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • vega中自定義motion model

    發表于:2007-05-25來源:作者:點擊數: 標簽:Vegamotionmodel自定義初學
    初學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永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>