UNPKG

@jscad/regl-renderer

Version:

Renderer for JSCAD Geometries

67 lines (55 loc) 2.61 kB
const vec3 = require('gl-vec3') const mat4 = require('gl-mat4') const fromOrthographicToPerspective = (orthographicCamera) => { const { near, far, fov, zoom } = orthographicCamera // recompute projection matrix to use perspective camera projection matrix const { viewport } = orthographicCamera const projection = require('./perspectiveCamera').setProjection(orthographicCamera, { width: viewport[2], height: viewport[3] }) const { projectionType } = require('./perspectiveCamera').cameraState return Object.assign({}, orthographicCamera, projection, { projectionType }, { near, far, fov }) } const fromPerspectiveToOrthographic = (perspectiveCamera) => { const { fov, aspect } = perspectiveCamera // set the orthographic view rectangle to 0,0,width,height // see here : http://stackoverflow.com/questions/13483775/set-zoomvalue-of-a-perspective-equal-to-perspective const distance = vec3.length(vec3.subtract([], perspectiveCamera.position, perspectiveCamera.target)) * 0.3 const width = Math.tan(fov) * distance * aspect const height = Math.tan(fov) * distance // we re-use near, far, & projection matrix of orthographicCamera const { near, far, viewport } = perspectiveCamera const fCam = { zoom: 1, near, far } const orthographicCamera = require('./orthographicCamera').cameraState const projection = require('./orthographicCamera').setProjection(fCam, { width, height }) return Object.assign({}, orthographicCamera, perspectiveCamera, projection, { projectionType: orthographicCamera.projectionType, viewport }) } const toPerspectiveView = ({ camera }) => { const offsetToTarget = vec3.distance(camera.position, camera.target) const distance = offsetToTarget const position = [distance, distance, distance] const view = mat4.lookAt(mat4.create(), position, camera.target, camera.up) return { view, position } } /** * Calculate the camera view and position for acheiving the given preset view. */ const toPresetView = (viewName, { camera }) => { const presets = { top: [0, -0.000001, 1], bottom: [0, 0, -1], front: [0, 1, 0], back: [0, -1, 0], left: [-1, 0, 0], right: [1, 0, 0], undefined: [0, 0, 0] } const offsetToTarget = vec3.distance(camera.position, camera.target) const position = vec3.add(vec3.create(), presets[viewName].map((x) => x * offsetToTarget), camera.target) const view = mat4.lookAt(mat4.create(), position, camera.target, camera.up) return { view, position } } module.exports = { toPerspectiveView, toPresetView, fromOrthographicToPerspective, fromPerspectiveToOrthographic }