【iOS ARKit】触发器与触发域

本文介绍了在AR应用中如何使用RealityKit中的触发器和触发域进行碰撞检测,区分静态与动态物体的物理行为,并展示了自定义物理实体类以实现更灵活的物理模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

触发器

     在上节的示例中,所有可见的物体都参与了物理模拟,但在一些应用中,我们物理模拟,同时又需要了解是否有物体与它们发生了碰撞。如在 AR场景中,当角色靠近一散门时,我们并不希望因为角色与门发生碰撞而导致门移动,但又需要了解是否有角色与门发生了碰撞并以此为依据决定是否打开门。在这种应用场合中,使用触发器是最好的选择。

     在 RealityKit 中使用触发器非常简单,具体在使用时,只需要将物体的 physicsBody. mode设置为static,并将 collision. mode 设置为 trigger即可,这样既能防止物体产生运动又能捕获到碰撞相关信息。

     修改后,运行应用,操作球体与长方体发生碰撞,在碰撞发生后,可以看到相应的碰撞信息依然会打印出来,但由于长方体 physicsBody. mode 属性设置 static,长方体不会参与物理模拟,也不会发生移动。

 触发域

     使用触发器的方式适合于对可见物体进行碰撞检测,在实际应用开发中,还有一种情况,对不可见物体的碰撞检测,如在 AR 游戏中,当角色进入某一空间后触发新的机关或者激活 AI Agent(NPC,Non-PlayerCharacter,智能体)。对于这种情况,我们可以建一个 ModeIEntity,但是不渲染相应网格,就像上节代码四周围栏所做的那样。但在 RealityKit 中提供了另一种更简单易用的应对这种情况的实体类,它就是 TriggerVolume。Trigger Volume(触发区域体)实体类包含 Transform component、 Synchronizationcomponent、Collision component3 个组件。

     触发域实体包含 Collision component 组件,能够与其他碰撞体发生碰撞,因此,我们可以将触发域实体作为一个 传感器使用,当有其他碰撞体进入或者离开触发域实体所占空间时实时地获取相应消息。与其他带碰撞器的实体一样,当有其他碰撞体进入或者离开触发域实体时也会触发 CollisionEvents,我们可以通过订阅这些事件进行相应处理。

     触发域实体也是一个实体,但它非常简单,因为不带有网格信息,因此无法对它的触发域实体进行渲染。触发域实体也不参与物理模拟,但将其作为碰撞检测非常高效。

     触发域实体的使用与其他实体的使用一样,我们对代码进行改造,将 boxEntity 换成TriggerVolume,关键代码如下所示。

//
//  TriggerVolumeView.swift
//  ARKitDeamo
//
//  Created by zhaoquan du on 2024/3/18.
//

import SwiftUI
import ARKit
import RealityKit

struct TriggerVolumeView: View {
    var body: some View {
        TriggerVolumeContentView().navigationTitle("触发器与触发域").edgesIgnoringSafeArea(.all)
    }
}

struct TriggerVolumeContentView: UIViewRepresentable{
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值