场景介绍

我们如果在业务场景中,需要给一个模型添加文字,并且文字跟随模型运动,那么就需要把2D的文字部分添加到模型对象当中.这里我们用月球围绕地球旋转的demo来进行展示,先看最终呈现效果.
image.png

创建地球网格模型

每句代码已添加注释,直接读代码,月球的网格模型建立也相同.

  1. //- 多边形缓存几何模型
  2. var earthGeometry = new THREE.SphereBufferGeometry(EARTH_RADIUS, 20, 20); //- 地球模型
  3. //- 网孔材料
  4. var earthMaterial = new THREE.MeshPhongMaterial({
  5. specular: 0x333333, //- 设置高亮颜色
  6. shininess: 5, //- 设置亮度
  7. map: textureLoader.load('https://localhost:8080/images/earth/earth_atmos_2048.jpg'), //- 设置纹理贴图
  8. // specularMap: textureLoader.load('https://localhost:8080/images/earth/earth_specular_2048.jpg'), //- 设置镜面贴图(也称高光贴图)
  9. // normalMap: textureLoader.load('https://localhost:8080/images/earth/earth_normal_2048.jpg'), //- 设置法线贴图,缺省为null。
  10. normalScale: new THREE.Vector2(0.85, 0.85) //- 设置法线贴图比例,缺省为 (1, 1)。
  11. });
  12. earth = new THREE.Mesh(earthGeometry, earthMaterial); //- 创建地球Mesh对象
  13. scene.add(earth); //- 把地球添加至场景中

为地球添加文字2DCSS

  1. var earthDiv = document.createElement('div'); //- 创建一个div节点对象
  2. earthDiv.className = 'label'; //- 设置地球节点对象的class
  3. earthDiv.textContent = '这个是地球'; //- 设置文字
  4. earthDiv.style.marginTop = '-1em'; //- 设置style
  5. //- 创建2dCSS对象
  6. var earthLabel = new THREE.CSS2DObject(earthDiv);
  7. earthLabel.position.set(0, EARTH_RADIUS, 0);
  8. earth.add(earthLabel); //- 把2d文字添加到地球Mesh对象上,以便跟随移动

创建渲染器 - CSS2DRenderer

WebRenderer渲染器作为场景渲染器之前已经用了很多了,渲染模型就用过,这里就不多讲了,直接看代码.
这里需要注意的是CSS2DRenderer渲染器,之前创建了CSS2DObject实例,需要通过调用CSS2DRenderer进行渲染,就像创建了场景实例后需要使用WebRenderer渲染器进行渲染一样.

  1. //- 创建渲染器
  2. renderer = new THREE.WebGLRenderer();
  3. renderer.setPixelRatio(window.devicePixelRatio);
  4. renderer.setSize(window.innerWidth, window.innerHeight);
  5. document.body.appendChild(renderer.domElement);
  6. //- CSS2DRenderer 渲染器是生成一个DIV容器,它的作用是能把HTML元素绑定到三维物体上,在DIV容器中各自的DOM元素分别封装到CSS2DObject的实例中,并在scene中增加。
  7. labelRenderer = new THREE.CSS2DRenderer();
  8. labelRenderer.setSize(window.innerWidth, window.innerHeight);
  9. labelRenderer.domElement.style.position = 'absolute';
  10. labelRenderer.domElement.style.top = '0px';
  11. document.body.appendChild(labelRenderer.domElement);
  12. //- 控制视觉
  13. var controls = new THREE.OrbitControls(camera, labelRenderer.domElement);
  14. controls.minDistance = 5;
  15. controls.maxDistance = 100;

场景渲染

和之前一样,我们需要持续调用渲染函数,在渲染函数中对场景以及2dCSS进行渲染,才能把模型,光源和2DCSS内容渲染到场景中

  1. function animate() {
  2. requestAnimationFrame(animate); //- 持续渲染
  3. var elapsed = clock.getElapsedTime(); //- 获取时钟已运行时间。
  4. moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5); //- 根据始终运行的时间设置月球位置,达到一直转的目的
  5. renderer.render(scene, camera); //- 渲染场景
  6. labelRenderer.render(scene, camera); //- 渲染2DCSS文字
  7. }

CSS2DRenderer - 完整代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  6. <title>three.js css2d - label</title>
  7. <!-- <link type="text/css" rel="stylesheet" href="main.css"> -->
  8. <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  9. <style>
  10. .label {
  11. color: #FFF;
  12. font-family: sans-serif;
  13. padding: 2px;
  14. background: rgba(0, 0, 0, .6);
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <script src="./js-r100/three.js"></script>
  20. <script src="./js-r100/controls/OrbitControls.js"></script>
  21. <script src="./js-r100/renderers/CSS2DRenderer.js"></script>
  22. <script type="module">
  23. var camera, scene, renderer, labelRenderer;
  24. var clock = new THREE.Clock(); //- 跟踪时间的对象。
  25. var textureLoader = new THREE.TextureLoader(); //- 纹理加载器
  26. var earth, moon;
  27. init();
  28. animate();
  29. function init() {
  30. var EARTH_RADIUS = 1; //- 地球半径大小
  31. var MOON_RADIUS = 0.27; //- 月球半径大小
  32. // 创建远景相机
  33. camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200);
  34. camera.position.set(10, 5, 20); //- 设置远景相机位置
  35. //- 实例化场景
  36. scene = new THREE.Scene();
  37. //- 平行光源
  38. var dirLight = new THREE.DirectionalLight(0xffffff);
  39. dirLight.position.set(0, 0, 1); //- 设置平行光源位置
  40. scene.add(dirLight); //- 光源添加到场景中
  41. //- 创建三维坐标系参考线,用于辅助编写three.js
  42. var axesHelper = new THREE.AxesHelper(5);
  43. scene.add(axesHelper); //- 辅助线添加到场景中
  44. /**
  45. * 地球
  46. */
  47. //- 多边形缓存几何模型
  48. var earthGeometry = new THREE.SphereBufferGeometry(EARTH_RADIUS, 20, 20); //- 地球模型
  49. //- 网孔材料
  50. var earthMaterial = new THREE.MeshPhongMaterial({
  51. specular: 0x333333, //- 设置高亮颜色
  52. shininess: 5, //- 设置亮度
  53. map: textureLoader.load('https://localhost:8080/images/earth/earth_atmos_2048.jpg'), //- 设置纹理贴图
  54. // specularMap: textureLoader.load('https://localhost:8080/images/earth/earth_specular_2048.jpg'), //- 设置镜面贴图(也称高光贴图)
  55. // normalMap: textureLoader.load('https://localhost:8080/images/earth/earth_normal_2048.jpg'), //- 设置法线贴图,缺省为null。
  56. normalScale: new THREE.Vector2(0.85, 0.85) //- 设置法线贴图比例,缺省为 (1, 1)。
  57. });
  58. earth = new THREE.Mesh(earthGeometry, earthMaterial); //- 创建地球Mesh对象
  59. scene.add(earth); //- 把地球添加至场景中
  60. /**
  61. * 月亮
  62. */
  63. var moonGeometry = new THREE.SphereBufferGeometry(MOON_RADIUS, 16, 16);
  64. var moonMaterial = new THREE.MeshPhongMaterial({
  65. shininess: 5,
  66. map: textureLoader.load('https://localhost:8080/images/earth/moon_1024.jpg')
  67. });
  68. moon = new THREE.Mesh(moonGeometry, moonMaterial);
  69. scene.add(moon);
  70. //点光源
  71. // var point = new THREE.PointLight(0xffffff);
  72. // point.position.set(400, 200, 300); //点光源位置
  73. // scene.add(point); //点光源添加到场景中
  74. //- 地球2D样式面板
  75. var earthDiv = document.createElement('div'); //- 创建一个div节点对象
  76. earthDiv.className = 'label'; //- 设置地球节点对象的class
  77. earthDiv.textContent = '这个是地球'; //- 设置文字
  78. earthDiv.style.marginTop = '-1em'; //- 设置style
  79. //- 创建2dCSS对象
  80. var earthLabel = new THREE.CSS2DObject(earthDiv);
  81. earthLabel.position.set(0, EARTH_RADIUS, 0);
  82. earth.add(earthLabel); //- 把2d文字添加到地球Mesh对象上,以便跟随移动
  83. //- 月球2D样式面板 与地球相同
  84. var moonDiv = document.createElement('div');
  85. moonDiv.className = 'label';
  86. moonDiv.textContent = '这个转的是月亮';
  87. moonDiv.style.marginTop = '-1em';
  88. var moonLabel = new THREE.CSS2DObject(moonDiv);
  89. moonLabel.position.set(0, MOON_RADIUS, 0);
  90. moon.add(moonLabel);
  91. //- 创建渲染器
  92. renderer = new THREE.WebGLRenderer();
  93. renderer.setPixelRatio(window.devicePixelRatio);
  94. renderer.setSize(window.innerWidth, window.innerHeight);
  95. document.body.appendChild(renderer.domElement);
  96. //- CSS2DRenderer 渲染器是生成一个DIV容器,它的作用是能把HTML元素绑定到三维物体上,在DIV容器中各自的DOM元素分别封装到CSS2DObject的实例中,并在scene中增加。
  97. labelRenderer = new THREE.CSS2DRenderer();
  98. labelRenderer.setSize(window.innerWidth, window.innerHeight);
  99. labelRenderer.domElement.style.position = 'absolute';
  100. labelRenderer.domElement.style.top = '0px';
  101. document.body.appendChild(labelRenderer.domElement);
  102. //- 控制视觉
  103. var controls = new THREE.OrbitControls(camera, labelRenderer.domElement);
  104. controls.minDistance = 5;
  105. controls.maxDistance = 100;
  106. }
  107. function animate() {
  108. requestAnimationFrame(animate); //- 持续渲染
  109. var elapsed = clock.getElapsedTime(); //- 获取时钟已运行时间。
  110. moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5); //- 根据始终运行的时间设置月球位置,达到一直转的目的
  111. renderer.render(scene, camera); //- 渲染场景
  112. labelRenderer.render(scene, camera); //- 渲染2DCSS文字
  113. }
  114. </script>
  115. </body>
  116. </html>

CSS3DRenderer

部分场景下,我们需要一个3D的文字或者提示框的时候,我们可以使用CSS3DRenderder,使用方法与CSS2DRenderer类似,但是需要注意的是由于CSS3DRenderder渲染的CSS3DObject对象是一个3D效果的对象,那么当视野转到后面的时候,文字就是反向显示的,参考下图:
image.png

创建3DCSS对象

  1. //- 地球3D样式面板
  2. var earthDiv = document.createElement('div'); //- 创建一个div节点对象
  3. earthDiv.className = 'label'; //- 设置地球节点对象的class
  4. earthDiv.textContent = '这个是地球'; //- 设置文字
  5. earthDiv.style.marginTop = '0.04em'; //- 设置style
  6. //- 创建3dCSS对象
  7. var earthLabel = new THREE.CSS3DObject(earthDiv);
  8. earthLabel.position.set(0, EARTH_RADIUS, 0);
  9. earthLabel.scale.multiplyScalar(0.02); //- 缩放级别
  10. earth.add(earthLabel); //- 把2d文字添加到地球Mesh对象上,以便跟随移动

创建3D渲染器

  1. //- 创建渲染器
  2. renderer = new THREE.WebGLRenderer();
  3. renderer.setPixelRatio(window.devicePixelRatio);
  4. renderer.setSize(window.innerWidth, window.innerHeight);
  5. document.body.appendChild(renderer.domElement);
  6. //- CSS3DRenderer 渲染器是生成一个DIV容器,它的作用是能把HTML元素绑定到三维物体上,在DIV容器中各自的DOM元素分别封装到CSS3DObject的实例中,并在scene中增加。
  7. labelRenderer = new THREE.CSS3DRenderer();
  8. labelRenderer.setSize(window.innerWidth, window.innerHeight);
  9. labelRenderer.domElement.style.position = 'absolute';
  10. labelRenderer.domElement.style.top = '0px';
  11. document.body.appendChild(labelRenderer.domElement);
  12. //- 控制视觉
  13. var controls = new THREE.OrbitControls(camera, labelRenderer.domElement);
  14. controls.minDistance = 5;
  15. controls.maxDistance = 100;

CSS3DRenderer - 完整代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  6. <title>three.js css2d - label</title>
  7. <!-- <link type="text/css" rel="stylesheet" href="main.css"> -->
  8. <script src="http://code.jquery.com/jquery-2.1.1.min.js"></script>
  9. <style>
  10. .label {
  11. color: #FFF;
  12. font-family: sans-serif;
  13. padding: 2px;
  14. background: rgba(0, 0, 0, .6);
  15. }
  16. </style>
  17. </head>
  18. <body>
  19. <script src="./js-r100/three.js"></script>
  20. <script src="./js-r100/controls/OrbitControls.js"></script>
  21. <script src="./js-r100/renderers/CSS3DRenderer.js"></script>
  22. <script type="module">
  23. var camera, scene, renderer, labelRenderer;
  24. var clock = new THREE.Clock(); //- 跟踪时间的对象。
  25. var textureLoader = new THREE.TextureLoader(); //- 纹理加载器
  26. var earth, moon;
  27. init();
  28. animate();
  29. function init() {
  30. var EARTH_RADIUS = 1; //- 地球半径大小
  31. var MOON_RADIUS = 0.27; //- 月球半径大小
  32. // 创建远景相机
  33. camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 200);
  34. camera.position.set(10, 5, 20); //- 设置远景相机位置
  35. //- 实例化场景
  36. scene = new THREE.Scene();
  37. //- 平行光源
  38. var dirLight = new THREE.DirectionalLight(0xffffff);
  39. dirLight.position.set(0, 0, 1); //- 设置平行光源位置
  40. scene.add(dirLight); //- 光源添加到场景中
  41. //- 创建三维坐标系参考线,用于辅助编写three.js
  42. var axesHelper = new THREE.AxesHelper(5);
  43. scene.add(axesHelper); //- 辅助线添加到场景中
  44. /**
  45. * 地球
  46. */
  47. //- 多边形缓存几何模型
  48. var earthGeometry = new THREE.SphereBufferGeometry(EARTH_RADIUS, 20, 20); //- 地球模型
  49. //- 网孔材料
  50. var earthMaterial = new THREE.MeshPhongMaterial({
  51. specular: 0x333333, //- 设置高亮颜色
  52. shininess: 5, //- 设置亮度
  53. map: textureLoader.load('https://localhost:8080/images/earth/earth_atmos_2048.jpg'), //- 设置纹理贴图
  54. // specularMap: textureLoader.load('https://localhost:8080/images/earth/earth_specular_2048.jpg'), //- 设置镜面贴图(也称高光贴图)
  55. // normalMap: textureLoader.load('https://localhost:8080/images/earth/earth_normal_2048.jpg'), //- 设置法线贴图,缺省为null。
  56. normalScale: new THREE.Vector2(0.85, 0.85) //- 设置法线贴图比例,缺省为 (1, 1)。
  57. });
  58. earth = new THREE.Mesh(earthGeometry, earthMaterial); //- 创建地球Mesh对象
  59. scene.add(earth); //- 把地球添加至场景中
  60. /**
  61. * 月亮
  62. */
  63. var moonGeometry = new THREE.SphereBufferGeometry(MOON_RADIUS, 16, 16);
  64. var moonMaterial = new THREE.MeshPhongMaterial({
  65. shininess: 5,
  66. map: textureLoader.load('https://localhost:8080/images/earth/moon_1024.jpg')
  67. });
  68. moon = new THREE.Mesh(moonGeometry, moonMaterial);
  69. scene.add(moon);
  70. //点光源
  71. var point = new THREE.PointLight(0xffffff);
  72. point.position.set(400, 200, 300); //点光源位置
  73. scene.add(point); //点光源添加到场景中
  74. //- 反向点光源,用于展示后面的情况
  75. var point2 = new THREE.PointLight(0xffffff);
  76. point.position.set(-400, -200, -300); //点光源位置
  77. scene.add(point); //点光源添加到场景中
  78. //- 地球3D样式面板
  79. var earthDiv = document.createElement('div'); //- 创建一个div节点对象
  80. earthDiv.className = 'label'; //- 设置地球节点对象的class
  81. earthDiv.textContent = '这个是地球'; //- 设置文字
  82. earthDiv.style.marginTop = '0.04em'; //- 设置style
  83. //- 创建3dCSS对象
  84. var earthLabel = new THREE.CSS3DObject(earthDiv);
  85. earthLabel.position.set(0, EARTH_RADIUS, 0);
  86. earthLabel.scale.multiplyScalar(0.02); //- 缩放级别
  87. earth.add(earthLabel); //- 把2d文字添加到地球Mesh对象上,以便跟随移动
  88. //- 月球3D样式面板 与地球相同
  89. var moonDiv = document.createElement('div');
  90. moonDiv.className = 'label';
  91. moonDiv.textContent = '这个转的是月亮';
  92. moonDiv.style.marginTop = '0.04em';
  93. var moonLabel = new THREE.CSS3DObject(moonDiv);
  94. moonLabel.position.set(0, MOON_RADIUS, 0);
  95. moonLabel.scale.multiplyScalar(0.02); //- 缩放级别
  96. moon.add(moonLabel);
  97. //- 创建渲染器
  98. renderer = new THREE.WebGLRenderer();
  99. renderer.setPixelRatio(window.devicePixelRatio);
  100. renderer.setSize(window.innerWidth, window.innerHeight);
  101. document.body.appendChild(renderer.domElement);
  102. //- CSS3DRenderer 渲染器是生成一个DIV容器,它的作用是能把HTML元素绑定到三维物体上,在DIV容器中各自的DOM元素分别封装到CSS3DObject的实例中,并在scene中增加。
  103. labelRenderer = new THREE.CSS3DRenderer();
  104. labelRenderer.setSize(window.innerWidth, window.innerHeight);
  105. labelRenderer.domElement.style.position = 'absolute';
  106. labelRenderer.domElement.style.top = '0px';
  107. document.body.appendChild(labelRenderer.domElement);
  108. //- 控制视觉
  109. var controls = new THREE.OrbitControls(camera, labelRenderer.domElement);
  110. controls.minDistance = 5;
  111. controls.maxDistance = 100;
  112. }
  113. //- 渲染函数
  114. function animate() {
  115. requestAnimationFrame(animate); //- 持续渲染
  116. var elapsed = clock.getElapsedTime(); //- 获取时钟已运行时间。
  117. moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5); //- 根据始终运行的时间设置月球位置,达到一直转的目的
  118. renderer.render(scene, camera); //- 渲染场景
  119. labelRenderer.render(scene, camera); //- 渲染2DCSS文字
  120. }
  121. </script>
  122. </body>
  123. </html>

点击事件 显示/隐藏信息面板

在业务场景中,我们会经常对移动的几何体或者模型需要点击查看详细信息.这个时候我们需要在这个几何体的上方添加/删除这个信息面板,前面的例子中,我们虽然只显示了一个名称,但是可以理解为简单的信息面板的一种.并且是通过节点的textcentent的方式往节点里添加的文字.现在我们需要构建一个div,用于展示信息.
就像这样:
image.png
这里会通过两种方式进行实现点击地球显示和删除面板的方式, 但由于信息面板的展示是通用的,只是点击事件操作不同,所以我们先把信息面板的初始化部分提取出来
前面我们是创建了一个div,然后通过textcentent的方式显示对应的节点文字.我们也可以在页面把信息面板写好,然后给这个元素节点的样式布局都做好之后,通过直接获取document中的这个节点进行转换CSS3Object实例.最后添加到earth的Mesh对象上,和前一种直接创建节点的方式是一样的.

  1. //- 地球3D样式面板
  2. var earthDiv = document.getElementById('earthBox'); //- 创建一个div节点对象
  3. earthDiv.className = 'earthlabel'; //- 设置地球节点对象的class
  4. earthDiv.setAttribute("isshow", '1');
  5. //- 创建3dCSS对象
  6. var earthLabel = new THREE.CSS3DObject(earthDiv);
  7. earthLabel.position.set(0, EARTH_RADIUS, 0);
  8. earthLabel.scale.multiplyScalar(0.02); //- 缩放级别
  9. earth.add(earthLabel); //- 把2d文字添加到地球Mesh对象上,以便跟随移动

Object/Add or remove实现添加/删除信息面板的方法

当我们获取了intsersects对象后(如果不清楚怎么获取intsersects对象可以参考
语雀内容
),通过判定object下的的material的name属性,可以把创建网格模型材质时的name属性获取,这样我们就可以知道具体点击的是哪个模型.然后通过该模型的children属性,我们可以发现模型下add的Object3D对象,这就是我们前面用CSS3D添加的信息面板,此时,我们只需要通过父级,也就是object的层级调用remove方法,传入对应的object就可以删除掉该对象.反过来添加的时候也只需要在模型对象下调用add方法,传入object就可以给children中添加对应的信息面板.
需要注意的是:当remove方法调用后,页面节点也被删除了,此时在添加时直接使用document获取该节点是无法找到的.由于我们这个demo是初始化就显示信息面板的,所以在remove之前,我用了一个变量先把需要删除的信息面板保存了下来,在添加的时候,只需要把保存的信息面板再add进去即可.

  1. //- 点击事件
  2. function clickEventFn(event) {
  3. let isdown = false, ismove = false;
  4. window.addEventListener('mousemove', function () {
  5. if (isdown) {
  6. ismove = true;
  7. //鼠标拖动事件执行函数
  8. }
  9. })
  10. window.addEventListener('mousedown', function () {
  11. isdown = true
  12. ismove = false
  13. })
  14. window.addEventListener('mouseup', function (event) {
  15. if (!isdown && ismove) {
  16. return 0;
  17. }
  18. if (ismove) {
  19. return 0;
  20. }
  21. let intsersects = getIntersects(event)
  22. if (intsersects.length > 0) {
  23. intsersects.forEach((item, index) => {
  24. if (item.object.material.name !== '') {
  25. if (item.object.material.name === 'earth') {
  26. console.log(intsersects[index].object)
  27. //- 点击的地球
  28. //- 判断点击后的地球对象的children的数量,目前children下只有3DCSS对象
  29. if (intsersects[index].object.children.length < 1) {
  30. intsersects[index].object.add(earthElement)
  31. } else {
  32. intsersects[index].object.children.forEach((item2, index2) => {
  33. //- 判断是否是Object3D的节点
  34. if (item2.type === 'Object3D') {
  35. if (intsersects[index].object.children[index2].element.attributes.isshow.value) {
  36. intsersects[index].object.children[index2].element.attributes.isshow.value = 0
  37. earthElement = intsersects[index].object.children[index2]
  38. intsersects[index].object.remove(intsersects[index].object.children[index2]);
  39. }
  40. }
  41. });
  42. }
  43. }
  44. }
  45. })
  46. }
  47. })
  48. }

通过CSS控制 显示/隐藏(推荐)

作为前端,我们当然知道,其实信息面板的显示和隐藏还可以通过CSS来控制,在初次加载完成后,显示/隐藏并不会删除节点,只需要改变display的状态即可,经过尝试发现通过CSS控制信息面板的显示和隐藏代码量更少,还一样解决了业务需求.

  1. //- 点击事件
  2. function clickEventFn(event) {
  3. let isdown = false, ismove = false;
  4. window.addEventListener('mousemove', function () {
  5. if (isdown) {
  6. ismove = true;
  7. //鼠标拖动事件执行函数
  8. }
  9. })
  10. window.addEventListener('mousedown', function () {
  11. isdown = true
  12. ismove = false
  13. })
  14. window.addEventListener('mouseup', function (event) {
  15. if (!isdown && ismove) {
  16. return 0;
  17. }
  18. if (ismove) {
  19. return 0;
  20. }
  21. let intsersects = getIntersects(event)
  22. if (intsersects.length > 0) {
  23. intsersects.forEach((item, index) => {
  24. if (item.object.material.name !== '') {
  25. if (item.object.material.name === 'earth') {
  26. console.log(intsersects[index].object)
  27. document.getElementById('earthBox').style.display === 'none' ? document.getElementById('earthBox').style.display = 'block' : document.getElementById('earthBox').style.display ='none';
  28. }
  29. }
  30. })
  31. }
  32. })
  33. }