如何实现第一人称视角

huangxiaofei 2003-01-31 01:59:42
我现有两个问题:
1。OPENGL中的glLookAt()函数的具体的用法及参数的意义。
2。我现在想实现第一人称视角,并用鼠标控制。有一个tutorial程序中的方法是先取得鼠标在水平和垂直方向上的偏移量,并用水平偏移量决定视角的左右移动,用垂直偏移量决定视角在上下方向上的移动。这我都能明白。接着,它又以Y轴为中轴,旋转视角,作为左右变换视角的实现,这我也能想通。但是,最后他又用什么CROSS()的方法求得一个矢量,作为上下移动视角的转轴,并且还要规格化(Normaliaze),最后在绕着这个规格化了的转轴旋转视角,这我就不明白了,上下旋转视角,不就是绕着X轴吗?为什么搞那么烦?可是我使者让程序在X轴上转,结果又不对。我想不出为什么,希望高手指教。
...全文
244 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
loneststar 2003-02-08
  • 打赏
  • 举报
回复
有两种方法.
一种是变换场景,使之向你键盘发出的移动方向的相反方向移动.

坐标平移glTranslate(x,y,z);
旋转 glRotate(rot,dx,dy,dz);
即可实现.
另一种是变换Camera,使把你的Camera 摆在你眼睛的位置,
计算出Camera 的Position, ViewPosition, UpDirection.
Position 即Camera 的位置, 即你现在的位置.
ViewPosition 即Camera 的焦点所处的位置,简单理解成你眼睛在盯着远方的哪一个位置在看.
UpDirection 即Camera 向上的位置.
这几个量都可以根据你距X,Y轴旋转的角度算出来.
然后先调用glLoadIdentity();
将投影矩阵置1;
然后调用glLookAt(Position.x,Position.y,Position.z,
View.x,View.y,View.z,
Up.x,Up.y,Up.z);



Leon8086 2003-02-01
  • 打赏
  • 举报
回复
首先你要明白一点,gluLookAt函数并不是真正的在场景生成之后再让你从某一点上LookAt!这个函数的前缀glu已经说明这是一个在gl族函数基础上的函数。他的作用其实是将当前矩阵乘上根据参数计算出来的一个矩阵,产生模拟的LookAt效果。
最简单的例子就是如果你这样调用:
gluLookAt( 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 );
gluLookAt( 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 );
其结果等于
gluLookAt( 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 );
所以其实这个函数的作用并不大,他的作用相当于一连串的glTranslate,glRotate,glScale函数并不是我们真正意义上的LookAt。
现在回到你上面的问题,如果你能够想通我上面的那些,就不难理解为什么要这么做了。
这个问题其实每个作OpenGL程序的程序员都会遇到,比如旋转一个茶壶,如何保证任意时刻的旋转都是基于当前视平面的?如果你简单的用两个glRotate或者在一个方向上用rotate然后再旋转视角(这种方法等价于第一种方法,因为对于OpenGL来说,你用LookAt旋转视点和相反方向Rotate相同的角度,是等价的)是没有用的,这样的话你的茶壶总有一个方向的旋转是绕茶壶的某个方向而不是当前视平面的。这很明白,先绕X轴转n角度再绕Y轴转m角度和倒过来先绕Y轴再绕X轴的几何意义是不一样的,但在如果使用这种方法,得到的结果却是一样的。
所以我对你描述的那个算法的猜测是,他计算当前的视点(真正的视点)和目标点形成的矢量,将这个矢量看成-Z,垂直于这个矢量的平面为XY平面(不知道他的XY坐标方向是怎么确定的),在这个坐标系里面做变换。这个牵涉到很复杂的数学计算,想想头都大。
我用的方法比较简单一些,我没有用LookAt,只是记录当前的变换矩阵,用户输入在某一个方向上旋转后,将旋转矩阵乘上当前矩阵。Render的时候用这个矩阵乘当前的变换阵就可以了。
FXCarl 2003-01-31
  • 打赏
  • 举报
回复
问题是一般的X轴旋转你不在转轴上呀

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧