我要发帖 回复

新手上路

1

主题

15

积分

0

专家分

:

私信
发表时间 : 2009-11-26 15:19:35 | 浏览 : 899    评论 : 0
[转帖]献给vega新手,如何开始编程之旅
我是一个即将毕业的本科生,由于毕业设计要用虚拟仿真做一个项目,这学期霸王硬上弓,临时学的vega,对我来说是一个巨大的挑战,对我来说vega是新的,c++是新的,lynx也是新的。
   学习过程中我找到了中国的为数不多的两个虚拟现实论坛,一个是虚拟客论坛,一个是虚拟现实中国社区。我从这两个论坛中学到了不少的东西,受到了极大的帮助。但我发现,论坛中提问的多,回答的少;初学者多,高手少;想学习的多,乐于帮助的少。
  既然我来到了这里,既然我选择了虚拟现实作为我的研究生课题,我就决心在论坛里呆下去了。我想每一个vega新手都渴望着有一个详细的,具体的,可见的例子能作为练习。希望我用近半个月时间做的东西有所帮助。(论坛里不乏高手,对于你们来说我得这个例子只是大海毅粟,我只是想通过这种方式使新手能够尽快入门,同时也向曾经帮助我得网友表示感谢)
  我的任务:1、能用键盘进行控制基本运动
            2、能进行碰撞检测。
            3、具有后视镜和小地图
我的材料来源
            1、王乘等编的《vega实时三维视景仿真技术》
            2、vega帮助文档
            3、国防工业出版社的lynx使用和编程教程(这两本书实际上就是vega自带的帮助文档的翻译)
  我遇到的问题
             1、碰撞检测的使用和算法
             2、后视镜的编程
             3、player和obsever的控制问题
下面正是开始我的vega编程之旅
  一个最基本的vega控制台程序非常简单,在任何一个介绍vega的材料中都可以见得到,为保证编程过程的完整性,我将他列于下面,至于各函数意思,请新手参考帮助文档。
       #include”vg.h”
       Main()
{
   vgInitSys();
          vgDefineSys(“**.adf”);
          vgConfigSys();
          while(1)
        {
           vgSyncFrame();
           vgFrame();            
}
}//这是我们走进vega的第一步。
这里不再介绍lynx的使用,能用编程完成的最基本的工作就是鼠标控制,这一点我相信也难不倒大家,但是如果想加入player,就需要注意了,这时的pos要设置成player的,否则,car不移动,而是obsever移动。
下面是 我的程序里关于键盘控制的代码
pos = vgNewPos();
        vgPosVec(pos,2500.0f,2600.0f,2.5f,0.0f,0.0f,0.0f); //设置初始姿态
        vgPos(car_plyr,pos);//注意,使用player的位置
        vgDelPos(pos);   
vgGetSinCos( h, &sin_h, &cos_h );
        if (( h < -360.0f)||( h > 360.0f ))
        {
        h = fmod( h, 360.0f );
        }
/* 计算当前帧player水平位置坐标 */
        x -= vel*sin_h;
    y += vel*cos_h;

     
                   vgGetPos( car_plyr, pos );
      vgGetPosVec( pos, &x, &y, &z, &h, &p, &r);

          key=vgGetWinKey(win);
           
          switch(key)
          {
                  /* 按下r键控制是否显示后视镜 */
          case 'o':
      case 'O':
           if (vgGetObservChan( mirror_obs, 0 ) )
                  vgRemObservChan( mirror_obs,mirror_chan );
          else
                  vgAddObservChan ( mirror_obs, mirror_chan );
            break;
                         /* 按下r键控制是否显示俯视镜 */
          case 'p':
      case 'P':
           if (vgGetObservChan( down_obs, 0 ) )
                  vgRemObservChan( down_obs,down_chan );
          else
                  vgAddObservChan ( down_obs, down_chan );
            break;
                        /* 按下a键回复到运动初始状态 */
      case 'r':
      case 'R':
           x = 2500.0f;
           y = 2000.0f;
           z = 2.5f;
           h = p = r = 0.0f;
           vel = 0.0;
            break;


          case 'A':      /* 视点左移 */
      case 'a':
                    h += vel/2;
            x -= vel*sin_h;
            y += vel*cos_h;
              break;
      case 'd':      /* 视点右移 */
      case 'D':
                    h -= vel/2;
            x -= vel*sin_h;
            y += vel*cos_h;
              break;
          case 'w':      /* 视点前移 */
      case 'W':
            x -= vel*sin_h;
            y += vel*cos_h;
              break;
          case 's':      /* 视点后移 */
      case 'S':
            x += vel*sin_h;
            y -= vel*cos_h;
              break;
         //按向上箭头加速,最高速度5
          case VGWIN_UPARROW:
                          if(vel<=5.0f)
                                  vel+=1;
                          break;
                 //按向下箭头减速,最低速度0
      case VGWIN_DOWNARROW:
                  if(vel>=-1.0f)
                          vel-=1;
                  break;
                  /* 按向左箭头左转 */
          case VGWIN_LEFTARROW:
                 h += vel/2;
                  break;
         /* 按向右箭头右转 */
          case VGWIN_RIGHTARROW:
                 h -= vel/2;
                 break;

          default:
                  break;
          }
         //设置player的当前帧位姿
          vgPosVec( pos, x, y, z, h, p, r);
             // vgPos( main_obs, pos );
      vgPos(car_plyr,pos);   
在这个时候仅仅在程序上改变是不够的,最为重要的时在lynx中的设置,这个问题曾经困扰了我一个星期天,在网友的帮助和自己的努力下,终于搞明白了
由于编程中没有设置观察者的位置,程序运行不起来。这需要在列于lynx中将observer的positioning method设置成tether_fixed,并调整好坐标,这样观察者就固定在player上了。
另外一点同样非常重要,player只有使用path navigater时才能够用编程的方式提供位置坐标。
只能键盘控制的程序遇到房屋会穿过去,编程要解决的第二个问题就是碰撞检测。这是论坛里经常问道的问题。我也曾经因为这个问题非常苦恼,虽然有一片很长的合贴专门讨论了这个问题,但只涉及一些概念,具体算法问题还得自己解决。
首先要说明的是使用lynx不能很好的解决碰撞,因为他只提供了一些数据,不进行编程就不能解决好多人都想要的cs效果。
关于各种isctor的原理,在vega提供的例子里又很好的说明,不明白的可以参考。同时自带例子还有一个飞机坠落的程序,我就是在那里找到了灵感。在我自己的程序里,汽车不能穿过房屋,更不会翻上房屋。
我使用了tripod和los方法。算法很粗糙,还有很多问题没有解决,但已经能够满足基本的使用了,los方法的z值小于一定值时,使小车退回到上一位置。可以解决穿墙问题,用tripod的角度到一定值,退回上一位置,可以不上房。具体代码请参见附件。
第三个难点是后视镜,这在例子里同样有一个mirror的例子,由于时间问题我就不展开了。
缺陷:
1、        汽车后退的碰撞我还没做。
2、        后退时后视镜显示不合理,还没有解决。
3、        栅栏的碰撞还没解决。//希望高手指点。
总结:我是一个vega新手,上面的控制台小程序对我来说是个挑战,但是我作出来了。我相信每个人只要认真学,多参考论坛和自带帮助都够成为高手。我和大家一同进步
另附源代码   

献给帮助我的两个重要论坛

最近VR访客

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

GMT+8, 2020-9-29 01:08 PM

返回顶部