基本概念cone:cone.截锥体:截锥体。即,头部被截断的截体。如下图所示:fieldofview(FOV):视场,表示可视范围。常用来表示角度。视锥体:视锥体。视锥体只是视锥体在透视相机系统中的具体表示。three.js中的视锥特指底面为四边形的截锥体。圆锥顶点被认为是相机位置。如下图所示:如何使用在three.js中,构造函数THREE.PerspectiveCamera用于定义透视投影相机(PerspectiveCamera)的视锥体。视锥体是空间对象的容器。可能只显示物体在视锥体内部的部分,视锥体外的部分将被切掉。PerspectiveCamera的用法如下:constcamera=THREE.PerspectiveCamera(fov,aspect,near,far)fov垂直方向(y轴方向)的视角aspect实际窗口的纵横比,为了保证物体不会出现按比例变形,一般设置为容器的width/heightnear,camera和nearplane的距离,camera和farplane的距离。如果只有这些参数,PerspectiveCamera只是定义一个形状。只有形状,没有位置,怎么知道一个物体是不是这个形状呢?实际上,在three.js坐标系(也称为全局坐标系)中,所有的三维物体,包括上面定义的相机,都设置了一个默认位置:(0,0,0),也就是起源。全局坐标系如下图所示:视锥在坐标系中的位置如下所示:如果不改变每个物体的默认位置,相机将位于物体内部,如果观察它定义的圆锥体也刚好在物体外面如果不是,那么就没有投影,屏幕是空白的。因此,为了完整地投影一个三维物体,我们可以通过调整相机的位置或视锥体的参数(fov/aspect/near/far)来保证三维物体位于视锥体内。代码示例如下所示。最好结合此完整示例代码查看。首先,在原点定义一个维度为(1,1,1)的立方体。constscene=newTHREE.Scene();constgeometry=newTHREE.BoxGeometry(1,1,1);constmaterial=newTHREE.MeshBasicMaterial({color:0x00ff00,wireframe:true});constcube=newTHREE.网格(几何、材质);场景。添加(立方体);定义一个z轴为5的相机(立方体最大z轴为0.5)constcamera=newTHREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,0.1,10);camera.position.set(0,0,5);可以看到立方体的完整投影,效果如下图所示。其中,小方块是立方体的背投影,大方块是正投影。近大远小。调整相机位置,将它移到立方体后面camera.position.set(0,0,-0.5)屏幕是空的。然后调整相机的位置,让它只能看到立方体的背面,看不到正面camera.position.set(0,0,0.4);效果如下:总结PerspectiveCamer定义了一个三维视锥体的虚拟容器,位于里面的物体会被保留,位于外面的物体会被切掉。剩下的部分连同坐标系投影到浏览器画布等二维平面上,就是我们看到的最终效果。参考资料Three.js坐标系介绍three.js在线编辑正交投影相机英文文章介绍threejs相机原理Youtube视频讲解threejs相机中的数学知识
