Aframe, 3dio scene: изменение ориентации

Я использовал для загрузки 3dio сцены в a-frame через bakedModelUrl

<a-entity io3d-data3d="key:/3f995099-d624-4c8e-ab6b-1fd5e3799173/170515-0913-4p3ktf/1e588a3b-90ac-4a32-b5b8-ff2fda7f87c4.gz.data3d.buffer"></a-entity>

который описан здесь: https://3d.io/docs/api/1/aframe-components.html

но при использовании этого метода (через sceneId):

const scene = document.querySelector('a-scene')
io3d.scene.getAframeElements(sceneId)
.then(elements => {
// this will give us two elements
// The first is the actual scene according to the scene structure hierarchy
// The second is the camera with potential waypoints that where defined in the scene structure
// you can leverage the waypoints using our A-Frame tour component
elements.forEach((el) => {
  // add elements to the scene
  scene.appendChild(el)
})
scene.appendChild(element)
})

который описан здесь: https://3d.io/docs/api/1/scene.html, у меня, кажется, нет той же ориентации моделей.

посмотри:

https://codepen.io/Anathapindika/pen/mqzGPB?editors=1011 (метод bakedModelUrl - положение камеры = "10 10 0")

https://codepen.io/Anathapindika/pen/RjBxqO (метод sceneId - положение камеры = "0 10 0")

2 ответа

Решение
io3d.scene.getAframeElements(sceneId)

импортирует всю иерархию сцены и создает соответствующие узлы A-Frame.

Запеченная модель привязана к level узел, который является дочерним plan узел. plan узел является высшей иерархией. https://3d.io/docs/api/1/scene-structure-reference.html

Предполагается, что в вашем случае plan узел имеет поворот или изменение положения.

Чтобы импортировать сцену без применения корневого поворота и положения, у вас есть два варианта:

Адаптируйте sceneStructure перед импортом:

io3d.scene.getStructure(sceneId)
  .then(sceneStructure => {
     // root node is the 'plan' node. reset it's position and rotation
     sceneStructure.x = sceneStructure.z = sceneStructure.ry = 0
     // convert sceneStructure to A-Frame Elements
     var elements = io3d.scene.getAframeElementsFromSceneStructure(sceneStructure)
     // add elements to the scene
     elements.forEach((el) => {
       // add elements to the scene
       scene.appendChild(el)
     })
  })

Или адаптируйте корневой элемент DOM сразу после импорта

io3d.scene.getAframeElements(sceneId)
  .then(elements => {
    elements[0].setAttribute('position', '0 0 0')
    elements[0].setAttribute('rotation', '0 0 0')
    // add elements to the scene
    elements.forEach((el) => {
      // add elements to the scene
      scene.appendChild(el)
    })
 })

Я согласен, что это кажется удивительным, и нам нужно либо переосмыслить это поведение, либо объяснить его лучше.

Существует тонкая разница между использованием io3d-data3d компонент непосредственно против использования io3d.scene-методы для импорта всей структуры сцены в A-Frame.

По сути, data3d является частью структуры сцены, но структура сцены содержит больше, чем просто data3d. Примечательно, что data3d обычно не является объектом верхнего уровня.

Теперь, что это значит?

Это означает, что структура сцены поддерживает такие вещи, как несколько уровней (этажей или этажей), каждый из которых имеет свою собственную модель data3d. Каждую из моделей data3d можно поворачивать по отдельности, а также можно поворачивать объект сцены верхнего уровня.

При непосредственном использовании модели data3d вы не получите эти повороты, в то время как вы получите их при использовании методов структуры сцены.

Тем не менее, в вашем конкретном случае я проверил JSON, чтобы найти, что все повороты равны нулю, но потом я заметил кое-что: две модели на самом деле выглядят по-разному. Возможно ли, что URL data3d устарел (каждый раз, когда вы переделываете реалистичное освещение, URL data3d будет меняться.

Если я использую новый URL data3d, ориентация будет одинаковой в обоих кодепенах.

Другие вопросы по тегам