如何将3D模型添加到场景中以使它们具有某些XYZ位置?

时间:2017-12-20 23:41:58

标签: swift scenekit arkit scnscene

我曾经写过一个函数,我在其中添加了几何圆锥体到场景中。它看起来像这样:

func addZombies(i:Int, x: Float, y: Float, z: Float)
{
    let node = SCNNode()
    node.geometry = SCNCone(topRadius: 0.0, bottomRadius: 1, height: 2)
    node.position = SCNVector3(x, y, z)
    sceneView.scene.rootNode.addChildNode(node)

    nodes.append(node)
}

其中nodes是存储SCNNodes的数组。一切都很好。如果我搬家了,那么锥体就会拥有他们所拥有的确切位置,这是一个真实的现实"。

然而,我购买了一个漂亮的僵尸3D模型,我试图将锥体更改为模型。我找到了某种解决方案并试图自己实现它。这就是我想出的:

func addZombies(i:Int, x: Float, y: Float, z: Float)
{
    guard let zombieScene = SCNScene(named: "art.scnassets/StrongZombie.DAE") else { return }
    let zombieNode = SCNNode()
    let zombieSceneChildNodes = zombieScene.rootNode.childNodes

    for childNode in zombieSceneChildNodes
    {
        zombieNode.addChildNode(childNode)
    }

    zombieNode.position = SCNVector3(x, y, z)
    zombieNode.scale = SCNVector3(0.5, 0.5, 0.5)
    //zombieNode.look(at: (sceneView.pointOfView?.position)!)
    sceneView.scene.rootNode.addChildNode(zombieNode)

    nodes.append(zombieNode)
} 

不幸的是,即使它在特定的位置创造了僵尸,如果我移动,僵尸"移动"与我一起。它们与移动相机相关地显示,这对我来说是不合需要的。谁能帮我吗?我希望他们像锥体一样。 Thx提前

2 个答案:

答案 0 :(得分:0)

只看到有限的代码片段....

我认为它可能与原始DAE文件近似的默认physicShape有关。形状有时可能过于复杂并导致跟踪问题。

尝试将zombieNode physicBody设置为标准框形状

protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code

// Setup activity layout
@Override protected void onCreate(Bundle savedInstanceState)
{
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);

    getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy

    mUnityPlayer = new UnityPlayer(this);
    setContentView(mUnityPlayer);
    mUnityPlayer.requestFocus();
}

如果您还没有设置,请设置debugOptions以显示Physics形状。这将有助于调试想要继续进行冲突。

$(window).on("scroll", function() {
    if($(window).scrollTop() > 2300) {
        $(".bottomMenu").addClass("active");
    } else {
       $(".bottomMenu").removeClass("active");
    }
});

答案 1 :(得分:0)

每次添加僵尸时,不是加载dae文件并循环遍历子节点,而是先将zombie节点存储在属性/变量中,例如在viewdidload中。然后每次添加僵尸时,使用该僵尸节点的.clone属性,并将其添加到rootnode子节点。

如果dae文件中只有一个对象,则不必遍历其子节点,只需使用childnodes.firstObject。