我有一个RealityKit‘s ARView的子类,它具有以下函数来进行光线投射:

func makeRaycastQuery(alignmentType: ARRaycastQuery.TargetAlignment) -> simd_float4x4? {
    let results = self.raycast(from: self.center,
                           // Better for pinning to planes
                           allowing: .estimatedPlane,
                          alignment: alignmentType)

    // We don't care about changing scale on raycast so keep it the same
    guard var result = results.first?.worldTransform else { return nil }
    result.scale = SCNVector3(1, 1, 1)
    return result
}

然而,我的results数组总是空的.在设置ARView以启用光线投射时,是否需要进行其他配置?

推荐答案

试试这段代码(我是为iPad的playground 编写的):

import RealityKit
import SwiftUI
import ARKit
import PlaygroundSupport

struct ContentView : View {
    
    @State private var arView = ARView(frame: .zero)
    
    var body: some View {
        return ARContainer(arView: $arView)
            .gesture(
                TapGesture()
                    .onEnded { _ in
                        raycasting(arView: arView)
                    }
            )
    }        
    func raycasting(arView: ARView) {
        guard let query = arView.makeRaycastQuery(from: arView.center, 
                                              allowing: .estimatedPlane, 
                                             alignment: .any)
        else { fatalError() }
            
        guard let result = arView.session.raycast(query).first
        else { fatalError() }
            
        let entity = ModelEntity(mesh: .generateSphere(radius: 0.1))
        let anchor = AnchorEntity(raycastResult: result)
        anchor.addChild(entity)
        arView.scene.anchors.append(anchor)
    }
}

struct ARContainer : UIViewRepresentable {
    
    @Binding var arView: ARView
    
    func makeUIView(context: Context) -> ARView {
        arView.cameraMode = .ar
        return arView
    }   
    func updateUIView(_ view: ARView, context: Context) { }
}

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.setLiveView(ContentView())

附注:

This version在UIKit应用程序中工作.

Ios相关问答推荐

由于代码签名时出错,无法在iOS设备上发布iOS Maui Build

AVFoundation Camera推出变焦SWIFT

为什么EKEventStore().questFullAccessToEvents()可以与模拟器一起使用,而不能与真实设备一起使用?

XcodeCloud生成失败,返回";ci_pre_xcodeBuild.sh是可执行文件,但退出时返回2个退出代码.";

视图未更新以在按下按钮时显示另一个视图

为什么IOS多行文本输入在React原生纸张对话框中无法正常工作?

动画文本位置

SwiftUI 图表 BarMark 将注释对齐到图表顶部

使用 AVCaptureDeviceTypeBuiltInTripleCamera 时 Select 合适的相机进行条码扫描

Flutter IOS 构建错误 - 在签名和功能编辑器中 Select 一个开发团队.

PropertyWrapper 不存在的 Codable 属性的默认值

SwiftUI - ScrollView 不显示底部文本

一个 SwiftUI 视图中的多个垂直滚动视图

async/await、Task 和 [weak self]

如何关闭情节提要弹出框

无法验证客户端 3000

Xcode 11 向后兼容性:UIWindowScene 仅在 iOS 13 或更高版本中可用

iPhone 未连接.连接 iPhone 后 Xcode 将继续

如何计算 Swift 数组中元素的出现次数?

如何使用 presentModalViewController 创建透明视图