perspective.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Mat4, Vec3 } from 'mol-math/linear-algebra'
  7. import { DefaultCameraProps, Camera } from './base'
  8. export interface PerspectiveCamera extends Camera {
  9. fov: number,
  10. near: number,
  11. far: number
  12. }
  13. export const DefaultPerspectiveCameraProps = {
  14. fov: Math.PI / 4,
  15. ...DefaultCameraProps
  16. }
  17. export type PerspectiveCameraProps = Partial<typeof DefaultPerspectiveCameraProps>
  18. export namespace PerspectiveCamera {
  19. export function create(props: PerspectiveCameraProps = {}): PerspectiveCamera {
  20. let { fov, near, far } = { ...DefaultPerspectiveCameraProps, ...props };
  21. const camera = Camera.create(props)
  22. const center = Vec3.zero()
  23. function update () {
  24. const aspect = camera.viewport.width / camera.viewport.height
  25. // build projection matrix
  26. Mat4.perspective(camera.projection, fov, aspect, Math.abs(near), Math.abs(far))
  27. // build view matrix
  28. Vec3.add(center, camera.position, camera.direction)
  29. Mat4.lookAt(camera.view, camera.position, center, camera.up)
  30. // update projection * view and invert
  31. camera.update()
  32. }
  33. update()
  34. return {
  35. ...camera,
  36. update,
  37. get fov() { return fov },
  38. set fov(value: number) { fov = value },
  39. }
  40. }
  41. }