
- Three.js 教程
- Three.js - 主頁
- Three.js - 簡介
- Three.js - 安裝
- Three.js - Hello Cube 應用
- Three.js - 渲染器和響應
- Three.js - 響應式設計
- Three.js - 除錯和統計資料
- Three.js - 攝像機
- Three.js - 控制元件
- Three.js - 光線和陰影
- Three.js - 幾何體
- Three.js - 材質
- Three.js - 紋理
- Three.js - 繪製線條
- Three.js - 動畫
- Three.js - 建立文字
- Three.js - 載入 3D 模型
- Three.js - 庫和外掛
- Three.js 實用資源
- Three.js - 快速指南
- Three.js - 實用資源
- Three.js - 討論
Three.js - 正交攝像機
第二種最常見的攝像機是正交攝像機。它指定一個包含以下設定的盒子:左、右、上、下、近和遠。它用二維形式表示三維物體。
const camera = new THREE.OrthographicCamera(left, right, top, bottom, near, far)
所有這六個屬性都是盒子的邊框;攝像機只渲染盒子內的物體。
左 - 攝像機的左邊平面。
右 - 攝像機的右邊平面。
上 - 攝像機の上邊平面。
下 - 攝像機的下邊平面。
近 - 攝像機的近平面。
遠 - 攝像機的遠平面。

示例
檢視以下示例 −
orthographic-cam.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Three.js - Orthographic camera</title> <style> html, body { margin: 0; height: 100%; } #threejs-container { width: 100%; height: 100%; display: block; } .split { position: absolute; left: 0; top: 0; width: 100%; height: 100%; display: flex; } .split > div { width: 100%; height: 100%; } </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.7/dat.gui.js"></script> </head> <body> <canvas id="threejs-container"></canvas> <div class="split"> <div id="view1" tabindex="1"></div> <div id="view2" tabindex="2"></div> </div> <script type="module"> // Three.js - Cameras - Orthographic 2 views // from https://threejsfundamentals.org/threejs/threejs-camerasorthographic-2-scenes.html import { OrbitControls } from "https://threejs.org/examples/jsm/contro ls/OrbitControls.js" function main() { const canvas = document.querySelector('#threejs-container') const view1Elem = document.querySelector('#view1') const view2Elem = document.querySelector('#view2') const renderer = new THREE.WebGLRenderer({ canvas, antialias: true }) const size = 1 const near = 5 const far = 50 const camera = new THREE.OrthographicCamera(-size, size, size, - size, near, far) camera.zoom = 0.2 camera.position.set(0, 10, 20) const cameraHelper = new THREE.CameraHelper(camera) class MinMaxGUIHelper { constructor(obj, minProp, maxProp, minDif) { this.obj = obj this.minProp = minProp this.maxProp = maxProp this.minDif = minDif } get min() { return this.obj[this.minProp] } set min(v) { this.obj[this.minProp] = v this.obj[this.maxProp] = Math.max(this.obj[this.maxProp], v + th is.minDif) } get max() { return this.obj[this.maxProp] } set max(v) { this.obj[this.maxProp] = v this.min = this.min // this will call the min setter } } const gui = new dat.GUI() gui.add(camera, 'zoom', 0.01, 1, 0.01).listen() const minMaxGUIHelper = new MinMaxGUIHelper(camera, 'near', 'far', 0.1) gui.add(minMaxGUIHelper, 'min', 0.1, 50, 0.1).name('near') gui.add(minMaxGUIHelper, 'max', 0.1, 50, 0.1).name('far') const controls = new OrbitControls(camera, view1Elem) controls.target.set(0, 5, 0) controls.update() const camera2 = new THREE.PerspectiveCamera( 60, // fov 2, // aspect 0.1, // near 500 // far ) camera2.position.set(16, 28, 40) camera2.lookAt(0, 5, 0) const controls2 = new OrbitControls(camera2, view2Elem) controls2.target.set(0, 5, 0) controls2.update() const scene = new THREE.Scene() scene.background = new THREE.Color(0x262626) scene.add(cameraHelper) { const planeSize = 40 const planeGeo = new THREE.PlaneGeometry(planeSize, planeSize) const planeMat = new THREE.MeshLambertMaterial({ color: 0xffffff, side: THREE.DoubleSide }) const mesh = new THREE.Mesh(planeGeo, planeMat) mesh.rotation.x = Math.PI * -0.5 scene.add(mesh) } { const cubeSize = 4 const cubeGeo = new THREE.BoxGeometry(cubeSize, cubeSize, cubeSize) const cubeMat = new THREE.MeshPhongMaterial({ color: 0x87ceeb }) const mesh = new THREE.Mesh(cubeGeo, cubeMat) mesh.position.set(cubeSize + 1, cubeSize / 2, 0) scene.add(mesh) } { const sphereRadius = 3 const sphereWidthDivisions = 32 const sphereHeightDivisions = 16 const sphereGeo = new THREE.SphereGeometry( sphereRadius, sphereWidthDivisions, sphereHeightDivisions ) const sphereMat = new THREE.MeshPhongMaterial({ color: 0x71ba80 }) const mesh = new THREE.Mesh(sphereGeo, sphereMat) mesh.position.set(-sphereRadius - 1, sphereRadius + 2, 0) scene.add(mesh) } { const color = 0xffffff const intensity = 1 const light = new THREE.DirectionalLight(color, intensity) light.position.set(0, 10, 5) light.target.position.set(-5, 0, 0) scene.add(light) scene.add(light.target) const light2 = new THREE.DirectionalLight(color, intensity) light2.position.set(0, 10, -5) light2.target.position.set(-5, 0, 0) scene.add(light2) scene.add(light2.target) } function resizeRendererToDisplaySize(renderer) { const canvas = renderer.domElement const width = canvas.clientWidth const height = canvas.clientHeight const needResize = canvas.width !== width || canvas.height !== height if (needResize) { renderer.setSize(width, height, false) } return needResize } function setScissorForElement(elem) { const canvasRect = canvas.getBoundingClientRect() const elemRect = elem.getBoundingClientRect() // compute a canvas relative rectangle const right = Math.min(elemRect.right, canvasRect.right) - canvasR ect.left const left = Math.max(0, elemRect.left - canvasRect.left) const bottom = Math.min(elemRect.bottom, canvasRect.bottom) - canv asRect.top const top = Math.max(0, elemRect.top - canvasRect.top) const width = Math.min(canvasRect.width, right - left) const height = Math.min(canvasRect.height, bottom - top) // setup the scissor to only render to that part of the canvas const positiveYUpBottom = canvasRect.height - bottom renderer.setScissor(left, positiveYUpBottom, width, height) renderer.setViewport(left, positiveYUpBottom, width, height) // return the aspect return width / height } function render() { resizeRendererToDisplaySize(renderer) // turn on the scissor renderer.setScissorTest(true) // render the original view { const aspect = setScissorForElement(view1Elem) // update the camera for this aspect camera.left = -aspect camera.right = aspect camera.updateProjectionMatrix() cameraHelper.update() // don't draw the camera helper in the original view cameraHelper.visible = false scene.background.set(0x262626) renderer.render(scene, camera) } // render from the 2nd camera { const aspect = setScissorForElement(view2Elem) // update the camera for this aspect camera2.aspect = aspect camera2.updateProjectionMatrix() // draw the camera helper in the 2nd view cameraHelper.visible = true scene.background.set(0x262626) renderer.render(scene, camera2) } requestAnimationFrame(render) } requestAnimationFrame(render) } main() </script> </body> </html>
輸出

threejs_cameras.htm
廣告