300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 正交投影变换与透视投影

正交投影变换与透视投影

时间:2022-11-03 13:05:32

相关推荐

正交投影变换与透视投影

相机投影模型

三维计算机图形学的基本问题之一就是三维观察问题:即如何把三维场景投影到要显示的二维图像。大多数经典的解决投影变换方法有两种:正交投影变换和透视投影变化。

正交投影变换用一个长方体来取景,并把场景投影到这个长方体的前面。这个投影不会有透视收缩效果(远些的物体在图像平面上要小一些),因为它保证平行线在变换后仍然保持平行,也就使得物体之间的相对距离在变换后保持不变。简单的说,正交投影变换忽略物体远近时的大小缩放变化,将物体以原比例投影到截面(如显示屏幕)上,实现这样效果的照相机叫做正交投影照相机,也称正交照相机。

透视投影变换跟正交投影一样,也是把一个空间体(指的是以投影中心为顶点的透视四棱锥)投影到一个二维图像平面上。然而,它却有透视收缩效果:远些的物体在图像平面上的投影比近处相同大小的物体的投影要小一些。跟正交投影不同的是,透视投影并不保持距离和角度的相对大小不变,所以平行线的投影并不一定是平行的了。换言之,透视投影变换能够实现一个物体在玩家近距离比较大,远距离比较小,那么实现这样的效果的照相机就叫做远景照相机。远景照相机常用来开发3D游戏,它的工作原理是通过,根据照相机和物体之间的距离缩放投影的比例(也就是截面的大小)。透视投影跟人的眼睛或相机镜头产生三维世界的图像的原理还是很接近的。下面我们讲解下视椎,如下图:

图中,眼睛所在的位置就是camera所在的位置,viewport就是图中,所有截面的标记区域,显示屏幕也是一个viewport的截面。视锥是一个类似于金字塔形状,它有两个切割面。物体或物体的某些部分外如果被遮挡,就不会被渲染,这就是透视照相机的工作原理。

ThreeJs中的相机类

在ThreeJS中一共有三个关于相机的JS文件,Camera.js、OrthographicCamera.js、PerspectiveCamera.js,分别是抽象相机基类、正交投影相机、透视相机(远景相机)。抽象相机基类Camera是一个使用投影矩阵的相机类,并以此为基础定义两个相机模型。OrthographicCamera实现了正交投影,PerspectiveCamera实现了透视投影,这两个投影模型都很经典并且应用广泛。

抽象相机基类

摄像机的抽象基类。当你建立一个新的自定义相机时应该始终继承这个基类。

Camera是默认定义是在3D空间中的,其初始位置也是根据3D空间的位置定义的。他的坐标系由指向特定方位的单位向量组成,即3D坐标系单位向量。想象一个3D的坐标系,也就是我们高中时候常常使用的立体几何中的坐标系,Camera也是这样的,3D的照相机都是在立体的三维坐标系中建立的。通过 Direction Vector(方向向量)能够让我们告诉WebGL,如何设置Camera的方位,而 position vector(位置向量)则定义了Camera 在3D世界中的位置。

在3D照相机中另个一重要的属性就是 View Frustum(视锥)。在上面的图片中,可以看到一个椎体在视点(图中眼睛的位置)被截去了顶端,这个就是视椎。所有在这个 Frustum(截头锥体)里面的东西都会被显示在屏幕上。这个截头锥体切分出来的被6个切面(clipping planes),分别在ThreeJs中分别命名为:near, far, left, right, top and bottom。在上面的图片中的所看到截头锥体只是整个椎体的一侧。对于近切面它有一个特殊的作用:你可以把它想象成一个取景器取到的图画的表面,这样我们就可以把3D空间转换为2D平面,展示在玩家面前,这个过程在ThreeJs中称为 Projection (投影)。实现这些特定的效果,我们就需要改变照相机的和属性,其实就是改变视锥的属性。

正交/投影相机

正交投影相机的基础是正交投影矩阵。

第三人称摄像机perspectiveCamera

第三人称相机是继承了抽象相机基类而创建的一种特殊相机,第三视角相机的目标是当物体移动时跟随它并保持一定的距离。如果物体移动到摄像机边界后,将造成摄像机剧烈移动。让摄像机跟随一个物体,如玩家控制角色,你需要定义一下如下参数:

1、跟随位置,摄像机跟随的目标物体的位置

2、跟随的方向,摄像机沿哪个方向移动来跟随物体

3、跟随速度

4、跟随距离,摄像机与物体的距离

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。