base.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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, Vec4 } from 'mol-math/linear-algebra'
  7. import { cameraProject, cameraUnproject, cameraLookAt, Viewport } from './util';
  8. import { Object3D } from 'mol-gl/object3d';
  9. export interface Camera extends Object3D {
  10. readonly projection: Mat4,
  11. readonly projectionView: Mat4,
  12. readonly inverseProjectionView: Mat4,
  13. readonly viewport: Viewport,
  14. near: number,
  15. far: number,
  16. fogNear: number,
  17. fogFar: number,
  18. }
  19. export const DefaultCameraProps = {
  20. position: Vec3.zero(),
  21. direction: Vec3.create(0, 0, -1),
  22. up: Vec3.create(0, 1, 0),
  23. viewport: Viewport.create(-1, -1, 1, 1),
  24. near: 0.1,
  25. far: 10000,
  26. fogNear: 0.1,
  27. fogFar: 10000,
  28. }
  29. export type CameraProps = typeof DefaultCameraProps
  30. export namespace Camera {
  31. export function create(props?: Partial<CameraProps>): Camera {
  32. const p = { ...DefaultCameraProps, ...props };
  33. const { view, position, direction, up } = Object3D.create()
  34. Vec3.copy(position, p.position)
  35. Vec3.copy(direction, p.direction)
  36. Vec3.copy(up, p.up)
  37. const projection = Mat4.identity()
  38. const viewport = Viewport.clone(p.viewport)
  39. const projectionView = Mat4.identity()
  40. const inverseProjectionView = Mat4.identity()
  41. return {
  42. projection,
  43. projectionView,
  44. inverseProjectionView,
  45. viewport,
  46. view,
  47. position,
  48. direction,
  49. up,
  50. near: p.near,
  51. far: p.far,
  52. fogNear: p.fogNear,
  53. fogFar: p.fogFar,
  54. }
  55. }
  56. export function update (camera: Camera) {
  57. Mat4.mul(camera.projectionView, camera.projection, camera.view)
  58. Mat4.invert(camera.inverseProjectionView, camera.projectionView)
  59. return camera
  60. }
  61. export function lookAt (camera: Camera, target: Vec3) {
  62. cameraLookAt(camera.direction, camera.up, camera.position, target)
  63. }
  64. export function reset (camera: Camera, props: CameraProps) {
  65. Vec3.copy(camera.position, props.position)
  66. Vec3.copy(camera.direction, props.direction)
  67. Vec3.copy(camera.up, props.up)
  68. Mat4.setIdentity(camera.view)
  69. Mat4.setIdentity(camera.projection)
  70. Mat4.setIdentity(camera.projectionView)
  71. Mat4.setIdentity(camera.inverseProjectionView)
  72. }
  73. export function translate (camera: Camera, v: Vec3) {
  74. Vec3.add(camera.position, camera.position, v)
  75. }
  76. export function project (camera: Camera, out: Vec4, point: Vec3) {
  77. return cameraProject(out, point, camera.viewport, camera.projectionView)
  78. }
  79. export function unproject (camera: Camera, out: Vec3, point: Vec3) {
  80. return cameraUnproject(out, point, camera.viewport, camera.inverseProjectionView)
  81. }
  82. }