OrbitControler.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 { Vector2 } from '../lmm/math/Vector2'
  6. import { Img2D } from '../lmm/objects/Img2D'
  7. // 获取父级属性
  8. defineProps({
  9. size: { type: Object, default: { width: 1000, height: 500 } },
  10. })
  11. // 对应canvas 画布的Ref对象
  12. const canvasRef = ref<HTMLCanvasElement>()
  13. /* 场景 */
  14. const scene = new Scene()
  15. /* 相机轨道控制器 */
  16. const orbitControler = new OrbitControler(scene.camera)
  17. /* 图案 */
  18. const image = new Image()
  19. image.src = 'https://yxyy-pandora.oss-cn-beijing.aliyuncs.com/stamp-images/1.png'
  20. const pattern = new Img2D({ image })
  21. scene.add(pattern)
  22. /* 测试 */
  23. function test(canvas: HTMLCanvasElement) {
  24. const imgSize = new Vector2(image.width, image.height).multiplyScalar(0.6)
  25. pattern.setOption({
  26. /* 模型矩阵 */
  27. rotate: 0.4,
  28. position: new Vector2(0, -50),
  29. scale: new Vector2(0.5),
  30. /* Img属性 */
  31. size: imgSize.clone(),
  32. offset: imgSize.clone().multiplyScalar(-0.5),
  33. })
  34. /* 按需渲染 */
  35. orbitControler.addEventListener('change', () => {
  36. scene.render()
  37. })
  38. /* 滑动滚轮缩放 */
  39. canvas.addEventListener('wheel', ({ deltaY }) => {
  40. orbitControler.doScale(deltaY)
  41. })
  42. /* 按住滚轮平移 */
  43. canvas.addEventListener('pointerdown', (event: PointerEvent) => {
  44. if (event.button == 1) {
  45. orbitControler.pointerdown(event.clientX, event.clientY)
  46. }
  47. })
  48. canvas.addEventListener('pointermove', (event: PointerEvent) => {
  49. orbitControler.pointermove(event.clientX, event.clientY)
  50. })
  51. window.addEventListener('pointerup', (event: PointerEvent) => {
  52. if (event.button == 1) {
  53. orbitControler.pointerup()
  54. }
  55. })
  56. /* 渲染 */
  57. scene.render()
  58. }
  59. onMounted(() => {
  60. const canvas = canvasRef.value
  61. if (canvas) {
  62. scene.setOption({ canvas })
  63. image.onload = function () {
  64. test(canvas)
  65. }
  66. }
  67. })
  68. </script>
  69. <template>
  70. <canvas ref="canvasRef" :width="size.width" :height="size.height"></canvas>
  71. </template>
  72. <style scoped></style>