OpenCASCADE Camera

本文介绍了OpenCASCADE的Graphic3d_Camera类如何管理和简化三维视图的变换操作,包括视图变换、模型变换和投影变换。通过类比相机拍照过程,详细阐述了观察矩阵、模型/视图矩阵、投影变换和视口变换的概念,并提供了OpenCASCADE中相关代码实现正投影和平行投影的方法。
摘要由CSDN通过智能技术生成

1. Introduction

在三维场景中变换的过程与用相机拍照的过程很相似,如下图所示,拍照的过程大概如下:

wps_clip_image-29450

Figure 1.1 The Camera Analogy (From the Red Book)

v 放好三角架并使相机对准要拍照的场景(viewing transformation);

v 布置好场景到理想的位置,以便拍照(modeling transformation);

v 选择镜头或调整变焦(projection transformation);

v 确定最终的照片要有多大尺寸,例如你可能需要放大一些的照片(viewport transformation);

OpenCASCADE在6.8.0版本中引入了一个Graphic3d_Camera类来对视图的变换进行管理,通过对camera的调整,方便对场景中的模型/视图(Model/View)进行变换。

wps_clip_image-6395

Figure 1.2 Camera in the Scene

如下图所示,对象的空间坐标经过一系列的变换,最终得到显示屏幕上的二维坐标。

wps_clip_image-31265

Figure 1.3 Stages of Vertex Transformation (From the Red Book)

为了指定viewing, modeling和projection变换,可以构造一个4x4的矩阵与顶点的齐次坐标相乘来实现这些变换。

2.Coordinate Transforms

在计算机图形学中,造型MODELING就是定义一个可渲染物体的数字表示。对于OpenGL而言,通常就是用多边形来近似表示一个物体。用多边形表示物体至少需要每个多边形顶点的坐标和连接关系的信息。附加的信息包含顶点颜色、法向量或贴图坐标等。

三维对象的属性如顶点位置及面的法向量,为了造型的方便,通常定义在对象空间OBJECT SPACE中,即在局部坐标系中建模。对象空间通常也叫作模型空间MODEL SPACE或造型坐标系统MODELING COORDINATE SYSTEM。

在 一个包含大量三维对象的场景中,每一个对象都是在其对象空间中建模的,这是我们就需要一个统一的坐标系统COMMON COORDINATE SYSTEM,通常称之为世界空间WORLD SPACE或世界坐标系WORLD COORDINATE SYSTEM,或绝对坐标系。

定 义了世界坐标系统后,场景中所有模型对象必须从其局部坐标系变换到世界坐标系中来。从对象空间变换到世界空间的变换称之为模型变换MODELING TRANSFORMATION。若模型对象造型坐标系中的单位是feet,但是世界坐标系中是inches,对象坐标必须缩小12倍以得到世界坐标系。若 对象在其对象空间中朝前的,但是在世界场景中需要其朝后,那么需要对模型对象进行一个旋转变换。当要将模型对象放到场景中的合适位置时,那么就需要进行一 个移动变换。所有这些单个变换也可以合成一个矩阵,即模型变换矩阵MODEL TRANSFORMATION MATRIX,就是表示将模型对象从对象坐标系变换到世界坐标系中。

当场景确定好后,视图viewing parameters的参数就需要确定了。视图的参数之一就是视点vantage point(eye or camera position),即在哪里对模型进行观察。视图的参数还包括焦点focus point(also called the lookat point or the direction in which the camera is pointed)和向上的方向(the camera may be held sideways or upside down)。视图的参数定义了视图变换VIEWING TRANSFORMATION,它们也可以合成一个矩阵,称作视图矩阵VIEWING MATRIX。一个坐标乘以这个矩阵就可以将其从世界空间变换到观察空间EYE SPACE,也称为EYE COORDINATE SYSTEM。由定义可知,此坐标系的原点位于视点处。

尽管有些3D图形API允许分别指定模型变换矩阵modeling matrix和视图变换矩阵viewing matrix,但是在OpenGL中将这两者合成为一个矩阵,称为模型/视图矩阵MODELVIEW MATRIX。这个矩阵定义了坐标从对象空间变换到观察空间的变换。

wps_clip_image-5810

Figure 2.1 Coordinate spaces and transforms in OpenGL(From OpenGL Shading Language)

在 OpenGL中,可以调用函数glMatrixMode来选择modelview matrix或其他的矩阵,然后可以调用函数glLoadIdentity将当前矩阵设置为单位矩阵,或调用函数glLoadMatrix将当前矩阵替换 为任意一个矩阵。替换时你需要清楚地知道你要进行的变换操作,否则容易产生完全不可理解的视图。还可以调用函数glMultMatrix来将当前矩阵与任 意矩阵相乘。可以通过调用函数gluLookAt来设置modelview变换矩阵。

当坐标变换到观察空间EYE SPACE后,下一步需要定义一个观察体VIEWING VOLUME,即这个区域内的三维场景将出现在最终的图像上。将模型对象放进观察体即裁剪空间CLIP SPACE(也称作裁剪坐标系CLIPPING COORDINATE SYSTEM)的变换称为投影变换PROJECTION TRANSFORMATION。在OpenGL中,可以通过glMatrixModel来选择需要设置的变换矩阵。也可以调用函数glOrtho、 glFrustum、gluPerspective来设置。

通过投影变换将观察空间内的三维模型投影到了二维空间,下一步变换就是顶点坐 标的perspective divide。这个操作将观察体内所有坐标点的各个分量除以齐次坐标分量w。得到的x, y, z的取值范围都是[-1, 1],而齐次坐标值w为1,所以就不再需要w了。换句话说所有可见的图元graphics primitives都变换到一个在点(-1,-1,-1)和点(1,1,1)之间的立方体区域,这就是规范化设备坐标空间NORMALIZED DEVICE COORDINATE SPACE,他是个允许将观察区域viewing area映射到任意尺寸及深度的视口的中间空间。

窗 口显示的像素点pixel不能指向-1到1的浮点数,通常指向窗口坐标系WINDOW COORDINATE SYSTEM中的坐标,x取值范围从0到窗口宽度减1,y取值范围从0到窗口高度减1,因此还需要进行一步变换处理。视口变换指定了从规范设备坐标系到窗 口坐标系的变换VIEWPORT TRANSFORMATION。在OpenGL通过函数glViewport来指定视口变换。

以上内容 主要来自《OpenGL Shading Language》一书中的第一章“Review of OpenGL Basics-1.9 Coordinate Transforms”,详细内容可参考原书。也可利用下面的程序来直观地学习这些变换及投影的知识:

wps_clip_image-5668

Figure 2.2 OpenGL Tutors-Projection (by Nate Robins)

3.Camera of OpenCASCADE

OpenCASCADE6.8.0 版本中引入一个类Graphic3d_Camera来简化对三维视图的变换操作,即可以对视图进行投影和模型视图的相关设置。如通过设置视点Eye position和中心点可以计算得到观察矩阵,类似gluLookAt的功能,相关代码如下所示:

// =======================================================================
// function : UpdateOrientation
// purpose  :
// =================================================================
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值