«ядро: типы свойств: предупреждение «#бот» ресурс не найден. » — aframe-master.js

#reactjs #aframe #ar.js

#reactjs #aframe #ar.js

Вопрос:

Недавно начал использовать aframe и ar.js с помощью react. Пока все шло как по маслу. К сожалению, теперь модель gltf не загружается.

Вот моя сцена:

 <a-scene
        vr-mode-ui="enabled: false;"
        arjs="debugUIEnabled: false; patternRatio: 0.70"
        device-orientation-permission-ui="enabled: true">

          <a-assets timeout='3000'>
            <a-asset-item id="bot" src="url(/assets/robot_walking/scene.gltf)"></a-asset-item>
          </a-assets>

          <a-marker type="pattern" url="markers/07ratio/fly/pattern-fly.patt" id="m3" registermarker >
            <a-entity
              id="hat"
              gltf-model="#bot"
              animation-mixer
              visible="true"
              scale="0.05 0.05 0.05"
              position="0 0 0"
              rotation="0 0 0">
            </a-entity>
          </a-marker>

          <a-entity camera look-controls id="camera"></a-entity>

      </a-scene>
 

Он отображается внутри компонента react. Обрамление и Ar.js были установлены с помощью npm.
Он уже работал с другим gltf, используя

 gltf-mode="url(/assets/sun_straw_hat/scene.gltf)"
 

встроенный. Эта модель не имела никаких анимаций и была не такой большой. Но я также не мог использовать asset manager там. Кто-нибудь знает, что я здесь делаю не так? До сих пор я пытался импортировать aframe-extras, импортировать afram и ar.js с <script> тегами в index.html , используя src вместо gltf-модели, используя <a-gltf-model> с src и изменяя время ожидания ресурса. Не повезло ни с чем из этого.

с уважением, Орис

Комментарии:

1. Работает ли он вне react (или без arjs, если на то пошло)?

2. Привет, Петр, спасибо за ваш быстрый ответ. Я запустил его без, ar.js и реагируйте, и это работало нормально (с анимацией). С ar.js текстуры немного изменились, но это все еще работало (также с анимацией). Обнаружил, что масштаб намного меньше, чем у предыдущей модели. Теперь он отображается и в react. Но анимации по-прежнему не работают, и мне все равно приходится импортировать их без менеджера активов. (aframe-дополнения, которые я импортировал в react, имеют ту же версию, что и импортированные с тегом <script>)

3. есть ли шанс, что вы могли бы привести минимальный пример для glitch ? Работают ли анимации без react или они вообще не будут работать?

4. ах, теперь это работает… просто нужно было добавить ‘clip: *; ‘ в микшер анимации. Большое спасибо за ответ. Я бы не увидел, что он слишком мал, если бы не белый фон сцены только для кадра. ^^

5. рад, что это работает 🙂 Получайте удовольствие от a-frame!

Ответ №1:

Возможно, я сильно упрощаю, но afaik:


Как правило, в такой настройке:

 <a-assets>
  <a-asset-item id="model" src="scene.gltf"></a-asset-item>
</a-assets>
<a-entity gltf-model="#model"></a-entity>
 

gltf-model компонент предполагает, что <a-asset-item> узел готов. Но у react есть свой собственный алгоритм, когда отображать какой узел.

Поскольку gltf-model не удается запросить #model узел, вы получаете сообщение об ошибке:

 core:propertyTypes:warn "#bot" asset not found.
 

Я полагаю, мы можем либо:

1) загрузите модель непосредственно с URL-адреса

 gltf-model="url(path_to_model.gltf)"
 

который должен работать правильно (как в этом ремиксе вашего глюка):

введите описание изображения здесь

2) попробуйте отобразить a-assets узел перед [gltf-моделью]

Вероятно, есть способы получше, но я:

  1. поместите маркер камеру в другой компонент react (т.е. <Scene> )
  2. следите за тем, когда сцена ресурсы смонтированы
       class App extends React.Component {
    
        constructor(props) {
          super(props);
          this.state = {assetsReady: false};
        }
        componentDidMount() {
          this.setState({assetsReady: true});
          // for whatever reason i need to set it manually?
          this.state.assetsReady = true
        }
     
  3. используйте условие для отображения <Scene/> при монтировании:
     <a-scene>
      <a-assets>
         <a-asset-item id="model" 
                       src="https://cdn.glitch.me/fc511399-d148-4898-ad51-f0b6fafd32a6/scene.gltf"></a-asset-item>  
         </a-assets>
       {
           // this is inside Apps render() function
           this.state.assetsReady == true amp;amp;
           <Scene />
       }            
    </a-scene> 
     

проверьте это в этом ремиксе вашего глюка, который, похоже, тоже работает:

введите описание изображения здесь


Модель дает сбои из-за масштаба (масштабируйте модель в 30-50 раз) — простым решением является использование буфера логарифмической глубины:

 <a-scene renderer="logarithmicDepthBuffer: true"></a-scene>
 

Комментарии:

1. Спасибо за поддержку. Помещение сущности в отдельный компонент не только решило проблему, но и теперь код выглядит намного чище.