OpenGL中的坐标介绍

OpenGL中的6种坐标系

OpenGL中存在6种坐标系,

1. Object or model coordinates

2. World coordinates

3. Eye (or Camera) coordinates

4. Clip coordinates

5. Normalized device coordinates

6. Window (or screen) coordinates

object coordainatesworld coordinates再到camera coordinate的变换,在OPENGL中统一称为model-view转换,初始化的时候,object coordinatesworld coordinates还有camera coordinates坐标重合在原点,变换矩阵都为Identitymodel-view matix转换points,vectorsdcamera坐标系。

 

opengl编程中,有个困惑的问题,就是那个坐标系是不动的,我想是你想参考坐标系是不动的。比如我想建立了一个object,放到 camera坐标系中,这时,我以camera的原点为参考点。当然,我想看这个物体的时候,我就以object的原点为参考点,移动camera坐标系的原点,就可以看到object了。好像写了一堆废话,呵呵。

 

 

其中四种坐标经常要在程序中用到:世界坐标,物体坐标,设备坐标和眼坐标

 

世界坐标OpenGL中用来描述场景的坐标,Z+轴垂直屏幕向外,X+从左到右,Y+轴从下到上,是右手笛卡尔坐标系统。我们用这个坐标系来描述物体及光源的位置。

将物体放到场景中也就是将物体平移到特定位置、旋转一定角度,这些操作就是坐标变换。OpenGL中提供了glTranslate*/glRotate*/glScale*三条坐标变换命令,利用OpenGL的矩阵运算命令,则可以实现任意复杂的坐标变换。

 

非常重要:OpenGL中有一个坐标变换矩阵栈(ModelView)栈顶就是当前坐标变换矩阵,进入OpenGL管道的每个坐标(齐次坐标)都会先乘上这个矩阵,结果才是对应点在场景中的世界坐标。OpenGL中的坐标变换都是通过矩阵运算完成的,与图形学课本的描述完全一致。要注意的是变换中的矩阵乘法是左乘,而矩阵乘法与算术乘法不同,不符合交换律(万一不明白去看矩阵代数书好了)

 

glTranslate*(x,y,z):平移,参数为各轴向的移动量。
glRotate(d,x,y,z)
:旋转,第一个参数为转动的度数,后三个参数表明是否绕该轴旋转。通常x,y,z中只有一个为1,其余为0,用连续几条旋转命令完成复杂旋转。由于矩阵运算的左乘特点,旋转命令的顺序与旋转动作的顺序正好相反

 

物体坐标是以物体某一点为原点而建立的世界坐标该坐标系仅对该物体适用,用来简化对物体各部分坐标的描述。物体放到场景中时,各部分经历的坐标变换相同,相对位置不变,所以可视为一个整体,与人类的思维习惯一致。

 

眼坐标是以视点为原点,以视线的方向为Z+轴正方向的坐标系中的方向。OpenGL管道会将世界坐标先变换到眼坐标,然后进行裁剪,只有在视线范围(视见体)之内的场景才会进入下一阶段的计算。

 

同样的,有投影变换矩阵栈(Projection),栈顶矩阵就是当前投影变换矩阵,负责将场景各坐标变换到眼坐标,由所得到的结果是裁剪后的场景部分,称为裁剪坐标。前面提到过的视见体设定其实就是在建立该矩阵。

 

设备坐标:OpenGL 的重要功能之一就是将三维的世界坐标经过变换、投影等计算,最终算出它在显示设备上对应的位置,这个位置就称为设备坐标。在屏幕、打印机等设备上的坐标是二维坐标。值得一提的是,OpenGL可以只使用设备的一部分进行绘制,这个部分称为视区或视口(viewport)。投影得到的是视区内的坐标(投影坐标),从投影坐标到设备坐标的计算过程就是设备变换了。

 

矩阵栈切换:glMatrixMode(GL_MODELVIEWINGGL_PROJECTION);本命令执行后参数所指矩阵栈就成为当前矩阵栈,以后的矩阵栈操纵命令将作用于它。

 

矩阵栈操纵命令:
glPushMatrix(); 当前矩阵入栈,这时矩阵栈将栈顶值压入栈。
glPopMatrix(); 栈顶出栈,通常与上一条命令配合使用。
glLoadIdentity(); 将栈顶设为不变矩阵(就是对角线全为1其它为0的那个)

glMultMatrix(M);将栈顶T设为M·T

1,世界窗口到视口的变换

世界窗口顾名思义就是我们的真实三维世界。而视口就是我们OpenGL程序的窗口,我们通过程序的窗口去观察世界需要一个映射,下图很形象的表明了 世界窗口和视口的关系。
OpenGL中的坐标问题

上图中有边界的就是视口,后面很大的就是世界窗口。

在OpenGL中对于2D情况,世界窗口由函数gluOrtho2D()设定,视口由函数glViewport()设定。
gluOrtho2D函数原型:
void gluOrtho2D(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top);

left:世界坐标的最左边,right,bottom,top类似。当然这个可以任意的,比如你想观察x>0 和 y>0的区域,你可以设置gluOrtho2D(0,200,0,200)。当然你也可以颠倒窗口gluOrtho2D(0,200,200,0)。这个和上一个关于X对称。
glViewport函数的原型:
void glViewport(Glint x, Glint y, Glint width, Glint, height);
这里各参数的含义很显然的,窗口左下角(left,bottom),右上角(right,top)。下面的视口的左下角(x,y),右上角(x+width,y+height)。设置绘图区位于打开窗口的位置。这里默认左下角的坐标为(0,0)。窗口和视口有一个比例因子,这就好像一张尺寸小的图片被用来作为电脑屏幕时要铺满一样,如果
gluOrtho2D大小 < glViewport的话则原图被比例的放大一样。反之则会变小,总之最终都会适应视口。因为视口最终显示出来。

 

2,坐标变换

在视口中如何画出如下的一个坐标系,默认的坐标系是观察者在Z的正半轴无穷远处,窗口水平向右为X正,窗口垂直向上为Y的正,从Z轴看过去,显然Z收缩为一点,因此只能看到垂直相交的XY,怎么样才能看到三个轴呢?所以要经过几次旋转才能得到这种效果。首先沿Y逆时针旋转45度,此时你仍然看不到三个轴,因为转过来的Z完全遮住X了,好像观测者与初始的X轴平行,所以接下来沿着旋转后的XY角平分线旋转逆时针45度就可以看到效果了,当然不一定是角平分线(只要XY以内就可以),也不一定是45度。

OpenGL中的坐标问题

Z轴竖直向上的变换代码如下:

 glRotated(-90.0, 1.0, 0.0, 0.0); //绕x顺时针旋转90,Z轴竖直
 glRotated(-45.0, 0.0, 0.0, 1.0); //XY平面绕Z顺时针45。
 glRotated(45.0, 1.0, 1.0, 0.0);  //绕XY的角平分线逆时针45,旋转可以看到效果


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值