当前位置: 首页 > news >正文

大江网站建设住建房产信息查询

大江网站建设,住建房产信息查询,北京网站建设公司服务有哪些,小型玩具企业网站建设初期阶段任务触发器 在上节的示例中#xff0c;所有可见的物体都参与了物理模拟#xff0c;但在一些应用中#xff0c;我们物理模拟#xff0c;同时又需要了解是否有物体与它们发生了碰撞。如在 AR场景中#xff0c;当角色靠近一散门时#xff0c;我们并不希望因为角色与门发生碰撞而…触发器 在上节的示例中所有可见的物体都参与了物理模拟但在一些应用中我们物理模拟同时又需要了解是否有物体与它们发生了碰撞。如在 AR场景中当角色靠近一散门时我们并不希望因为角色与门发生碰撞而导致门移动但又需要了解是否有角色与门发生了碰撞并以此为依据决定是否打开门。在这种应用场合中使用触发器是最好的选择。 在 RealityKit 中使用触发器非常简单具体在使用时只需要将物体的 physicsBody. mode设置为static并将 collision. mode 设置为 trigger即可这样既能防止物体产生运动又能捕获到碰撞相关信息。 修改后运行应用操作球体与长方体发生碰撞在碰撞发生后可以看到相应的碰撞信息依然会打印出来但由于长方体 physicsBody. mode 属性设置 static长方体不会参与物理模拟也不会发生移动。 触发域 使用触发器的方式适合于对可见物体进行碰撞检测在实际应用开发中还有一种情况对不可见物体的碰撞检测如在 AR 游戏中当角色进入某一空间后触发新的机关或者激活 AI AgentNPC,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 RealityKitstruct TriggerVolumeView: View {var body: some View {TriggerVolumeContentView().navigationTitle(触发器与触发域).edgesIgnoringSafeArea(.all)} }struct TriggerVolumeContentView: UIViewRepresentable{func makeCoordinator() - Coordinator {Coordinator()}func makeUIView(context: Context) - some ARView {let arView ARView(frame: .zero)let config ARWorldTrackingConfiguration()config.planeDetection .horizontalcontext.coordinator.arView arViewarView.session.delegate context.coordinatorarView.session.run(config)return arView}func updateUIView(_ uiView: UIViewType, context: Context) {}class Coordinator: NSObject, ARSessionDelegate{var sphereEntity : ModelEntity!var arView:ARView? nillet gameController GameController()MainActor func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {guard let anchor anchors.first as? ARPlaneAnchor,let arView arView else{return}let planeAnchor AnchorEntity(anchor:anchor)let triggerShape: ShapeResource .generateBox(size: [01,0.2,0.3])let triggerVolume TriggerVolume(shape: triggerShape)triggerVolume.name TriggerVolumtriggerVolume.transform.translation [0.2,planeAnchor.transform.translation.y 0.15,0]let sphereMaterial SimpleMaterial(color:.red,isMetallic: true)sphereEntity ModelEntity(mesh: .generateSphere(radius: 0.05),materials: [sphereMaterial], collisionShape: .generateSphere(radius: 0.05), mass: 0.04)sphereEntity.physicsBody?.mode .dynamicsphereEntity.name SpheresphereEntity.transform.translation [-0.3,planeAnchor.transform.translation.y0.15,0]sphereEntity.physicsBody?.material .generate(friction: 0.001,restitution: 0.01)let plane :MeshResource .generatePlane(width: 1.2, depth: 1.2)let planeCollider : ShapeResource .generateBox(width: 1.2, height: 0.01, depth: 1.2)let planeMaterial SimpleMaterial(color:.gray,isMetallic: false)let planeEntity ModelEntity(mesh: plane, materials: [planeMaterial], collisionShape: planeCollider, mass: 0.01)planeEntity.physicsBody?.mode .static//静态平面planeEntity.physicsBody?.material .generate(friction: 0.001, restitution: 0.1)planeAnchor.addChild(planeEntity)planeAnchor.addChild(triggerVolume)planeAnchor.addChild(sphereEntity)let subscription arView.scene.subscribe(to: CollisionEvents.Began.self,on: triggerVolume) { event inprint(trigger volume发生碰撞)print(EntityA name : \(event.entityA.name))print(EntityB name : \(event.entityB.name))print(Force : \(event.impulse))print(Collision Position: \(event.position))}gameController.gameAnchor try! Ball.loadBallGame()gameController.collisionEventStreams.append(subscription)arView.scene.addAnchor(planeAnchor)let gestureRecognizers arView.installGestures(.translation, for: sphereEntity)if let gestureRecognizer gestureRecognizers.first as? EntityTranslationGestureRecognizer {gameController.gestureRecognizer gestureRecognizergestureRecognizer.removeTarget(nil, action: nil)gestureRecognizer.addTarget(self, action: #selector(self.handleTranslation))}arView.session.delegate nilarView.session.run(ARWorldTrackingConfiguration())}objcfunc handleTranslation(_ recognizer: EntityTranslationGestureRecognizer) {guard let ball sphereEntity else { return }let settings gameController.settingsif recognizer.state .ended || recognizer.state .cancelled {gameController.gestureStartLocation nilball.physicsBody?.mode .dynamicreturn}guard let gestureCurrentLocation recognizer.translation(in: nil) else { return }guard let gestureStartLocation gameController.gestureStartLocation else {gameController.gestureStartLocation gestureCurrentLocationreturn}let delta gestureStartLocation - gestureCurrentLocationlet distance ((delta.x * delta.x) (delta.y * delta.y) (delta.z * delta.z)).squareRoot()if distance settings.ballPlayDistanceThreshold {gameController.gestureStartLocation nilball.physicsBody?.mode .dynamicreturn}ball.physicsBody?.mode .kinematiclet realVelocity recognizer.velocity(in: nil)let ballParentVelocity ball.parent!.convert(direction: realVelocity, from: nil)var clampedX ballParentVelocity.xvar clampedZ ballParentVelocity.z// 夹断if clampedX settings.ballVelocityMaxX {clampedX settings.ballVelocityMaxX} else if clampedX settings.ballVelocityMinX {clampedX settings.ballVelocityMinX}// 夹断if clampedZ settings.ballVelocityMaxZ {clampedZ settings.ballVelocityMaxZ} else if clampedZ settings.ballVelocityMinZ {clampedZ settings.ballVelocityMinZ}let clampedVelocity: SIMD3Float [clampedX, 0.0, clampedZ]ball.physicsMotion?.linearVelocity clampedVelocity}} }#Preview {TriggerVolumeView() }运行上述代码在加载后的场景中无法看到触发域实体对象使用移动手势操作球体当球体经过触发域实体所在区域时碰撞被检测到CollisionEvents.Began 事件被触发相应信息也被打印出来。在本章所有演示示例中我们只对碰撞发生的Began事件进行了处理CollisionEvents 事件其实包括3个事件具体如下表。 事件名称 描述 CollisionEvents. Began 结构体当两个碰撞体开始接触时触发这个事件在每次碰撞中只触发一次 CollisionEvents. Updated 结构体当两个碰撞体保持接触时这个事件在每一帧都会触发 CollisionEvents. Ended 结构体当两个碰撞体脱离接触时触发这个事件在每次碰撞中只触发一次 通过这3个事件就能方便地处理所有与碰撞相关的事务关于 RealityKit 中事件的处理可参阅之前相关章节。 自定义物理实体类 我们通过实体的 PhysicsBodyComponent 组件和 PhysicsMotionComponent 组件实现了物理模拟在 RealityKit 中ModelEntity实体类默认带有这两个组件使用ModelEntity 类创建的实体都可以与物理模拟。在 RealityKit 中使用物理引擎进行物理模拟的类必须遵循相应的物理协议根据物理模拟类协议的层级结构我们可以通过遵循HasPhysicsBody、HasPhysicsMotion协议或直接通过遵循HasPhysics协议自定义物理实体类。自定义物理实体类后可以更方便灵活地进行物理模拟并简化代码。 物理引擎总结 物理引擎突破了按照预定脚本执行物体运动计算的方式通过设置物体的物理参数来运行。使用物理引擎后虚拟物体之间、虚拟物体与现实环境之间的相互作用不需要进行硬编码而是按照牛顿运动定律实时计算模拟由于牛顿运动定律的客观性这种模拟出来的效果与真实物体间相互作用效果可以做到完全一致从而大大增强虚拟物体的可信度。
http://www.zqtcl.cn/news/681891/

相关文章:

  • 网站版面布局结构网站建设公司公司
  • 给新公司建网站中国互联网企业排名前十名
  • 中国建设银行网站会员用户名网站建设应列入啥费用
  • 网站上面的水印怎么做的广东网站建设公
  • 爱站网关键词长尾挖掘工具wordpress文章外链
  • 做视频剪辑接私活的网站网站商城系统设计
  • thinkphp5做网站做网站需要准备资料
  • 门户网站平台建设方案建e室内设计网cad
  • 西安网站建设收费标准第五次全国经济普查
  • 成品网站货源1688免费襄阳公司网站建设
  • 2020国内十大小说网站排名365网站
  • 潍坊做网站的网络公司网页设计入门教材pdf
  • 影视公司网站建设wordpress 500ms
  • 旅游网站建设公司crm客户管理系统模板
  • 哪个网站有免费的模板阿里云上如何用iis做网站
  • 中山优化网站门户网站建设jz190
  • 湖州服装网站建设网站备案和域名备案区别
  • 网站开发好学嘛网络安全工程师年薪
  • 17网站一起做网店睡衣网线制作流程
  • 广告网站设计公司好吗网站页面设计主要包括
  • 网站的做重庆市建设工程造价信息表
  • 建网站跟建网店的区别怎样营销建设网站
  • 医院做网站的风格乐清网站建设哪家好
  • 手机商城网站方案如何自己搭建微信小程序
  • 做影视免费网站违法吗青岛快速排名优化
  • 网站建设在电子商务中的作用的看法360地图怎么添加商户
  • 网站域名备案与不备案的区别wordpress 注册审核
  • 大学生做企业网站网页设计免费模板情侣
  • 商城网站建设教程网站开发支付宝
  • 广安网站设计快递加盟代理