OpenGL边用边学------2 经典照相机模型

本文以照相机模型类比,详细解释了OpenGL的相机模型,包括布置场景、调整相机位置、选择镜头对焦、确定胶片位置等步骤,并对比了OpenGL相机模型与实际相机的差异,提供了编程建议。通过理解相机坐标系和世界坐标系,以及视图变换和模型变换,帮助读者更好地掌握OpenGL中的渲染过程。
摘要由CSDN通过智能技术生成

学习OpenGL必须要有一个感性的认识,最经典的类比就是照相机照相模型。现在几乎人人都有一部自带照相功能的手机了,所以这个模型对于绝大多数人来说都是非常容易理解的。

1 实际照相步骤

1.1 布置场景和调整照相机位置

照相模型
之所以把布置场景和调整相机位置放到了一起,是因为这两个步骤的顺序不是固定的,摄影师既可以自己移动相机,也可以指挥被拍的人移动位置。

1.3 选择镜头,对焦(Focus)

镜头的选择主要是为了达到合适的视角范围,镜头确定以后,焦距就确定了。

一般来说,调焦(Focus)并不是改变镜头的焦距,而是改变镜头与胶片的距离(像距)。

凸透镜能成像,一般用凸透镜做照相机的镜头时,它成的最清晰的像一般不会正好落在焦点上,或者说,最清晰的像到光心的距离(像距)一般不等于焦距,而是略大于焦距。具体的距离与被照的物体与镜头的距离(物距)有关,物距越大,像距越小,(但实际上总是大于焦距)。

这里写图片描述

1.4 按下快门

一切都调整好了,就可以拍照了。按下快门的那一刻,相机位置、场景布置都定格了,不再改变。感光器件(胶片)会记录下这一时刻的场景,绘制成一个矩形的二位像素图。

1.5 在电脑窗口中欣赏图片

然后就可以把照片转移到电脑中,使用看图软件把图片放到合适的位置进行欣赏了。

2 OpenGL的相机模型

2.0 确定胶片位置

OpenGL中没有真正的胶片,必须把拍摄到的图像放到一个指定的地方显示,这个地方就是视口。在上篇博文中已经专门介绍了视口的设置方法了,这里不再累述。

2.1 确立场景(世界)坐标系

与实际照相不同的是,OpenGL默认的物理世界里是没有任何物体的。需要程序员通过代码来建立场景中的物体。建模的最基本要素是确定物体的位置,而要描述物体位置首先要做的就是确定一个世界(场景)坐标系。这个坐标系必须是标准的笛卡尔右手坐标系,而其原点和长度单位却没有任何限制,由程序员根据实际需要自由确定。例如,对于整个城市的场景,原点可以设置在市政府,x,y方向可以分别设置为东西方向和南北方向,长度单位设置为米。而对于分子结构的场景,长度单位则可能是纳米了。

同其他状态变量一样,OpenGL的世界坐标系也有默认值,那就是一个标准右手三维直角坐标系,y轴向上,原点位置和长度单位没有定义。

创建坐标系是程序员的思维中进行的,无法直接体现到代码上,通过后面相机、物体的定位坐标数值来体现。

2.2 在世界坐标系中确定相机位置与方向

与场景中的其他物体一样,相机也是在世界坐标系中进行定位的。在OpenGL中,改变相机位置和方向的行为叫做视图变换,完成这个功能的函数是gluLookAt()

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

首先,确定的是照相机的坐标,通过(eyex, eyey, eyez)确定。

其次,是确定镜头的朝向,通过瞄准线上一点(centerx,centery,centerz)指定,需要注意的是,这个点并不是拍摄时对焦的点,只是用来确定镜头的方向而已。最终方向就是从点(eyex,eyey,eyez)到(centerx,centery,centerz)的连线方向。

最后,是旋转镜头,通过指定向上方向上经过的一点(upx,upy,upz)确定。需要注意的是,向上方向是由(0,0,0)到(upx,upy,upz)连线确定的,与相机坐标(eyex,eyey,eyez)没有关系。

OpenGL同样会在初始化时,为相机的位置和方向在世界坐标系中指定一个默认值。那就是,照相机位于原点,镜头朝向z轴负方向,向上方向为y轴正方向。相当于调用了gluLookAt(0,0,0,0,0,0,0,1,0)

2.3 在世界坐标系中建立物理世界模型

与实际照相不同,OpenGL里的物体都是虚拟的,想象出来的。具体来说ÿ

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值