一、由于刚学习opengl,我不知道opengl内是如何定义的,以下定义的坐标系是我个人自己定义的:
视觉坐标:我们从屏幕看到的三维世界,即未旋转的三维绘图的坐标系,屏幕外为z轴,屏幕右为x轴,屏幕上为y轴。这个坐标系不会旋转是固定的(当然可以反着理解,世界坐标系不变,改变的是视觉坐标,后面的都是以视觉坐标不变理解的,若以世界坐标不变的则刚好相反理解)。
视觉界面:视觉是屏幕显示的界面,它是从视觉坐标系(0,0,-1)为中心显示的一个界面,界面的大小由屏幕决定。
三维世界的坐标系,绘图坐标系:起初屏幕外为z轴,屏幕右为x轴,屏幕上为y轴,在利用旋转函数和移动绘图坐标系后就会与视觉坐标系有所差异了。
二、视觉界面由视觉坐标系与三维世界坐标系中的绘图物体共同决定的。
三维世界原始绘图与视觉坐标是一致的,当三维世界坐标系旋转后,原来的x、y、z轴会发生变化但是三维世界坐标系内的点坐标不会改变,但是投影到视觉坐标后都会有所改变,而投影到视觉坐标系后,有些点在-1层后面的可以显示的点经过旋转后投影到视觉坐标点后大于等于-1层后就不会显示了,这就会导致视觉的变化。
三、3D漫游的实现方法:
视觉界面由视觉坐标和三维世界坐标系共同决定,当我们想漫游一个三维场景时候通常有2种改变,即视觉方向的改变和视觉点的改变。
视觉方向:屏幕显示的三维世界内的方向的改变,如向左右上下旋转视觉。
视觉点:原始视觉界面是(0,0,-1)为中心的显示投影在视觉坐标系-1层后的三维世界。这里的(0,0,-1)就是视觉点。
视觉方向的改变可以利用glTranslatef函数来实现,当向右旋转视觉时候我们就把三维世界绕y轴逆时针方向旋转一定角度。同理如果向上小修改的话就绕x轴旋转一定角度。
视觉点改变:视觉点的改变主要是用到glTranslatef(x,y,z),修改绘图的中心点,如果我们要向前走就将z的坐标增加一定的值,若想向左走就将x的坐标增加一定的值。
注意:视觉点初始位置在视觉点(0,0,-1),因此显示的三维世界时候通过旋转平移三维世界来漫游的,因为显示界面有固定大小,因此注意不要把视觉界面最下的点当作视觉点的z坐标。
四、物体旋转的坐标变换
当利用glrotatef函数旋转,我们可以理解把整个三维世界按照右手准则(类似安培右手准则)旋转(当然也可以理解为视觉坐标绕相反方向旋转,后面是以旋转三维世界理解),而当我们在设定绘图原点,gltranslate()时候就是设定绘图原点,它的调用一般都在旋转函数前,因此在三维漫游的时候想让物体的前进后退,左移右移都不会因为旋转而改变,可以直接修改原点的参数来实现漫游。