threepipe
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

script.ts 3.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {
  2. _testFinish,
  3. EditorViewWidgetPlugin,
  4. GBufferPlugin,
  5. LoadingScreenPlugin,
  6. PickingPlugin,
  7. ThreeViewer,
  8. TransformControlsPlugin,
  9. } from 'threepipe'
  10. import {TweakpaneUiPlugin} from '@threepipe/plugin-tweakpane'
  11. import {ThreeSVGRendererPlugin} from '@threepipe/plugin-svg-renderer'
  12. import {GeometryGeneratorPlugin} from '@threepipe/plugin-geometry-generator'
  13. async function init() {
  14. const viewer = new ThreeViewer({
  15. canvas: document.getElementById('mcanvas') as HTMLCanvasElement,
  16. msaa: false,
  17. rgbm: false,
  18. // zPrepass: true,
  19. tonemap: false,
  20. plugins: [GBufferPlugin, PickingPlugin, TransformControlsPlugin, LoadingScreenPlugin],
  21. })
  22. viewer.addPluginSync(new EditorViewWidgetPlugin('bottom-left', 128))
  23. viewer.scene.backgroundColor = null
  24. // viewer.renderManager.screenPass.clipBackground = true // required when rgbm: true
  25. viewer.scene.mainCamera.controls!.enableDamping = false
  26. viewer.renderEnabled = false
  27. viewer.addPluginSync(new ThreeSVGRendererPlugin(true))
  28. // viewer.scene.addObject(new DirectionalLight2(0xffffff, 1).rotateZ(0.5).rotateX(0.5))
  29. await viewer.setEnvironmentMap('https://threejs.org/examples/textures/equirectangular/venice_sunset_1k.hdr')
  30. const generator = viewer.addPluginSync(GeometryGeneratorPlugin)
  31. // generator.defaultMaterialClass = UnlitMaterial
  32. console.log(generator.generators)
  33. // Head (sphere)
  34. const head = generator.generateObject('sphere', {radius: 0.5, widthSegments: 32, heightSegments: 32})
  35. head.translateY(1)
  36. viewer.scene.addObject(head)
  37. // Body (box)
  38. const body = generator.generateObject('box', {width: 1.5, height: 1.5, depth: 1})
  39. body.material.color.set(0x00ffff)
  40. viewer.scene.addObject(body)
  41. // Legs (cylinders)
  42. const leftLeg = generator.generateObject('cylinder', {radiusTop: 0.125, radiusBottom: 0.125, height: 1.5})
  43. leftLeg.material.color.set(0x00ff00)
  44. leftLeg.translateX(-0.5)
  45. leftLeg.translateY(-1)
  46. viewer.scene.addObject(leftLeg)
  47. const rightLeg = generator.generateObject('cylinder', {radiusTop: 0.125, radiusBottom: 0.125, height: 1.5})
  48. rightLeg.material.color.set(0x00ff00)
  49. rightLeg.translateX(0.5)
  50. rightLeg.translateY(-1)
  51. viewer.scene.addObject(rightLeg)
  52. // Arms (cylinders)
  53. const leftArm = generator.generateObject('cylinder', {radiusTop: 0.125, radiusBottom: 0.125, height: 1})
  54. leftArm.material.color.set(0xff0000)
  55. leftArm.translateX(-1)
  56. leftArm.translateY(0.5)
  57. leftArm.rotateZ(Math.PI / 2)
  58. viewer.scene.addObject(leftArm)
  59. const rightArm = generator.generateObject('cylinder', {radiusTop: 0.125, radiusBottom: 0.125, height: 1})
  60. rightArm.material.color.set(0xff0000)
  61. rightArm.translateX(1)
  62. rightArm.translateY(0.5)
  63. rightArm.rotateZ(Math.PI / 2)
  64. viewer.scene.addObject(rightArm)
  65. viewer.renderEnabled = true
  66. // waiting because we need to render pipeline once to autoscale
  67. await viewer.doOnce('postFrame')
  68. const ui = viewer.addPluginSync(new TweakpaneUiPlugin(true))
  69. ui.setupPlugins(ThreeSVGRendererPlugin)
  70. ui.setupPlugins(GeometryGeneratorPlugin)
  71. ui.setupPlugins(PickingPlugin)
  72. ui.setupPlugins(TransformControlsPlugin)
  73. }
  74. init().finally(_testFinish)