我曾经通过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;)
答案 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)
})
})