本节最重要的一个内容,就是让视野可以平移+旋转+缩放(就像打CS游戏一样以第一人称视角去观察物体,如果可能的话W,S,A,D四个按键控制人物移动,还有鼠标控制视角),本节最重要的一个概念就是设置观察视角(gl.LookAt函数,这个函数一共有九个参数,我们可以分成三组,第一组XYZ表示了眼睛的位置,第二组XYZ表示了物体的XYZ,第三组代表人眼睛的朝向,正常为(0,1,0),如果不用眼睛而是用相机作比喻,相机正常安装放置,也可以倒180度安装放置,则对应参数为(0,-1,0),也可以斜着放置,总之三个参数可以描述相机的放置方法)
在测试这九个参数之前,我们仍然要做一些初始化的工作(在OpenGLInitialized方法中做比较典型)有一个函数Perspective,还有一个函数MatricxMode,都先照着抄,意义大致就是设置为第一人称的观察模式
在程序加载的时候,要设置初始的九个参数值(为了对比测试结果,先按照下面的做,我们只是让眼睛的Z有一个数值,其他都保持为1,除了UP_Y是1,最后三个参数一般设置为0,1,0即可)
仅仅修改眼睛的三个数值,同时把眼睛的位置用一个小球画出来,把观察点也用小球画出来(目前的观察点是不变的,保持为0),感受(你的人在平移,没有转头,低头,抬头,注意只是位置在平移,你眼睛始终盯着那个绿色的小球)
再来做一个简单的测试,我们如果让ViewEyeX和ViewObjectX同时移动会怎样?可以发现确实能够实现平移运动(就相当于你在平移视图)
如果勾选Y参与则为往另一个方向平移运动
Z参与的效果就是缩放(可以想象绿色的小球一开始在画布的Z=0的位置,而且画的底平面也是Z=0的位置,你把眼睛和视角的坐标同步往前推,绿色的小球就跑到了底平面的后面,所以看不到了,而你的眼睛还在往前走,所以看到的底平面越来越大,感觉在缩放),当然如果你不让Z参与,仅仅动Eye_Z,也是能实现缩放的,而且缩放效果更明显,因为观察的点不变,人在往前走,就像你本来墙上有一行字看不清,你凑上去看(而勾选Z参与的效果更像是墙上有一行字,你往前凑上去看,这行字也后退,你只是看到墙越来越近了),具体是否勾选Z参数来设置缩放后面介绍。
再来思考一个问题,如果我们始终不修改lookat的九个参数,只是在实际绘图之前加入一个平移+一个旋转的变量,会怎么样?(你的眼睛和观察点都保持不变,但是实际上绘图开始点却每次都在变),将这个之前需要明确一个很重要的概念。OPENGL中如果用PushMatrix和PopMatrix包起来的则是不影响外面的(比如我没有把绘制之前的平移用这个包起来,则会对后面所有绘制的东西产生影响,相反我在绘制底平面,小球之类的东西时候,只要用这个包起来,我包起来的部分不管怎么平移+旋转,对外来说都等于没有改变画笔的位置和姿态)
可以证明也是能实现平移,缩放,旋转的,注意其实本质是一样的(你要看更大的效果,要么你走近了看,要么你把画布挪近了看,你要看画布翻转,要么你人围着画布走一圈,要么你把画布绕着他自己中间转一圈等等)。注意不要修改UP_X,UP_Y,UP_Z的值,一般相机的安装位置固定了之后,参数就应该是固定的,你改了这三个参数,那么前面的说法就不成立了(比如我给了一个UP_X的不是零的值,我再测试Trans_X的时候就不是标准的X方向平移了),实际上改完之后相机到底是什么样一个效果也不好说(比较牛逼的软件MAYA,3DMAX会给出一个相机的图示,告诉你当前相机就是这么安装的,我们不做特别复杂的应用,不会用到调相机参数的问题)
毋庸置疑,我们绘图的中心位置就是平移和旋转的坐标系中心点(前后,左右,绕Z轴翻转,而且能够看到大部分我们需要的视角就够用了,这种方法比前面去分析九个参数要简单的多)
在附件的参考代码中有一个cameraRove的范例程序,他总结了类似于CS的第一人称视角,但是实现的还不够完整,感兴趣的读者可以自己深入研究实现的原理,我个人只能看懂一部分(我把他的九个参数都用文本框采集出来了,实际上在修改视图的时候只有m_ViewX和m_ViewZ在动,具体怎么动的就感觉很复杂了)
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删