1
0

threejs-lots-of-objects.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. }