Как добавить кликабельный объект в массив моделей в кадре

#javascript #html #arrays #onclick #aframe

Вопрос:

Я пытаюсь добавить своего рода точку доступа к каждой сменяемой 3D-модели, поэтому, когда пользователь нажимает на точку доступа на экране, она отображает информацию. Я пытаюсь добавить компоненты точки доступа в файл javascript следующей кнопки. Я понимаю, что в next-button.js файл, который я вызываю для идентификатора= «модель», но я хотел бы вызвать все модели, чтобы я мог разместить на каждой из них определенную точку доступа. Есть идеи, как я могу это сделать? Спасибо! =)

Вот HTML — код

 '''<!-- Swap Next Model -->

<div id="nextbutton" style="display: none; z-index: 10">
  <h2>Next 3D Model</h2>
</div>

<!-- Hotspot Project -->

<div id="recenterButtonContainer" class="hidden">
  <img src="./assets/images/recenter.png">
</div>

<div id="container" class="collapsed">
  <div class="outer">
    <div id="closeButton" onclick="hideAll()">Close</div>
  </div>
  <div class="outer" id="contents"></div>
  <!--<div class="outer">Contents go here</div>-->
</div>

<a-scene 
  
  next-button
  tap-place
  xrextras-gesture-detector
  xrextras-almost-there
  xrextras-loading
  xrextras-runtime-error
  xrextras-pause-on-hidden
  renderer="maxCanvasWidth: 960; maxCanvasHeight: 960;colorManagement: true"
  xrface="
          cameraDirection: back;
          allowedDevices: any;"
  >

  <!-- We can define assets here to be loaded when A-Frame initializes -->
  <a-assets>
    <!-- Credit to Poly by Google for the model: https://poly.google.com/view/7rUkCX-AIR2 -->
    <a-asset-item id="humanModel" src="assets/models/human-hand.glb"></a-asset-item>
    <a-asset-item id="grassModel" src="assets/models/grass-hand.glb"></a-asset-item>
    <a-asset-item id="dirtyModel" src="assets/models/dirty-hand.glb"></a-asset-item>
    <a-asset-item id="heartModel" src="assets/models/heart.glb"></a-asset-item>

  </a-assets>

 <a-assets>
     <audio id="ukulele-music" preload="auto" class="a-sound" src="./assets/ukulele.mp3" response-type="arraybuffer"></audio>
  </a-assets>

  <xrextras-capture-config></xrextras-capture-config>
  
 <a-camera position="0 1 3">
    <a-entity sound="src: #ukulele-music; loop: true; volume: 0.3;"></a-entity>
 </a-camera>

  <!-- The raycaster will emit mouse events on scene objects specified with the cantap class -->
  <a-camera
    id="camera"
    position="0 4 6"
    raycaster="objects: .cantap"
    cursor="fuse: false; rayOrigin: mouse;">
  </a-camera>

<!-- Hotspot -->
  <a-assets>
    <!-- Credit to Poly by Google for the model: https://poly.google.com/view/7rUkCX-AIR2 -->
    <a-asset-item id="handModel" src="assets/models/human-hand.glb"></a-asset-item>
    <a-mixin id="hotspot-text" text="font: exo2bold; width: 5" geometry="primitive: plane; width: 1.6; height: 0.4" material="color: black;" position="0 0.5 0"></a-mixin>
    <a-mixin id="hotspot-target" geometry="primitive: octahedron; radius: 0.2;" material="flatShading: true; color: rgb(255, 0, 161)"></a-mixin>
  </a-assets>

  <a-entity
    light="
      type: directional;
      intensity: 0.8;
      castShadow: true;
      shadowMapHeight:2048;
      shadowMapWidth:2048;
      shadowCameraTop: 10;
      target: #model;"
    xrextras-attach="target: model; offset: 1 15 3;"
    shadow>
  </a-entity>

  <a-light type="ambient" intensity="0.7"></a-light>

  <a-entity 
    id="model"
    gltf-model="#humanModel" 
    class="cantap" 
    xrextras-hold-drag
    xrextras-two-finger-rotate 
    xrextras-pinch-scale
    scale="50 50 50" 
    shadow="receive: false">

    <!--Hotspot #1-->
    <a-entity id="hotspot1" mixin="hotspot-target" position="-0.515 0.505 0.969" rotation="0 0 0" scale="0.5 0.5 0.5" look-at="#camera" class="cantap" tap-hotspot>
      <a-text id="hotspot1-child" value="Hotspot 1" align="center" mixin="hotspot-text" visible="false" tap-close></a-text>
    </a-entity>

  </a-entity>
  <a-plane
    id="ground" 
    rotation="-90 0 0" 
    width="1000" 
    height="1000" 
    material="shader: shadow" 
    shadow>
  </a-plane>
</a-scene>'''
 

Вот это next-button.js код

 '''// Copyright (c) 2021 8th Wall, Inc.

const nextButtonComponent = () => ({
  init() {
    const modelList = ['humanModel', 'grassModel', 'dirtyModel']
    const model = document.getElementById('model')
    const nextButton = document.getElementById('nextbutton')
    nextButton.style.display = 'block'

    let idx = 1  // Start with the 2nd model as 1st is already in the scene on page load
    const nextModel = () => {
      // Need to remove gltf-component first due to AFrame regression: https://github.com/aframevr/aframe/issues/4341
      model.removeAttribute('gltf-model')
      // Switch to next model in the list
      model.setAttribute('gltf-model', `#${modelList[idx]}`)

      idx = (idx   1) % modelList.length
    }
    nextButton.onclick = nextModel  // Switch to the next model when the button is pressed.
  },
})
export {nextButtonComponent} '''
 

Файл js компонента hotspot

 '''const tapHotspotComponent = {
  init() {
    const id = this.el.getAttribute('id')
    const contents = document.getElementById('contents')
    const container = document.getElementById('container')
    const childElement = document.getElementById(`${id}-child`)

    const handleClickEvent = (e) => {
      hideAll()
      container.classList.remove('collapsed')
      childElement.setAttribute('visible', true)
      childElement.setAttribute('class', 'cantap')
      const title = childElement.getAttribute('value')
      contents.innerHTML = `<h1>${title}</h1>More info about ${title} goes here.`
    }

    this.el.addEventListener('click', handleClickEvent, true)
  },
}

export {tapHotspotComponent} '''