ARKit 在场景中放置一个自定义对象
ARKit drop a custom object in the scene
我正在使用新的 ARKit,我能够创建一个名为 SphereNode 的新文件,该文件能够在视图上创建一个 Sphere droppable。
关键是我真的想添加一个自定义对象而不是标准球体。一些建议?这是用于创建 Sphere 的代码:
import SceneKit
class SphereNode: SCNNode {
init(position: SCNVector3) {
super.init()
let sphereGeometry = SCNSphere(radius: 0.005)
let material = SCNMaterial()
material.diffuse.contents = UIColor.red
material.lightingModel = .physicallyBased
sphereGeometry.materials = [material]
self.geometry = sphereGeometry
self.position = position
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
要使用自定义几何体而不是提供的几何体,最好的办法是使用外部编辑器来创建场景,例如 Blender,它也是开源的,可选择添加材质和纹理,然后将其导出为 iOS 可以使用的格式,例如 DAE。在你的应用程序中,你可以加载这个文件并获得一个 SCNScene
及其适当的初始化程序。加载场景后,您可以直接使用它来向用户显示或导航它以仅获取您想要使用的 node/geometry/material 然后随意使用,例如将它添加到已经存在的场景中。
假设您的文件名为 scene.dae
并且位于您的应用程序主包中,那么您可以将其加载为
let scene = SCNScene(named: “scene.dae”)
或者,如果您愿意,也可以指定一个完整的 URL
,请参阅 documentation 以了解更多详细信息,请注意,这些是可失败的初始化程序,因此请检查 nil。
假设具有自定义几何形状和纹理的节点是场景中的唯一对象,然后您可以使用
获取对它的引用
let obj = scene.rootNode.childNodes.first
请注意,这也是可选的,因此请检查 nil 值,如果我的假设不正确,您可以参考 SCNNode documentation 了解如何导航节点图,scene.rootNode
始终是您的起点点.
现在你有了我之前说过的场景和对象,你有两个选择:link场景直接到你的SCNView
(我不知道 ARKit 但我猜你有一个)而不是手动创建一个空的,或者只取 object/geometry/material 并通常将它添加到你已经创建的场景中。
如果你的对象不是静态的而是动态生成的,你也可以通过构建一个SCNGeometry
来逐点创建它,这样做有点棘手,你可以使用my library,因为我创建了一些有用的功能和 类 来帮助这个过程。
我正在使用新的 ARKit,我能够创建一个名为 SphereNode 的新文件,该文件能够在视图上创建一个 Sphere droppable。
关键是我真的想添加一个自定义对象而不是标准球体。一些建议?这是用于创建 Sphere 的代码:
import SceneKit
class SphereNode: SCNNode {
init(position: SCNVector3) {
super.init()
let sphereGeometry = SCNSphere(radius: 0.005)
let material = SCNMaterial()
material.diffuse.contents = UIColor.red
material.lightingModel = .physicallyBased
sphereGeometry.materials = [material]
self.geometry = sphereGeometry
self.position = position
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
要使用自定义几何体而不是提供的几何体,最好的办法是使用外部编辑器来创建场景,例如 Blender,它也是开源的,可选择添加材质和纹理,然后将其导出为 iOS 可以使用的格式,例如 DAE。在你的应用程序中,你可以加载这个文件并获得一个 SCNScene
及其适当的初始化程序。加载场景后,您可以直接使用它来向用户显示或导航它以仅获取您想要使用的 node/geometry/material 然后随意使用,例如将它添加到已经存在的场景中。
假设您的文件名为
scene.dae
并且位于您的应用程序主包中,那么您可以将其加载为let scene = SCNScene(named: “scene.dae”)
或者,如果您愿意,也可以指定一个完整的
URL
,请参阅 documentation 以了解更多详细信息,请注意,这些是可失败的初始化程序,因此请检查 nil。假设具有自定义几何形状和纹理的节点是场景中的唯一对象,然后您可以使用
获取对它的引用let obj = scene.rootNode.childNodes.first
请注意,这也是可选的,因此请检查 nil 值,如果我的假设不正确,您可以参考 SCNNode documentation 了解如何导航节点图,
scene.rootNode
始终是您的起点点.现在你有了我之前说过的场景和对象,你有两个选择:link场景直接到你的
SCNView
(我不知道 ARKit 但我猜你有一个)而不是手动创建一个空的,或者只取 object/geometry/material 并通常将它添加到你已经创建的场景中。
如果你的对象不是静态的而是动态生成的,你也可以通过构建一个SCNGeometry
来逐点创建它,这样做有点棘手,你可以使用my library,因为我创建了一些有用的功能和 类 来帮助这个过程。