提问人:CRM MO 提问时间:3/22/2019 最后编辑:HangarRashCRM MO 更新时间:11/18/2023 访问量:969
如何一次扩展和移动所有节点?ARKit 斯威夫特
How to scale and move all nodes at once? ARKit Swift
问:
我得到了这些功能,可以在点击屏幕上显示的 3D 对象时缩放和移动它。问题在于,如果我移动或缩放节点(3D 对象),它只会使节点的一部分变大或变小,并且我想缩放所有内容。
我知道一种解决方案是将 Blender 中的 3D 对象合并为一个,但是稍后,我想将特定动画添加到特定节点,这就是我不想加入它们的原因。
以下是我用于缩放和移动对象的代码:
@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
}
}
}
还有这个:
@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
}
}
我不知道这是否有帮助,但这是节点的图像: 节点的图像
提前致谢!
答:
1赞
Hermes
6/20/2019
#1
为了实现你正在寻找的“分组”,你必须创建一个空的场景节点,它将成为所有其他节点的根。
let myRootNode : SCNNode = SCNNode()
sceneView.scene.rootNode.addChildNode(myRootNode)
接下来,将场景中的所有新节点追加到,以便所有模型都以同一节点为父级。myRootNode
let newChildNode : SCNNode = SCNNode()
myRootNode.addChildNode(newChildNode)
然后,您可以将转换应用于 以将其与所有子节点一起移动。此外,子节点仍然是单独的模型,可以单独移动(平移/旋转)或作为单个组移动。myRootNode
在命中测试中,您应该缩放和旋转模型,而不是单个模型。myRootNode
评论