我正在创建一个 iOS 应用程序,我打算在 AR 中显示逼真/高质量的渲染。在试验这 3 个选项的同时,我仍然不确定我应该继续开发我的应用程序框架中的哪一个:SceneKit、RealityKit和Metal。
我读过 SceneKit 是建立在 Metal 之上的,但我不确定是否值得花时间/精力对任何自定义着色器进行编程,而不是使用 SceneKit 默认提供的功能。关于 RealityKit,我不需要它提供的任何动画或特殊效果,只需要照片级渲染方面。
三者中哪一个最适合开发 AR 和高质量模型渲染?
我想要capture一个真实世界的纹理,并将其应用于在激光雷达扫描仪的帮助下生成的 3D 网格。我想应该使用 Projection-View-Model 矩阵。纹理必须从固定的视点制作,例如,从房间的中心。但是,如果我们可以应用environmentTexturing作为cube-map场景中的纹理收集的数据,这将是一个理想的解决方案。
看看3D 扫描仪应用程序。这是一个参考应用程序,允许我们导出带有纹理的模型。
我需要通过一次迭代来捕获纹理。我不需要实时更新它。我意识到改变 PoV 会导致错误的纹理感知,换句话说,纹理失真。我也意识到 RealityKit 中有一个动态细分,并且有一个自动纹理 mipmapping(纹理的分辨率取决于它捕获的距离)。
import RealityKit
import ARKit
import MetalKit
import ModelIO
class ViewController: UIViewController, ARSessionDelegate {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
arView.session.delegate = self
arView.debugOptions.insert(.showSceneUnderstanding)
let config = ARWorldTrackingConfiguration()
config.sceneReconstruction = .mesh
config.environmentTexturing = .manual
arView.session.run(config)
}
}
Run Code Online (Sandbox Code Playgroud)
如何将最新的 iPad Pro 上的ARMeshGeometry新SceneReconstructionAPI生成的导出到.obj文件中?
这是SceneReconstruction文档。
我目前正在用 RealityKit 做一些实验。
我一直在看一些示例代码,我有点困惑之间的差异ARAnchor和AnchorEntity,当使用一个比其他。
到目前为止,我知道:
AnchorEntity也可以将 otherEntity作为子项,因此您可以将模型对象直接添加到锚点。你不能用 来做到这一点ARAnchor,你必须“手动”将模型对象添加到rootNode,并使用锚的位置正确放置它。ARAnchor来优化锚点周围区域的跟踪。的文档AnchorEntity没有指定这一点。现在我将一个AnchorEntity作为“根节点”添加到会话中,因为它使用起来更简单,所以我可以简单地将模型作为子项直接添加到这个锚点。但随后我还在ARAnchor场景的锚点中添加了一个位于相同位置的 ,以增强围绕该点的跟踪。这是必要的吗?
我在 Xcode 中有一个 RealityKit 项目,我想将ARView. 我考虑过 ReplayKit,但那是用于屏幕录制,我只想ARView用它的相机输入来录制。我考虑过 AFathi 的开源项目 ARVideoKit,但它不支持 RealityKit ......关于不同渲染路径的东西。我找到了一篇 Medium 文章,它描述了如何在 ARKit 应用程序中实现录音功能,但问题是它需要以下方法:func renderer(_ renderer: SCNSceneRenderer)RealityKit 中没有该方法,因为它是一个专门的 SceneKit 方法。
我正在尝试制作一个 3d 模型,例如 Apple 在 Motion Capture 示例中提供的机器人(在 WWDC 2019 中显示),它可以通过替换 Apple 提供的机器人角色来模仿我在动作捕捉 ARKit 3.0 中的动作。
所需的解决方案:
苹果有没有什么特殊的软件可以用来创建robot.usdz文件?如果是,那么请提供详细信息?
我们怎样才能转换格式,如.glb/ .gltf/ .obj/.dae文件来.usdz使用苹果的基于Python的工具,而不影响它的场景图?
我们如何.usdz在 Xcode 中编辑文件的场景图并将更改成功保存到 .usdz 文件中?
我正在使用 ARKit 和 RealityKit 在增强现实应用程序中通过 Vision 框架和 CoreML 对来自 ARSession 委托的每帧图像进行分类。在处理一个时,frame.capturedImage我不要求另一个frame.capturedImage性能。
相机没有提供流畅的体验,有时会卡住。好像丢帧了
我收到此警告:
[Session] ARSession <0x122cc3710>: ARSessionDelegate is retaining 14 ARFrames. This can lead to future camera frames being dropped.
Run Code Online (Sandbox Code Playgroud)
我的代码:
import Foundation
import SwiftUI
import RealityKit
import ARKit
import CoreML
struct ARViewContainer: UIViewRepresentable {
var errorFunc: ()->Void
var frameUpdateFunc: ()->Void
@Binding var finalLabel:String
func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)
let config = ARWorldTrackingConfiguration()
config.planeDetection = [.horizontal,.vertical]
config.environmentTexturing = .automatic
if …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 RealityKit 中加载模型和纹理(在 ARView 实例中设置),但我似乎无法弄清楚如何指定材料应该是双面的。
我将模型加载为ModelEntity,纹理加载为TextureResource. 模型和纹理正在加载,但正在向一侧倾斜。由于模型是开放的(即背面是可见的),它的渲染方式存在差距。
到目前为止,我有,
let entity: ModelEntity = try .loadModel(named: "model.obj")
var material = SimpleMaterial()
material.baseColor = try .texture(.load(named: "texture.png"))
entity.model?.materials = [material]
Run Code Online (Sandbox Code Playgroud)
我希望找到一个属性,例如
material.twoSided = true
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我还没有在 RealityKit 中找到等效的东西。
有人知道如何在 RealityKit 中设置双面材质吗?
model通过在a 的属性上设置材质的颜色ModelEntity,我可以更改对象的不透明度/alpha。但如何将其动画化呢?我的目标是使对象具有完全不透明度的动画,然后让它们淡入设定的不透明度,例如 50%。
有了SCNAction.fadeOpacityin ,这变得特别容易SCNNode。SceneKit
let fade = SCNAction.fadeOpacity(by: 0.5, duration: 0.5)
node.runAction(fade)
Run Code Online (Sandbox Code Playgroud)
AnEntity符合HasTransform,但这仅允许您对比例、位置和方向进行动画处理。与淡入或淡出之类的材质动画无关。如果您创建用于动画隐藏或显示的行为,则效果在 RealityComposer 中,但似乎没有类似的功能来HasTransform提供动画不透明度的功能。
我一直在文档中寻找一些东西,我的下一个想法本质上是创建一个自定义动画来替换这种行为,但它似乎应该可用,但我只是没有找到它。
我无法从内存中释放我的 RealityKit ARView()。不幸的是,我知道 ARKit + SceneKit 也存在类似的问题,但解决方法并不能解决我的问题。
上述解决方案通过手动删除所有“可疑”内容来发挥作用。这正是我在更广泛的范围内所做的:
func closeCurrentView(completion: (() -> Void)? = nil, isScanAnotherFloor: Bool = false) {
if backgroundRenderingID != UIBackgroundTaskIdentifier.invalid {
let app = UIApplication.shared
app.endBackgroundTask(self.backgroundRenderingID)
self.backgroundRenderingID = UIBackgroundTaskIdentifier.invalid
}
self.arView?.session.pause()
self.arView?.session.delegate = nil
self.arView?.scene.anchors.removeAll()
self.arView?.removeFromSuperview()
self.arView?.window?.resignKey()
self.arView = nil
}
Run Code Online (Sandbox Code Playgroud)
内存会上升到90MB到250MB,一旦deinit调用就会减少到175MB,不会清除所有内存。
另外在初始化时,我也设置了适当的选项。
arView?.renderOptions = [
.disableMotionBlur,
.disableDepthOfField,
.disablePersonOcclusion,
.disableGroundingShadows,
.disableFaceOcclusions,
.disableHDR
]
Run Code Online (Sandbox Code Playgroud)
但仍然没有运气。
arkit ×10
realitykit ×10
swift ×9
metal ×2
apple-vision ×1
ios ×1
lidar ×1
mo-cap ×1
scenekit ×1
swiftui ×1