threejs-lots-of-objects.js 3.2 KB

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