You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断USDZ模型需放置在检测到的水平或垂直平面?

实现方案

你不需要额外做平面类型的自研判断,ARKit的射线检测结果已经自带平面对齐类型标识,只需要给模型绑定允许放置的平面规则,在放置、交互环节做匹配过滤即可,具体实现分3步:

  • 第一步:为每个AR模型定义允许放置的平面属性
    给你的商品AR模型类新增平面对齐权限的枚举属性,加载不同模型的时候给这个属性赋对应值即可:

    // 模型支持的放置平面对齐类型
    enum ModelPlanePermission {
        case horizontalOnly // 仅支持水平面(比如地面、桌面的家具、摆件模型)
        case verticalOnly // 仅支持垂直面(比如墙面装饰、挂画、壁挂家电模型)
        case anyPlane // 水平垂直都支持
    }
    
    // 你自己封装的商品AR模型基类新增该属性
    class CommerceAREntity: Entity {
        let planePermission: ModelPlanePermission
        // 模型初始化、资源加载逻辑保持原有实现即可
    }
    
  • 第二步:放置模型时做平面对齐类型匹配
    用户点击屏幕触发放置时,射线检测环节直接传入当前选中模型支持的对齐类型,只有命中符合要求的平面时才允许放置,不需要拿到结果后再二次计算:

    // 假设当前选中待放置的模型为selectedModel
    let queryAlignment: ARRaycastQuery.TargetAlignment
    switch selectedModel.planePermission {
    case .horizontalOnly:
        queryAlignment = .horizontal
    case .verticalOnly:
        queryAlignment = .vertical
    case .anyPlane:
        queryAlignment = .any
    }
    
    // 构造射线检测请求
    guard let raycastQuery = arView.makeRaycastQuery(
        from: touchLocation,
        allowing: .existingPlaneInfinite,
        alignment: queryAlignment
    ) else { return }
    
    // 执行检测,只有拿到有效结果才执行放置
    guard let hitResult = arView.session.raycast(raycastQuery).first else {
        // 可在此处提示用户:当前位置不符合该商品放置要求,请对准水平面/垂直面
        return
    }
    
    // 按照原有逻辑把模型放到hitResult对应的位置即可
    selectedModel.transform.matrix = hitResult.worldTransform
    arView.scene.addAnchor(selectedModel)
    
  • 第三步:模型拖动交互时增加校验
    如果你给模型加了拖动移位的手势,记得在手势位置更新时重复上述对齐校验,避免用户把仅支持水平面的模型拖到垂直墙面上,反之亦然。

补充说明:不要自己通过平面法向量计算判断水平/垂直,ARKit返回的平面锚点、射线命中结果已经做了系统级的平面类型判断,直接读取ARPlaneAnchor.Alignment、ARRaycastResult.targetAlignment属性即可,准确率比自己计算高很多。

内容的提问来源于stack exchange,提问作者gstream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 08:57:19