threejs-lots-of-objects.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import * as THREE from 'three';
  2. import {threejsLessonUtils} from './threejs-lesson-utils.js';
  3. import {GUI} from '../../examples/jsm/libs/lil-gui.module.min.js';
  4. {
  5. class DegRadHelper {
  6. constructor(obj, prop) {
  7. this.obj = obj;
  8. this.prop = prop;
  9. }
  10. get value() {
  11. return THREE.MathUtils.radToDeg(this.obj[this.prop]);
  12. }
  13. set value(v) {
  14. this.obj[this.prop] = THREE.MathUtils.degToRad(v);
  15. }
  16. }
  17. function scaleCube(zOffset) {
  18. const root = new THREE.Object3D();
  19. const size = 3;
  20. const geometry = new THREE.BoxGeometry(size, size, size);
  21. geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, 0, zOffset * size));
  22. const material = new THREE.MeshBasicMaterial({
  23. color: 'red',
  24. });
  25. const cube = new THREE.Mesh(geometry, material);
  26. root.add(cube);
  27. cube.add(new THREE.LineSegments(
  28. new THREE.EdgesGeometry(geometry),
  29. new THREE.LineBasicMaterial({color: 'white'})));
  30. [[0, 0], [1, 0], [0, 1]].forEach((rot) => {
  31. const size = 10;
  32. const divisions = 10;
  33. const gridHelper = new THREE.GridHelper(size, divisions);
  34. root.add(gridHelper);
  35. gridHelper.rotation.x = rot[0] * Math.PI * .5;
  36. gridHelper.rotation.z = rot[1] * Math.PI * .5;
  37. });
  38. return {
  39. obj3D: root,
  40. update: (time) => {
  41. const s = THREE.MathUtils.lerp(0.5, 2, Math.sin(time) * .5 + .5);
  42. cube.scale.set(s, s, s);
  43. },
  44. };
  45. }
  46. threejsLessonUtils.addDiagrams({
  47. scaleCenter: {
  48. create() {
  49. return scaleCube(0);
  50. },
  51. },
  52. scalePositiveZ: {
  53. create() {
  54. return scaleCube(.5);
  55. },
  56. },
  57. lonLatPos: {
  58. create(info) {
  59. const {scene, camera, renderInfo} = info;
  60. const size = 10;
  61. const divisions = 10;
  62. const gridHelper = new THREE.GridHelper(size, divisions);
  63. scene.add(gridHelper);
  64. const geometry = new THREE.BoxGeometry(1, 1, 1);
  65. const lonHelper = new THREE.Object3D();
  66. scene.add(lonHelper);
  67. const latHelper = new THREE.Object3D();
  68. lonHelper.add(latHelper);
  69. const positionHelper = new THREE.Object3D();
  70. latHelper.add(positionHelper);
  71. {
  72. const lonMesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'green'}));
  73. lonMesh.scale.set(0.2, 1, 0.2);
  74. lonHelper.add(lonMesh);
  75. }
  76. {
  77. const latMesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'blue'}));
  78. latMesh.scale.set(1, 0.25, 0.25);
  79. latHelper.add(latMesh);
  80. }
  81. {
  82. const geometry = new THREE.SphereGeometry(0.1, 24, 12);
  83. const posMesh = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'red'}));
  84. posMesh.position.z = 1;
  85. positionHelper.add(posMesh);
  86. }
  87. camera.position.set(1, 1.5, 1.5);
  88. camera.lookAt(0, 0, 0);
  89. const gui = new GUI({autoPlace: false});
  90. renderInfo.elem.appendChild(gui.domElement);
  91. gui.add(new DegRadHelper(lonHelper.rotation, 'y'), 'value', -180, 180).name('lonHelper x rotation');
  92. gui.add(new DegRadHelper(latHelper.rotation, 'x'), 'value', -90, 90).name('latHelper y rotation');
  93. return {
  94. trackball: false,
  95. };
  96. },
  97. },
  98. });
  99. }