会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
游戏开发 > 程序设计 > 3D图形
第一人称视角场景漫游
发表日期:2007-01-24 17:25:07作者: 出处:  


    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
    );
}
 
返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00361