游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1606|回复: 2

学opengl编3d游戏中的一个问题

[复制链接]

11

主题

26

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2006-6-21 11:02:00 | 显示全部楼层 |阅读模式
书的第四章是实现一个漫游功能,当按下left键后向左转,right向右转,up前进,down后退,page up向上仰。g_Angle,rad_xz的初始值均为0。程序如下

BOOL baiscobj:isplayScene()
{ float speed=0.2f;
  if (KEY_DOWN(VK_SHIFT))  speed   =speed*4;
  if (KEY_DOWN(VK_LEFT))   g_Angle-=speed*2;
  if (KEY_DOWN(VK_RIGHT))  g_Angle+=speed*2;
  rad_xz = float (3.13149* g_Angle/180.0f);
  if (KEY_DOWN(33)) g_elev +=0.2f;
  if (KEY_DOWN(34)) g_elev -=0.2f;
  if (g_elev<-100) g_elev  =-100;
  if (g_elev> 100) g_elev  = 100;
  if (KEY_DOWN(VK_UP))
  { g_eye[2]+=sin(rad_xz)*speed;
    g_eye[0]+=cos(rad_xz)*speed;
  }
  if (KEY_DOWN(VK_DOWN))
  { g_eye[2]-=sin(rad_xz)*speed;
    g_eye[0]-=cos(rad_xz)*speed;
  }
  if (g_eye[0]<-(MAP*2-20)) g_eye[0]= -(MAP*2-20);
  if (g_eye[0]> (MAP*2-20)) g_eye[0]=  (MAP*2-20);
  if (g_eye[2]<-(MAP*2-20)) g_eye[2]= -(MAP*2-20);
  if (g_eye[2]> (MAP*2-20)) g_eye[2]=  (MAP*2-20);
  g_eye[1] =1.8;

  g_look[0] = float(g_eye[0] + 100*cos(rad_xz));
  g_look[2] = float(g_eye[2] + 100*sin(rad_xz));
  g_look[1] = g_eye[1];

  gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1]+g_elev,g_look[2],0.0,1.0,0.0);
  return TRUE;
}

问题是,为什么在if (KEY_DOWN(VK_DOWN))中g_eye[2]+=sin(rad_xz)*speed;我画了个示意图,怎么总是cos(rad_xz).请各位指教。示意图在附件中,从A到A‘,|AA'|=speed.假设它向左转了一个角度a。


sf_200662111130.jpg

11

主题

26

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2006-6-21 15:36:00 | 显示全部楼层

Re:学opengl编3d游戏中的一个问题

g_eye[0],g_eye[1],g_eye[2],分别代表眼睛的x,y,z;g_look是参考点

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2006-6-22 10:22:00 | 显示全部楼层

答案:

是 g_eye[2]+=sin(rad_xz)*speed;
角度是 人的方向与 -Z轴方向之间的角.
所以Z轴上的变化,应该是 SIN

而且OPENGL的+Z是向着我们的,所以符号是 +
所以 g_eye[2]+=sin(rad_xz)*speed;是正确的.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 19:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表