ARKit 变换整个场景
ARKit transform whole scene
我有这个 SCNScene,它非常好并且包含一些 nSCNNodes...
现在我想在 ARSCNView 中显示这个场景。但是,我的整个场景都是用 x,y,z >= 0 构建的,也就是说,如果我只是设置屏幕,我的整个场景就会在相机后面。
在获得 currentFrame 之后,我也无法在视图中渲染我的场景,因为节点太多,它会卡住...
所以:
我正在寻找一种方法来以某种方式转换我的 SCNScene,这样它就不会自行改变,但会在相机前找到一个合适的位置(即 0,0,0)并且可能会缩小一点。
这可能吗?如果是这样,我必须对哪些对象进行哪些转换?
感谢阅读:)
假设我对你的解释是正确的,你想做两件事:
- 加载您的场景,
- 确保将其缩放到合理的大小。
在你的问题的第一部分,你说你无法加载模型,因为节点太多了。由于您尚未发布任何代码,因此很难提供具体的解决方案,但这可能会有所帮助。
(a) 在您的 SCNScene
中创建一个 EmptyNode
并将其命名为 'Root' 等,然后将您所有的实际场景元素作为此元素的子元素,例如:
因为我们现在有一个 'Root' 节点来保存场景,我们可以简单地这样做来加载它:
func loadScene(){
//1. Get The Name Of The SCNSceme
guard let hugeScene = SCNScene(named: "SceneKitAssets.scnassets/HugeScene.scn"),
//2. Get The Root Node Which Holds All Your Content
let sceneNode = hugeScene.rootNode.childNode(withName: "Root", recursively: false) else { return }
//3. Add It To Your ARSCNView
self.augmentedRealityView?.scene.rootNode.addChildNode(sceneNode)
//4. Set The Scenes Position 1.5m Away From The Camera
sceneNode.position = SCNVector3(0, 0, -1.5)
//5. Scale It To A Reasonable Size
sceneNode.scale = SCNVector3(0.2,0.2,0.2)
}
您还可以考虑在后台线程上加载它,例如:
DispatchQueue.global(qos: .background).async {
self.loadScene()
}
您将需要尝试缩放等,但这应该让您入门。
我有这个 SCNScene,它非常好并且包含一些 nSCNNodes... 现在我想在 ARSCNView 中显示这个场景。但是,我的整个场景都是用 x,y,z >= 0 构建的,也就是说,如果我只是设置屏幕,我的整个场景就会在相机后面。
在获得 currentFrame 之后,我也无法在视图中渲染我的场景,因为节点太多,它会卡住...
所以: 我正在寻找一种方法来以某种方式转换我的 SCNScene,这样它就不会自行改变,但会在相机前找到一个合适的位置(即 0,0,0)并且可能会缩小一点。
这可能吗?如果是这样,我必须对哪些对象进行哪些转换?
感谢阅读:)
假设我对你的解释是正确的,你想做两件事:
- 加载您的场景,
- 确保将其缩放到合理的大小。
在你的问题的第一部分,你说你无法加载模型,因为节点太多了。由于您尚未发布任何代码,因此很难提供具体的解决方案,但这可能会有所帮助。
(a) 在您的 SCNScene
中创建一个 EmptyNode
并将其命名为 'Root' 等,然后将您所有的实际场景元素作为此元素的子元素,例如:
因为我们现在有一个 'Root' 节点来保存场景,我们可以简单地这样做来加载它:
func loadScene(){
//1. Get The Name Of The SCNSceme
guard let hugeScene = SCNScene(named: "SceneKitAssets.scnassets/HugeScene.scn"),
//2. Get The Root Node Which Holds All Your Content
let sceneNode = hugeScene.rootNode.childNode(withName: "Root", recursively: false) else { return }
//3. Add It To Your ARSCNView
self.augmentedRealityView?.scene.rootNode.addChildNode(sceneNode)
//4. Set The Scenes Position 1.5m Away From The Camera
sceneNode.position = SCNVector3(0, 0, -1.5)
//5. Scale It To A Reasonable Size
sceneNode.scale = SCNVector3(0.2,0.2,0.2)
}
您还可以考虑在后台线程上加载它,例如:
DispatchQueue.global(qos: .background).async {
self.loadScene()
}
您将需要尝试缩放等,但这应该让您入门。