OrthographicCamera
、透视投影PerspectiveCamera
)针对不一样应用的三维场景须要使用不一样的投影方式,好比机械、工业设计领域经常采用正投影(平行投影), 游戏场景每每采用透视投影(中心投影)。为了完成三维场景不一样的投影方式,three.js封装WebGL API和相关算法,提供了正投影OrthographicCamera
、透视投影PerspectiveCamera
等相机对象。算法
我的WebGL/Three.js技术博客canvas
下面对正投影相机和透视投影相机的投影算法进行简单介绍,对于初学者你有一个印象就能够,若是想深刻了解,能够学习图形学或者阅读threejs官方源码src目录下文件OrthographicCamera.js和PerspectiveCamera.js函数
生活中的物体都是三维的,可是人的眼睛只能看到正面,不能看到被遮挡的背面,三维几何体在人眼睛中的效果就像一张相机拍摄的二维照片,你看到的是一个2D的投影图。 空间几何体转化为一个二维图的过程就是投影,不一样的投影方式意味着投影尺寸不一样的算法。学习
生活中的物体都是三维的,可是人的眼睛只能看到正面,不能看到被遮挡的背面,三维几何体在人眼睛中的效果就像一张相机拍摄的二维照片,你看到的是一个2D的投影图。 空间几何体转化为一个二维图的过程就是投影,不一样的投影方式意味着不一样的算法。测试
对于正投影而言,一条直线放置的角度不一样,投影在投影面上面的长短不一样;对于透视投影而言,投影的结果除了与几何体的角度有关,还和距离相关, 人的眼睛观察世界就是透视投影,好比你观察一条铁路距离越远你会感到两条轨道之间的宽度越小。不管正投影仍是透视投影,three.js都对相关的投影算法进行了封装, 你们只须要根据不一样的应用场景自行选择不一样的投影方式。使用OrthographicCamera相机对象的时候,three.js会按照正投影算法自动计算几何体的投影结果; 使用PerspectiveCamera相机对象的时候,three.js会按照透视投影算法自动计算几何体的投影结果。spa
OrthographicCamera
构造函数格式:OrthographicCamera( left, right, top, bottom, near, far )设计
OrthographicCamera构造函数参数列表,参数的数据类型都是number。3d
三维场景中坐标值不在三维空间中的网格模型不会被渲染出来,会被剪裁掉,好比你把上面代码中far参数的值从1000更改成420,你会发现长方体的一部分没法显示。code
注意:左右边界的距离与上下边界的距离比值与画布的渲染窗口的宽高比例要一致,不然三维模型的显示效果会被单方向不等比例拉伸对象
OrthographicCamera构造函数本质上是对WebGL投影矩阵的封装,宽度width、高度height越大,三维模型顶点的位置坐标就会越大,超出可视区域的网格模型就会被剪裁掉, 不会再显示在屏幕上,你们还能够看到参数left与right、参数式top与bottom互为相反数,这样作的目的是可以是lookAt指向的对象可以显示在canvas画布的中间位置。
/** * 正投影相机设置 */ var width = window.innerWidth; //窗口宽度 var height = window.innerHeight; //窗口高度 var k = width / height; //窗口宽高比 var s = 200; //三维场景显示范围控制系数,系数越大,显示的范围越大 //建立相机对象 var camera = new THREE.OrthographicCamera(-s * k, s * k, s, -s, 1, 1000); camera.position.set(200, 300, 200); //设置相机位置 camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
PerspectiveCamera
构造函数格式:PerspectiveCamera( fov, aspect, near, far )
PerspectiveCamera构造函数参数列表,参数的数据类型都是number。
/** * 透视投影相机设置 */ var width = window.innerWidth; //窗口宽度 var height = window.innerHeight; //窗口高度 /**透视投影相机对象*/ var camera = new THREE.PerspectiveCamera(60, width / height, 1, 1000); camera.position.set(200, 300, 200); //设置相机位置 camera.lookAt(scene.position); //设置相机方向(指向的场景对象)
camera对象的基类是Object3D
,具备.posiiotn
属性,经过position属性设置相机的位置。 lookAt方法用来指定相机拍摄对象的坐标位置,.lookAt()
方法的参数是Vector3对象,能够手动定义new THREE.Vector3(x,y,z)
, 实际开发的时候,你但愿相机对准那个对象,就返回那个对象的位置属性值,好比上面代码中的scene.position, 就表示返回scene的位置坐标,若是把scene换成网格模型对象就是mesh.position,上面的网格模型是一个立方体, 具体的position属性值就是立方体的几何中心。经过观察点的位置和lookAt方法指向的位置就能够计算出相机的拍摄角度。
对于的透视投影,相机位置与lookAt指向的观察目标位置越小,场景中的三维模型放大倍数越大,同时超出的部分会被剪裁掉, 好比更改上面代码camera.position.set(100,200,200);为(20,20,20),测试结果你会发现立方体几何体放大显示,超出区域被剪裁。若是是观察一个产品外观效果,相机就位于几何体的外面,若是是室内漫游预览,就把相机放在房间三维模型的内部。