3

我曾经通过 bakeModelUrl 将 3dio 场景上传到 a-frame

<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 Methode - 相机位置=“0 10 0”)

4

2 回答 2

1

我同意这似乎令人惊讶,我们需要重新考虑这种行为或更好地解释它。

io3d-data3d直接使用组件与使用io3d.scene-methods 将整个场景结构导入 A-Frame之间存在细微差别。

基本上 data3d是场景结构的一部分,但场景结构不仅仅包含 data3d。值得注意的是 data3d 通常不是顶级对象

这是什么意思?

这意味着,场景结构支持诸如多个级别(也称为楼层或楼层)之类的东西,每个级别都有自己的 data3d 模型。然后可以单独旋转每个 data3d 模型,并且也可以旋转顶级场景对象。

直接使用 data3d 模型时,您不会得到这些旋转,而在使用场景结构方法时会得到它们。

但是,在您的特定情况下,我检查了 JSON 以发现所有旋转都是 0,但后来我注意到了一些事情:这两个模型实际上看起来不同。是否有可能是 data3d URL 已过时(每次重做逼真的光照时,data3d URL 都会更改。

如果我使用新的 data3d URL,两个代码笔中的方向是相同的。

于 2017-11-29T22:07:15.250 回答
1
io3d.scene.getAframeElements(sceneId)

导入整个场景层次结构并创建相应的 A-Frame 节点。

烘焙模型绑定到该level节点的子plan 节点。该plan节点是最高层次结构。 https://3d.io/docs/api/1/scene-structure-reference.html#level

一个假设是,在您的情况下,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)
    })
 })
于 2017-11-29T22:25:55.430 回答