threepipe
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

script.ts 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import {
  2. _testFinish,
  3. HemisphereLight,
  4. IObject3D,
  5. PerspectiveCamera2,
  6. ProgressivePlugin,
  7. RenderTargetPreviewPlugin,
  8. SSAAPlugin,
  9. ThreeViewer,
  10. Vector3,
  11. VirtualCamerasPlugin,
  12. } from 'threepipe'
  13. import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
  14. async function init() {
  15. const viewer = new ThreeViewer({
  16. canvas: document.getElementById('mcanvas') as HTMLCanvasElement,
  17. debug: true,
  18. plugins: [new ProgressivePlugin(16), SSAAPlugin],
  19. })
  20. const virtualCameras = viewer.addPluginSync(VirtualCamerasPlugin)
  21. viewer.scene.addObject(new HemisphereLight(0xffffff, 0x444444, 10))
  22. await viewer.load<IObject3D>('https://threejs.org/examples/models/fbx/Samba Dancing.fbx', {
  23. autoCenter: true,
  24. autoScale: true,
  25. })
  26. viewer.scene.mainCamera.position.set(5, 5, 5)
  27. viewer.scene.mainCamera.target.set(0, 0.25, 0)
  28. viewer.scene.mainCamera.setDirty()
  29. const views = [
  30. [new Vector3(5, 0, 0), 'right'],
  31. [new Vector3(0, 5, 0), 'top'],
  32. [new Vector3(0, 0, 5), 'front'],
  33. ] as const
  34. const rt = viewer.addPluginSync(RenderTargetPreviewPlugin)
  35. const ui = viewer.addPluginSync(TweakpaneUiPlugin, true)
  36. ui.appendChild(viewer.scene.mainCamera.uiConfig)
  37. for (const [view, name] of views) {
  38. const camera = new PerspectiveCamera2('', viewer.canvas, false, 45, 1)
  39. camera.name = name
  40. camera.position.copy(view)
  41. camera.target.set(0, 0.25, 0)
  42. camera.userData.autoLookAtTarget = true
  43. camera.setDirty()
  44. camera.addEventListener('update', ()=>{
  45. viewer.setDirty() // since the camera is not added to the scene it wont update automatically when setDirty is called(like from the UI)
  46. })
  47. viewer.scene.mainCamera.addEventListener('update', ()=>{
  48. camera.target.copy(viewer.scene.mainCamera.target) // sync the lookAt target of all the cameras
  49. camera.setDirty()
  50. })
  51. const vCam = virtualCameras.addCamera(camera)
  52. rt.addTarget(()=>vCam.target, name, false, false, true)
  53. ui.appendChild(camera.uiConfig)
  54. }
  55. }
  56. init().finally(_testFinish)