Text2D.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <script setup lang="ts">
  2. import { ref, onMounted } from 'vue'
  3. import { OrbitControler } from '../lmm/controler/OrbitControler'
  4. import { Scene } from '../lmm/core/Scene'
  5. import { Text2D } from '../lmm/objects/Text2D'
  6. // 获取父级属性
  7. defineProps({
  8. size: { type: Object, default: { width: 0, height: 0 } },
  9. })
  10. // 对应canvas 画布的Ref对象
  11. const canvasRef = ref<HTMLCanvasElement>()
  12. /* 场景 */
  13. const scene = new Scene()
  14. /* 相机轨道控制器 */
  15. const orbitControler = new OrbitControler(scene.camera)
  16. /* 文字测试 */
  17. const text2D = new Text2D({
  18. text: 'Sphinx',
  19. style: {
  20. fontSize: 100,
  21. fillStyle: '#00acec',
  22. textAlign: 'center',
  23. textBaseline: 'middle',
  24. },
  25. })
  26. scene.add(text2D)
  27. /* 按需渲染 */
  28. orbitControler.addEventListener('change', () => {
  29. scene.render()
  30. drawRect()
  31. })
  32. /* 滑动滚轮缩放 */
  33. function wheel({ deltaY }: WheelEvent) {
  34. orbitControler.doScale(deltaY)
  35. }
  36. /* 按住滚轮平移 */
  37. function pointerdown(event: PointerEvent) {
  38. if (event.button == 1) {
  39. orbitControler.pointerdown(event.clientX, event.clientY)
  40. }
  41. }
  42. function pointermove(event: PointerEvent) {
  43. orbitControler.pointermove(event.clientX, event.clientY)
  44. }
  45. function pointerup(event: PointerEvent) {
  46. if (event.button == 1) {
  47. orbitControler.pointerup()
  48. }
  49. }
  50. /* 绘制文字边界 */
  51. function drawRect() {
  52. const {
  53. ctx,
  54. canvas: { width, height },
  55. } = scene
  56. ctx.save()
  57. ctx.strokeStyle = 'maroon'
  58. ctx.translate(width / 2, height / 2)
  59. ctx.beginPath()
  60. text2D.crtPath(ctx, text2D.pvmMatrix)
  61. ctx.closePath()
  62. ctx.stroke()
  63. ctx.restore()
  64. }
  65. onMounted(() => {
  66. const canvas = canvasRef.value
  67. if (canvas) {
  68. scene.setOption({ canvas })
  69. scene.render()
  70. drawRect()
  71. }
  72. })
  73. </script>
  74. <template>
  75. <canvas
  76. ref="canvasRef"
  77. :width="size.width"
  78. :height="size.height"
  79. @wheel="wheel"
  80. @pointerdown="pointerdown"
  81. @pointermove="pointermove"
  82. @pointerup="pointerup"
  83. ></canvas>
  84. </template>
  85. <style scoped></style>