网页功能: 加入收藏 设为首页 网站搜索  
第一人称视角场景漫游
发表日期:2007-01-24作者:[转贴] 出处:  


    AirRoam() 函数实现了在以第一人称视角在平面场景中漫游.
  原来一直见到网上做OpenGL的朋友在找用glLookAt实现这种功能,所以抽了点时间研究了一下,现拿出来让大家指教指教.一般情况下实现第一人称视角游戏有两种方法,一是移动场景,二是移动眼坐标.移动场景方法比较简单,使用glTranslatef与glRotatef配合即可,但一般只在简单场景和单角色的情况下使用,而且角色的各种计算(如实时坐标、碰撞)不好实现,所以不推荐使用;移动眼坐标的方法就非常灵活,它对场景和角色的状态未做任何操作,一般只要设置成跟随主角色移动旋转即可实现第一人称视角视觉效果.
    下面的函数只在 y=8.0 的平面移动,做空战游戏兄弟可以对 s_eye[1] 动动手脚就 OK 了< 补充: KEY_DOWN(DIK_DOWN) 用DirectInput实现 >.
void AirRoam(void)
{
  // 追踪观察点的方向
  static GLfloat s_eye[] = { 0, 8.0, 0};
  static GLfloat s_at[]  = { 0.0, 0.0, 0.0 };
  static GLfloat s_angle = -90.0;
  float speed = 0.3f;
  float PI=3.14159f;

  // 旋转请求
  if (KEY_DOWN(DIK_LEFT))
  {
    s_angle -= 2.0;
  }
  if (KEY_DOWN(DIK_RIGHT))
  {
    s_angle += 2.0;
  }

  float rad =  float(PI*s_angle/180.0f);

  // 前进,后退请求
  if (KEY_DOWN(DIK_UP))
  {
    s_eye[2] += (float)sin(rad) * speed;
    s_eye[0] += (float)cos(rad) * speed;
  }
  if (KEY_DOWN(DIK_DOWN))
  {
    s_eye[2] -= (float)sin(rad) * speed;
    s_eye[0] -= (float)cos(rad) * speed;
  }


  // 观察点
  s_at[0] = float(s_eye[0] + 100*cos(rad));
  s_at[2] = float(s_eye[2] + 100*sin(rad));
  s_at[1] = s_eye[1];

  // 设置观察点
  glLoadIdentity();
  gluLookAt(s_eye[0], s_eye[1], s_eye[2],
    s_at[0], s_at[1], s_at[2],
    0.0, 1.0, 0.0
    );
}
 
我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 第一人称视角场景漫游
本类热点文章
  DDraw和D3D立即模式编程手册
  矩阵求逆的快速算法
  本地化支持:OGRE+CEGUI中文输入:OGRE方..
  Direct3D中实现图元的鼠标拾取
  3D场景中的圆形天空顶
  OpenGL显卡编程
  一种高效的基于大规模地形场景的OCCLUS..
  一个完善的读取3DS文件例子
  如何制作一个可控制的人体骨骼模型
  Direct3D 入门之我见
  Slope(斜坡) 法线生成算法,在地形渲染..
  新手翻译的FAQ--可视和转换(学opengl两..
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00574