TransformControls.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <script setup lang="ts">
  2. import { shallowRef, shallowReactive } from 'vue'
  3. import { BasicShadowMap, sRGBEncoding, NoToneMapping } from 'three'
  4. import { OrbitControls, useTweakPane, TransformControls } from '@tresjs/cientos'
  5. const state = shallowReactive({
  6. clearColor: '#201919',
  7. shadows: true,
  8. alpha: false,
  9. physicallyCorrectLights: true,
  10. shadowMapType: BasicShadowMap,
  11. outputEncoding: sRGBEncoding,
  12. toneMapping: NoToneMapping,
  13. })
  14. const transformState = shallowReactive({
  15. mode: 'translate',
  16. size: 1,
  17. axis: 'XY',
  18. showX: true,
  19. showY: true,
  20. showZ: true,
  21. })
  22. const boxRef = shallowRef()
  23. const { pane } = useTweakPane()
  24. pane
  25. .addBlade({
  26. view: 'list',
  27. label: 'outputEncoding',
  28. options: [
  29. { text: 'Translate', value: 'translate' },
  30. { text: 'Rotate', value: 'rotate' },
  31. { text: 'Scale', value: 'scale' },
  32. ],
  33. value: transformState.mode,
  34. })
  35. .on('change', ev => {
  36. transformState.mode = ev.value
  37. })
  38. pane.addInput(transformState, 'size')
  39. const axisFolder = pane.addFolder({ title: 'Axis' })
  40. axisFolder
  41. .addBlade({
  42. view: 'list',
  43. label: 'axis',
  44. options: [
  45. { text: 'X', value: 'X' },
  46. { text: 'Y', value: 'Y' },
  47. { text: 'XY', value: 'XY' },
  48. { text: 'YZ', value: 'YZ' },
  49. { text: 'XZ', value: 'XZ' },
  50. { text: 'XYZ', value: 'XYZ' },
  51. ],
  52. value: transformState.axis,
  53. })
  54. .on('change', ev => {
  55. transformState.axis = ev.value
  56. })
  57. axisFolder.addInput(transformState, 'showX')
  58. axisFolder.addInput(transformState, 'showY')
  59. axisFolder.addInput(transformState, 'showZ')
  60. </script>
  61. <template>
  62. <TresCanvas v-bind="state">
  63. <OrbitControls make-default />
  64. <TresPerspectiveCamera :position="[11, 11, 11]" :fov="45" :near="0.1" :far="1000" :look-at="[-8, 3, -3]" />
  65. <TresScene>
  66. <TransformControls :object="boxRef" v-bind="transformState" />
  67. <TresMesh ref="boxRef" :position="[0, 4, 0]" cast-shadow>
  68. <TresBoxGeometry :args="[1.5, 1.5, 1.5]" />
  69. <TresMeshToonMaterial color="#FBB03B" />
  70. </TresMesh>
  71. <TresMesh :rotation="[-Math.PI / 2, 0, 0]" receive-shadow>
  72. <TresPlaneGeometry :args="[10, 10, 10, 10]" />
  73. <TresMeshToonMaterial />
  74. </TresMesh>
  75. <TresAmbientLight :intensity="0.5" />
  76. <TresDirectionalLight :position="[0, 8, 4]" :intensity="1.5" cast-shadow />
  77. </TresScene>
  78. </TresCanvas>
  79. </template>