2
0

index.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <template>
  2. <div ref="wrap"></div>
  3. </template>
  4. <script setup>
  5. import * as THREE from "three";
  6. import * as SceneUtils from "three/examples/jsm/utils/SceneUtils";
  7. import { onMounted, ref } from "vue";
  8. /**
  9. * @type {import("vue").Ref<HTMLDivElement>}
  10. */
  11. const wrap = ref();
  12. const [canvasW, canvasH] = [1000, 500];
  13. onMounted(() => {
  14. var scene = new THREE.Scene();
  15. var camera = new THREE.PerspectiveCamera(50, canvasW / canvasH, 0.1, 1000);
  16. camera.position.set(10, 10, 10);
  17. var renderer = new THREE.WebGLRenderer();
  18. renderer.setSize(canvasW, canvasH);
  19. wrap.value.appendChild(renderer.domElement);
  20. var geometry = new THREE.BoxGeometry(4, 4, 4, 4, 4, 4);
  21. var materialBasic = new THREE.MeshBasicMaterial({
  22. color: 0xffffff,
  23. wireframe: true,
  24. });
  25. var materialLambert = new THREE.MeshLambertMaterial({
  26. color: 0x777777,
  27. wireframe: true,
  28. });
  29. var materialNormal = new THREE.MeshNormalMaterial({
  30. color: 0x777777,
  31. wireframe: true,
  32. });
  33. var cube = SceneUtils.createMultiMaterialObject(geometry, [
  34. // materialBasic,
  35. materialNormal,
  36. // materialLambert,
  37. ]);
  38. // var cube = new THREE.Mesh(geometry, materialLambert);
  39. cube.position.set(0, 0, 0);
  40. camera.lookAt(cube.position);
  41. scene.add(cube);
  42. var spotLight = new THREE.SpotLight(0xffffff);
  43. spotLight.position.set(20, 20, 20);
  44. spotLight.intensity = 1;
  45. scene.add(spotLight);
  46. var axes = new THREE.AxesHelper(1000);
  47. scene.add(axes);
  48. renderer.render(scene, camera);
  49. let [cx, cy, cz] = [10, 10, 10];
  50. window.addEventListener("keydown", function (e) {
  51. console.log(e.keyCode);
  52. switch (e.keyCode) {
  53. case 38: // up
  54. cy -= 1;
  55. cx -= 1;
  56. cz -= 1;
  57. break;
  58. case 40: // down
  59. cy += 1;
  60. cx += 1;
  61. cz += 1;
  62. break;
  63. case 37: // left
  64. cube.rotation.x -= 0.01;
  65. cube.rotation.y -= 0.01;
  66. break;
  67. case 39: // right
  68. cube.rotation.x += 0.01;
  69. cube.rotation.y += 0.01;
  70. break;
  71. }
  72. camera.position.set(cx, cy, cz);
  73. camera.lookAt(cube.position);
  74. renderer.render(scene, camera);
  75. });
  76. // 9、创建动画循环渲染函数
  77. function animate() {
  78. // 9.1 循环调用函数
  79. requestAnimationFrame(animate);
  80. // 每一次animate函数调用,都让网格比上一次 X 轴、Y 轴各旋转增加 0.01 弧度
  81. cube.rotation.x += 0.01;
  82. cube.rotation.y += 0.01;
  83. cube.rotation.z += 0.01;
  84. // cube.rotation.y += 0.01;
  85. // 3.3 结合场景和相机进行渲染,即用摄像机拍下此刻的场景
  86. renderer.render(scene, camera);
  87. }
  88. // 调用动画函数
  89. animate();
  90. });
  91. </script>