我要发帖 回复

正式会员

3

主题

89

积分

0

专家分

兴趣点(最多三项):

视景仿真

私信
发表时间 : 2015-1-15 10:46:47 | 浏览 : 922    评论 : 0
#include<math.h>
#include<vg.h>
#include<vgwin.h>
void main()
{
        int key;
        float x,y,z;
        float h,p,r;
        float vel,sin_h,cos_h;
        vgWindow      *win;
        vgObserver    *normal_obs;
    vgObserver    *rearview_obs;
        vgChannel     *rearview_chan;
        vgGfx         *rearview_gfx;
        vgPosition    *pos;
        vgMatStack    *matStack;
        vgMat         mat;

        /*初始化、读取ADF文件、配置系统*/
        vgInitSys();
        vgDefineSys("town.adf");
        /*改变主窗口外观*/
        win=vgGetWin(0);
        vgProp(win,VGWIN_WINBORDER,VG_OFF); /*不显示窗口边框*/
    vgProp(win,VGWIN_WINCURSOR,VG_OFF); /*不显示窗口边框*/
        vgConfigSys();

        /*满屏显示VEGA窗口*/
        vgSetWinPosToFullScreen(win);

        /*定义后视图形状态--背面显示*/
        rearview_gfx=vgNewGfx();
        vgProp(rearview_gfx,VGGFX_FRONTFACE,VG_OFF); /*不显示窗口边框*/
    vgProp(rearview_gfx,VGGFX_BACKFACE,VG_ON);
        /*定义后视通道*/
        rearview_chan=vgNewChan();
        vgName(rearview_chan,"RearView_Chan");
        vgChanViewport(rearview_chan,0.3f,0.8f,0.8f,1.0f);
        vgChanWin(rearview_chan,win);
        vgChanGfx(rearview_chan,rearview_gfx);
        /*定义后视观察者*/
        rearview_obs=vgNewObserv();
        vgName(rearview_obs,"RearView_Obs");
        vgObservScene(rearview_obs,vgGetScene(0));
        vgObservGfx(rearview_obs,rearview_gfx);
        vgObservEnv(rearview_obs,vgGetEnv(0));
        vgAddObservChan(rearview_obs,rearview_chan);
        /*设置前视观察者定位方式*/
        normal_obs=vgFindObserv("Default");
        vgProp(normal_obs,VGOBS_TETHERSTATE,VGOBS_STATIC);
        /*设置前视观察者的初始状态*/
        pos=vgNewPos();
        vgPosVec(pos,2500.0f,2600.0f,2.5f,0.0f,0.0f,0.0f);
        vgPos(normal_obs,pos);
        vgDelPos(pos);
        /*设置初始速度*/
        vel=0.0f;
        while(1)
        {
                pos=vgNewPos();
                /*模拟后视镜效果*/
                if(normal_obs&&rearview_obs)
        {
            vgGetPos(normal_obs,pos);/*获取前视观察者位姿矩阵*/
            vgGetPosMat(pos,mat);
            /*将矩阵压入堆栈矩阵*/
            matStack=vgNewMatStack();
            vgLoadMat(matStack,mat);
            /*将前视矩阵旋转180,并将水平翻转得到后视矩阵*/
            vgRotMat(matStack,180.0f,'z');
            vgScaleMat(matStack,-1.0f,1.0f,1.0f);
            vgGetMat(matStack,mat);
            /*设置后视观察者位姿*/
            vgPosMat(pos,mat);
            vgPos(rearview_obs,pos);
        }
        /*获取前视观察者位置矢量*/
        vgGetPos(normal_obs,pos);
        vgGetPosVec(pos,&x,&y,&z,&h,&p,&r);
        /*计算平转角h的正弦和余弦*/
        vgGetSinCos(h,&sin_h,&cos_h);
        if((h<-360.0f)||(h>360.0f))
        {
                h=fmod(h,360.0f);//计算余数
        }
        /*计算当前帧前视观察者水平位置坐标*/
        x-=vel*sin_h;
        y+=vel*cos_h;
        key=vgGetWinKey(win);
        switch(key)
        {
                /*按下r键控制是否显示后视镜*/
            case 'r':
        case 'R':
                        if(vgGetObservChan(rearview_obs,0))
                                vgRemObservChan(rearview_obs,rearview_chan);
                        else
                vgAddObservChan(rearview_obs,rearview_chan);
                        break;
                /*按下a恢复到运动初始状态*/
                case 'a':
                case 'A':
                        x=2500.0f;
                        y=2600.0f;
                        z=2.5f;
                        h=p=r=0.0f;
                        vel=0.0;
                        break;
                /*按向上键加速,速度最大为5*/
                case VGWIN_UPARROW:
                        if(vel<=5.0f)
                                vel+=1;
                        break;
                /*按向下键加速,速度最大为5*/
                case VGWIN_DOWNARROW:
                        if(vel>=-5.0f)
                                vel-=1;
                        break;
                /*按向左键左转*/
                case VGWIN_LEFTARROW:
                        h+=vel;
                        break;
                /*按向右键左转*/
                case VGWIN_RIGHTARROW:
                        h-=vel;
                        break;
                default:
                        break;
        }
        /*设置前视观察者的当前位姿*/
        vgPosVec(pos,x,y,z,h,p,r);
        vgPos(normal_obs,pos);
        vgDelPos(pos);
        /*帧同步*/
        vgSyncFrame();
        vgFrame();
        }
}

最近VR访客

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-5-13 11:53 AM

返回顶部