我正在尝试了解和使用ARKit。但是有一件事我无法完全理解。
苹果关于ARAnchor说:
现实世界中的位置和方向,可用于在AR场景中放置对象。
但这还不够。所以我的问题是:
ARAnchor什么? ARAnchor的特征点只是一部分? 对于我们有 SCNNodes SCNBillboardConstraint,那么有什么方法可以将此约束应用于实体(使用 RealityKit 而不是 SceneKit 时),以便实体在设备移动时始终面向相机?
我正在添加一个ARCoachingOverlayView这样ARView的
let coachingOverlayTemp = ARCoachingOverlayView()
coachingOverlayTemp.delegate = self
coachingOverlayTemp.session = self.session
coachingOverlayTemp.goal = .horizontalPlane
coachingOverlayTemp.activatesAutomatically = true
coachingOverlayTemp.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(coachingOverlayTemp)
coachingOverlay = coachingOverlayTemp // I store it to a variable on the class
Run Code Online (Sandbox Code Playgroud)
以后,如果我这样做
coachingOverlay.activatesAutomatically = false
Run Code Online (Sandbox Code Playgroud)
没有影响。coachingOverlay继续正常工作。
如何在需要时立即禁用它?
纹理是否可以具有 alpha 透明度?
我有包含 8 位 RGBA 的 png 文件,但由于某种原因,应该透明的部分只是黑色。
我这样分配材料:
private func setupLightMeshes(_ scene: Entity) {
let lightEntity = scene.findEntity(named: "LightWindow_Plane")!
var lightMaterial = UnlitMaterial()
lightMaterial.baseColor = try! MaterialColorParameter.texture(
TextureResource.load(named: "light.png")) // this is 8bpc RGBA
var modelComponent = lightEntity.components[ModelComponent] as! ModelComponent
modelComponent = ModelComponent(mesh: modelComponent.mesh, materials: [lightMaterial])
lightEntity.components.set(modelComponent)
}
Run Code Online (Sandbox Code Playgroud) 我在启用 LiDAR 的设备上运行 iOS14 ARSession,并让它输出通过相机源动态创建的网格覆盖层。
是否可以禁用 ARView 或 ARSession 的相机源,同时仍然看到调试网格覆盖?
这是我显示网格覆盖的方式:
arView.debugOptions.insert(.showSceneUnderstanding)
Run Code Online (Sandbox Code Playgroud)
我想看到的是:黑屏,带有代表网格顶点和面的彩色线条。
我花了 2 天的时间试图了解如何在我的 RealityKit 项目中正确播放动画。
我遵循了其他 stackoverflow 主题的许多提示,但没有成功。我知道使用 RealityKit v2 我们只能播放 usdz 文件中的第一个动画,好吧。我正在尝试直接在 Reality Composer 中播放 Apple 提供的“toy_robot_vintage.usdz”的第一个动画。
这是我的完整代码:
func loadModel(named: String, result: ARRaycastResult) {
var usdzToLoad: String = ""
switch named {
case "ROBOT":
usdzToLoad = "toy_robot_vintage.usdz"
default:
break;
}
DispatchQueue.main.async {
let modelToLoad = try! ModelEntity.loadModel(named: usdzToLoad)
switch named {
case "ROBOT":
modelToLoad.name = "ROBOT"
default:
break;
}
let anchor = AnchorEntity(plane: .horizontal, classification: .any, minimumBounds: [0.1, 0.1])
anchor.position.y = 0.01
anchor.addChild(modelToLoad)
// Create a "Physics" model of …Run Code Online (Sandbox Code Playgroud) 在 Unity 中,我们可以使用环境深度来实现遮挡。它在幕后使用 ARKit。我如何在 iOS ARkit 中实现相同的行为。
我知道我们可以用深度配置帧语义,但我怀疑它真的与统一环境深度遮挡相同吗?
// Build the set of required frame semantics.
let semantics: ARConfiguration.FrameSemantics = [.sceneDepth]
configuration.frameSemantics = semantics
session.run(configuration)
Run Code Online (Sandbox Code Playgroud) 我正在 RealityKit 中创建一个盒子,并希望对盒子的每一侧应用不同的纹理。我使用以下代码,但它总是在每一侧应用名为“lola”的第一个纹理作为材质。我错过了什么吗?
cancellable = TextureResource.loadAsync(named: "lola")
.append(TextureResource.loadAsync(named: "cover"))
.append(TextureResource.loadAsync(named: "purple_flower"))
.append(TextureResource.loadAsync(named: "cover"))
.append(TextureResource.loadAsync(named: "purple_flower"))
.append(TextureResource.loadAsync(named: "cover"))
.collect()
.sink { [weak self] completion in
if case let .failure(error) = completion {
fatalError("Unable to load texture \(error)")
}
self?.cancellable?.cancel()
} receiveValue: { textures in
var materials: [UnlitMaterial] = []
textures.forEach { texture in
print(texture)
var material = UnlitMaterial()
material.color = .init(tint: .white, texture: .init(texture))
materials.append(material)
}
box.model?.materials = materials
anchor.addChild(box)
arView.scene.addAnchor(anchor)
}
Run Code Online (Sandbox Code Playgroud) 举例来说,我想在用户头顶上锚定一朵云。
我知道它AnchorEntity存在,并且您可以使用 来获取对用户头部的引用AnchorEntity(.head)。但我该如何实际使用它呢?使用这段代码我什么也看不到。
import SwiftUI
import RealityKit
struct CloudSpace: View {
let headAnchor = AnchorEntity(.head)
var body: some View {
RealityView { content in
async let cloud = ModelEntity(named: "Cloud")
do {
content.add(headAnchor)
let cloud = try await cloud
headAnchor.addChild(cloud)
} catch {
print(error)
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我认为 RealityView 应该能够做更多奇特的事情,但我仍然想弄清楚它们之间的确切区别。目前,它们彼此太相似了,例如它们都需要一个实体名称来初始化。我想知道什么时候 Model3D 就足够了,什么时候必须使用 RealityView?