照相機就是這樣一個抽象,它定義了三維空間到二維屏幕的投影方式,用「照相機」這樣一個類比,能夠使咱們直觀地理解這一投影方式。而針對投影方式的不一樣,照相機又分爲正交投影照相機與透視投影照相機。html
演示web
代碼示例canvas
const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 ); scene.add( camera );
源碼api
function PerspectiveCamera( fov, aspect, near, far ) { // 繼承 Camera 的方法和屬性 Camera.call( this ); // 設置相機類型爲 PerspectiveCamera this.type = 'PerspectiveCamera'; // 沒有設置可視角度,默認視角爲50度 this.fov = fov !== undefined ? fov : 50; // 設置 zoom 爲 1 this.zoom = 1; // 沒有設置近端距離,默認爲 0.1 this.near = near !== undefined ? near : 0.1; // 沒有設置遠端距離,默認爲 2000 this.far = far !== undefined ? far : 2000; // 設置 focus 爲 10 this.focus = 10; // 沒有設置寬/高比,默認設置爲 1 this.aspect = aspect !== undefined ? aspect : 1; this.view = null; // 膠片尺寸,默認35mm鏡頭 this.filmGauge = 35; // width of the film (default in millimeters) // 水平偏移,單位mm,默認值0 this.filmOffset = 0; // horizontal film offset (same unit as gauge) // 調用 updateProjectionMatrix 方法,更新相機的投影矩陣 this.updateProjectionMatrix(); }
構造函數函數
PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )
演示webgl
代碼示例this
const width = window.innerWidth; const height = window.innerHeight; const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 ); scene.add( camera );
源碼spa
function OrthographicCamera( left, right, top, bottom, near, far ) { // 繼承 Camera 的方法和屬性 Camera.call( this ); // 設置相機類型爲 OrthographicCamera this.type = 'OrthographicCamera'; // 縮放比例設置爲1,視角設置爲 null this.zoom = 1; this.view = null; // 設置左,右,上,下側面的位置 this.left = left; this.right = right; this.top = top; this.bottom = bottom; // 設置近端距離和遠端距離。默認分別爲0.1 和 2000 this.near = ( near !== undefined ) ? near : 0.1; this.far = ( far !== undefined ) ? far : 2000; // 調用 updateProjectionMatrix 方法,更新相機的投影矩陣 this.updateProjectionMatrix(); }
構造函數設計
OrthographicCamera( left : Number, right : Number, top : Number, bottom : Number, near : Number, far : Number )
演示3d
代碼示例
const cubeCamera = new THREE.CubeCamera( 1, 100000, 128 ); scene.add( cubeCamera );
構造函數
CubeCamera( near : Number, far : Number, cubeResolution : Number )
源碼解讀
function CubeCamera( near, far, cubeResolution ) { // 繼承 Object3D 的方法和屬性 Object3D.call( this ); // 設置相機類型爲 CubeCamera this.type = 'CubeCamera'; // 設置視角爲90度,寬/高比爲1 var fov = 90, aspect = 1; // 設置6個相機 // 立方體右側鏡頭 var cameraPX = new PerspectiveCamera( fov, aspect, near, far ); cameraPX.up.set( 0, - 1, 0 ); cameraPX.lookAt( new Vector3( 1, 0, 0 ) ); this.add( cameraPX ); // 立方體左側鏡頭 var cameraNX = new PerspectiveCamera( fov, aspect, near, far ); cameraNX.up.set( 0, - 1, 0 ); cameraNX.lookAt( new Vector3( - 1, 0, 0 ) ); this.add( cameraNX ); // 立方體前側鏡頭 var cameraPY = new PerspectiveCamera( fov, aspect, near, far ); cameraPY.up.set( 0, 0, 1 ); cameraPY.lookAt( new Vector3( 0, 1, 0 ) ); this.add( cameraPY ); // 立方體後側鏡頭 var cameraNY = new PerspectiveCamera( fov, aspect, near, far ); cameraNY.up.set( 0, 0, - 1 ); cameraNY.lookAt( new Vector3( 0, - 1, 0 ) ); this.add( cameraNY ); // 立方體上側鏡頭 var cameraPZ = new PerspectiveCamera( fov, aspect, near, far ); cameraPZ.up.set( 0, - 1, 0 ); cameraPZ.lookAt( new Vector3( 0, 0, 1 ) ); this.add( cameraPZ ); // 立方體下側鏡頭 var cameraNZ = new PerspectiveCamera( fov, aspect, near, far ); cameraNZ.up.set( 0, - 1, 0 ); cameraNZ.lookAt( new Vector3( 0, 0, - 1 ) ); this.add( cameraNZ ); var options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter }; // 建立渲染目標對象,設置它的材質名稱爲 CubeCamera this.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options ); this.renderTarget.texture.name = "CubeCamera"; }
演示
代碼示例
const _stereo = new THREE.StereoCamera(); const size = { width: window.innerWidth, height: window.innerHeight }; _stereo.aspect = 0.5; _stereo.eyeSep = 0.064; renderer.setScissor( 0, 0, size.width / 2, size.height ); renderer.setViewport( 0, 0, size.width / 2, size.height ); renderer.render( scene, _stereo.cameraL ); renderer.setScissor( size.width / 2, 0, size.width / 2, size.height ); renderer.setViewport( size.width / 2, 0, size.width / 2, size.height ); renderer.render( scene, _stereo.cameraR );
源碼
function StereoCamera() { // 設置相機類型爲 StereoCamera this.type = 'StereoCamera'; // 設置寬高比爲 1 this.aspect = 1; this.eyeSep = 0.064; this.cameraL = new PerspectiveCamera(); this.cameraL.layers.enable( 1 ); this.cameraL.matrixAutoUpdate = false; this.cameraR = new PerspectiveCamera(); this.cameraR.layers.enable( 2 ); this.cameraR.matrixAutoUpdate = false; }
構造函數
StereoCamera( )