perspective.ts 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. }
  11. export const DefaultPerspectiveCameraProps = {
  12. ...DefaultCameraProps,
  13. fov: Math.PI / 4,
  14. }
  15. export type PerspectiveCameraProps = Partial<typeof DefaultPerspectiveCameraProps>
  16. export namespace PerspectiveCamera {
  17. export function create(props: PerspectiveCameraProps = {}): PerspectiveCamera {
  18. const { fov } = { ...DefaultPerspectiveCameraProps, ...props }
  19. const camera = { ...Camera.create(props), fov }
  20. update(camera)
  21. return camera
  22. }
  23. const center = Vec3.zero()
  24. export function update(camera: PerspectiveCamera) {
  25. const aspect = camera.viewport.width / camera.viewport.height
  26. // build projection matrix
  27. Mat4.perspective(camera.projection, camera.fov, aspect, Math.abs(camera.near), Math.abs(camera.far))
  28. // build view matrix
  29. Vec3.add(center, camera.position, camera.direction)
  30. Mat4.lookAt(camera.view, camera.position, center, camera.up)
  31. // update projection * view and invert
  32. Camera.update(camera)
  33. }
  34. }