opengl 投影 glOrtho gluPerspective gluLookAt 转载不同作者的理解

1.http://blog.csdn.net/soasoa/article/details/6208382

正投影和透视投影是OPENGL里最基本,而且最重要的内容.

下图分别是正投影和透视投影的运行效果图,运行的是两个大小,外貌完全相同的组合矩型框体.

但是视觉效果上却非常不一样,这正是正投影和透视投影的区别.

 

这由于正投影的逻辑宽度在前,后,顶,底,左,右都是相等的. 正投影往往适用与CAD, 文本,建筑绘图,2D游戏等用3D来描绘2D的处理,关键代码:

void glOrtho(double left, double right, double bottom, double top, double near_val, double far_val);

//这里注意是 GL 的函数, glOrtho更像是设置平面的坐标系统

//left是左坐标,right是右坐标,bottom是底坐标,top是顶坐标,near_val是近可视,far_val是远可视

 

 

透视投影则执行透视除法,对距离观察者较远的物体矩阵进行缩短和收缩.在投影到屏幕后,可视区域后端和前端的可视宽度不同.所以透视投影更适用于3D场景.例如3D游戏,关键代码:

void gluPerspective(double fovy, double aspect, double zNear, double zFar); 

//这里注意是 GLU 的函数,gluPerspective像是设置摄像机,也像人的眼睛

//fovy为可视角度,aspect宽高比例,zNear近可视,zFar是远可视

 

一般来说透视投影会配合

    glu.gluLookAt(0.0, 0.0, 0.0,
                           0.0, 0.0, 1.0,
                           0.0, 1.0, 0.0);      

使用,原形为

public void gluLookAt(double eyeX, double eyeY, double eyeZ,             //表示眼睛的坐标

                                  double centerX, double centerY, double centerZ,        //眼睛看向哪个点

                                  double upX, double upY, double upZ) ;                       //角度宽度,一般为0,1,0

在不使用 gluLookAt 的情况下,系统默认眼睛(摄像机)在原点,也就是(0,0,0)点,向着负Z轴方向看,那么眼睛看向的反方向就是正Z轴方向

简单比喻就是gluPerspective设置眼睛的性能 , gluLookAt 设置眼睛的位置和视觉方向.



2.http://blog.csdn.net/versuna/article/details/8639381

void gluLookAt (   eyex,   eyey,   eyez,   centerx,   centery,   centerz,   upx,   upy,  upz);

void glOrtho ( left,  right,  bottom,  top,  zNear,  zFar);

 

正投影的视景体是这么定义的:

    仅以eye,center和up为参考点的长方体。这里Ortho的6个参数均自带正负号

      例子: eye = [ 80, 0, 0 ] ,center=[ 80, 0, -1 ]说明从eye看向center点,up=[ 0, 1, 0 ]  glOrtho ( -10,  20,  0,  30,  10,  20),表示的视景体是[ 70, 100 ]*[ 0, 30 ]*[ -10, -20 ]。注意到本例中eye并不在视景体里面。

     

     红点是eye,蓝色箭头是看的方向(也就是center-up),视景体是ABCDEFGH,最后在屏幕上显示的是将EFGH面压向ABCD(就是说是从ABCD面看向这个视景体)。

     再给几个例子。eye = [0,0,0],center = [1,1,0],up = [ -1, 1, 0],glOrtho = [ -20, 20, -10, 10, -5, 5 ]

eye在原点,看向center这个点,头顶朝up。那么ABCDEFGH为视景体,EFGH是left面,ABCD是right面,ABFE是zNear面,DCGH是zFar面,BCGF是bottom面,ADHE是top面。ABDC在 z = 20,EFGH在 z = -20 , ABFE和DCGH都垂直于center-eye这个向量。最后在显示器上的是从ABFE看这个视景体,即将DCGH压向ABFE。

    对于上面的例子,仅将center改成(-1, -1, 0),即与图中的center方向相反,则EFGH是right面,ABCD是left面,ABFE是zFar面,DCGH是zNear面,BCGF是bottom面,ADHE是top面

     

 以上,知道怎么定义视景体了:假设人站在eye处,眼睛看向center这个点,头顶朝着up这个点。这3个值固定后你的头也就完全固定住了。left和right分别确定了头左右2边范围,注意,头左边的值是负的!也就是说,如果left= -10,right=10表示从头左边10到头右边10的范围,但是当left=5,right=10,表示的却是头右边5到10的范围。bottom和top表示头下方和上方的范围,bottom = -10, top=10,说明从头下面10到头上面10,bottom = 5, top=10,表示头上面5到10。zNear和zFar表示头(眼睛)后前的范围,zNear = -10, zFar=10,表示从眼睛后面10到眼睛前面10,zNear = 5, zFar=10,表示从眼前5到10。注意,上面的顺序都可以交换,比如left=5,right=10和left=10,right=5,表示的左右范围都是一样的,并且这个改变不会影响你的观察结果,但是!建议按从左到右,从下到上,从后到前的顺序。最终的观察方向是由LookAt函数决定,Ortho只是在LookAt给定的条件下创建可视区域(视景体)。

 

    gluPerspective也和上面的Ortho差不多。gluPerspective( fovy, aspect, zNear, zFar ),他和Ortho不同的是zNear和zFar必须大于0,也就是说在LookAt条件下(如不显示调用,仍有默认值),只能是在眼睛前面的视景体,不能裁剪到眼睛后面,至于zNear和zFar是否一定要求 Near > Far 这个我没试过,但是在编程的时候还是这么认为吧,免得出错。

  

 

    注意:

1、GL编程中,有这样的要求:视点变换在模型变换之前指定,但投影变换和视口变换可以在绘图之前的任意时候指定世界坐标系中v点由3D到2D(这里2D不是屏幕坐标,若到屏幕还要经过视口变换)是经过变换:ProjectinMatrix * ModelViewMatrix * v,LookAt是ModelViewMatrix一部分,Ortho和Perspective都是ProjectinMatrix的一部分。


3.http://blog.163.com/qiang_zx/blog/static/4321934201422813747952/

OpenGL视图--gluPerspective glOrtho glFrustum gluLookAt - 寒泉 - 晨曦之露

void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar )

near 和 far 决定了投影参考点与裁剪窗口的距离,fovy决定了裁剪窗口的高度,还有个参数 aspect 确定了裁剪窗口的长宽比例。

所以fovy越大,裁剪窗口越大,相对的裁剪窗口中的物体就越小。

 void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

OpenGL视图--gluPerspective glOrtho glFrustum gluLookAt - 寒泉 - 晨曦之露

正交投影与 glOrtho :
void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)
OpenGL视图--gluPerspective glOrtho glFrustum gluLookAt - 寒泉 - 晨曦之露  
在现场可见量由两个浅蓝色飞机围成块。
透视与 gluPerspective :
void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar )
OpenGL视图--gluPerspective glOrtho glFrustum gluLookAt - 寒泉 - 晨曦之露  

在现场可见卷是由两截断金字塔浅蓝色飞机包围。

透视与 glFrustum :
void glFrustum(GLdouble  left, GLdouble  right, GLdouble  bottom, GLdouble  top, GLdouble  nearVal, GLdouble  farVal);

OpenGL视图--gluPerspective glOrtho glFrustum gluLookAt - 寒泉 - 晨曦之露

4.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值