首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何一次缩放和移动所有节点?ARKit Swift

如何一次缩放和移动所有节点?ARKit Swift
EN

Stack Overflow用户
提问于 2019-03-22 04:56:13
回答 1查看 654关注 0票数 2

我得到了这些功能,当点击屏幕时,可以缩放和移动屏幕上显示的3D对象。问题在于,如果我移动或缩放节点(3D对象),它只会使节点的一部分变大或变小,而我想要缩放所有内容。

我知道一种解决方案是在Blender中将3D对象作为一个整体加入,但后来,我想将特定的动画添加到特定的节点,这就是为什么我不想加入它们。

下面是我用来缩放和移动对象的代码:

代码语言:javascript
运行
复制
@objc func panned(recognizer :UIPanGestureRecognizer)
{
    //This function is for scaling
    if recognizer.state == .changed
    {
        guard let sceneView = recognizer.view as? ARSCNView
    else
    {
        return
    }

    let touch = recognizer.location(in: sceneView)
    let translation = recognizer.translation(in: sceneView)

    let hitTestResults = self.sceneView.hitTest(touch, options: nil)

        if let hitTest = hitTestResults.first
        {
            let planeNode = hitTest.node

            self.newAngleY = Float(translation.x) * (Float) (Double.pi)/180
            self.newAngleY += self.currentAngleY
            planeNode.eulerAngles.y = self.newAngleY
        }
        else if recognizer.state == .ended
        {
            self.currentAngleY = self.newAngleY
        } 
    }

}

还有这一条:

代码语言:javascript
运行
复制
@objc func pinched(recognizer :UIPinchGestureRecognizer)
{
    if recognizer.state == .changed
    {
        guard let sceneView = recognizer.view as? ARSCNView
            else
            {
                return
            }
    }

    let touch = recognizer.location(in: sceneView)

    let hitTestResults = self.sceneView.hitTest(touch, options: nil)

    if let hitTest = hitTestResults.first
    {

        let planeNode = hitTest.node

        let pinchScaleX = Float(recognizer.scale) * planeNode.scale.x
        let pinchScaleY = Float(recognizer.scale) * planeNode.scale.y
        let pinchScaleZ = Float(recognizer.scale) * planeNode.scale.z

        planeNode.scale = SCNVector3(pinchScaleX, pinchScaleY, pinchScaleZ)

        recognizer.scale = 1 
    }
}

我不知道这是否有帮助,但这是节点的图像:Image of the nodes

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2019-06-20 01:58:00

为了实现你正在寻找的“分组”,你必须创建一个空的场景节点,它将是所有其他节点的根。

代码语言:javascript
运行
复制
let myRootNode : SCNNode = SCNNode()
sceneView.scene.rootNode.addChildNode(myRootNode)

接下来,将场景中的所有新节点附加到myRootNode,以便所有模型都成为同一节点的子对象。

代码语言:javascript
运行
复制
let newChildNode : SCNNode = SCNNode()
myRootNode.addChildNode(newChildNode)

然后,您可以将平移应用于myRootNode,以将其与所有子节点一起移动。此外,子节点仍然是单独的模型,可以单独移动(平移/旋转),也可以作为单个组移动。

在命中测试中,您应该缩放和旋转myRootNode,而不是单个模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55289106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档