Aframe,3dio场景:方向变化

时间:2017-11-29 08:40:46

标签: rotation aframe archilogic 3d.io

我曾经通过bakedModelUrl

将3dio场景上传到一帧
<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方法 - 摄像机位置=&#34; 10 10 0&#34;)

https://codepen.io/Anathapindika/pen/RjBxqO(sceneId Methode - 摄像头位置=&#34; 0 10 0&#34;)

2 个答案:

答案 0 :(得分:1)

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

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

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

现在,这是什么意思?

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

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

然而,在你的特定情况下,我检查了JSON,发现所有旋转都是0,但后来我发现了一些东西:两个模型实际上看起来不同。 data3d URL是否有可能过时(每次重做实际照明时,data3d URL都会发生变化。

如果我使用新的data3d网址,则两个代码中的方向相同。

答案 1 :(得分: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)
    })
 })