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

免费做网站. 优帮云重庆网站建设是什么

免费做网站. 优帮云,重庆网站建设是什么,哪里有室内装修培训的地方,建站设计网站协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术#xff0c;ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场#xff08;View#xff09;。如果用户在某一个位置新创建了一个 ARAnchor#xff0c;这时…协作 Session 使用注意事项 协作 Session 是在 ARWorldMap 基础上发展起来的技术ARWorldMap 包含了一系列的地标、ARAnchor 及在观察这些地标和 ARAnchor 时摄像机的视场View。如果用户在某一个位置新创建了一个 ARAnchor这时这个 ARAnchor位置并不是相对于公共世界坐标系的实际上此时用户根本就不知道是否还有其他参与者而是被存储成离这个 ARAnchor 最近视场的相对坐标这些信息也会一并存入到用户的ARWorldMap 中并被发送到其他用户。 由于 ARAnchor 是相对于 View 的坐标而这些 View 会分组存储到 ARWorldMap 中亦即是说ARAnchor 与任何设备的世界坐标系都没有关系不管这些ARAnchor 是被本机设备解析到本机场景中还是通过网络发送到其他设备而被解析到其他用户的场景中都不会改变 ARAnchor 与 View 之间的相互关系。因此即使其他用户使用了不同的世界坐标系他们也能在相同的真实环境位置中看到这个 ARAnchor。 从以上原理可以看到ARAnchor 对共享AR体验起到了非常关键的作用所以为了更好地共享AR体金开发人员应当在开发时注意以下几点 1跟踪 ARAnchor 的更新。在ARKit探索环境时随着采集的特征点信息越来越多对环境的理解会越来越精准ARKit会通过对之前的摄像机视场View进行微调来优化与调整地标信息因此与某一摄像机视场View相关联的 ARAnchor 姿态也会随之发生调整所以应当保持对 ARAnchor 的跟踪以确保ARAnchor 发生更新时能及时反映到当前用户场景中。 2虚拟物体应靠近 ARAnchor。在 ARAnchor 发生更新时连接到其上的虚拟物体也会发生更新离ARAnchor 远的虚拟物体在更新时可能会出现误差而导致偏离真实位置。所以连接到ARAnchor 的虚拟对象应当靠近对应的 ARAnchor 以减少误差带来的影响。 3处理好 ARAnchor 与虚拟物体的关系。独立的虚拟物体应当使用独立的ARAnchor这样每一个独立虚拟物体都可以尽量靠近 ARAnchor并且在存储时可以存储到 ARWorldMap 相同分组中。对若干个距离较近并且希望保持相互之间位置关系的虚拟物体应当使用同一个 ARAnchor因为在 ARAnchor 更新时这些虚拟物体会得到相同的更新矩阵从而保持相互间的位置关系不发生任何变化。 4使用协作 Session 必须要将 isCollaborationEnabled设置为true只有设置为 true, ARKit 才会周期性的调用 session_didOutputCollaborationData方法也才能将 Collaboration Data 数据发送给所有参与方。 5为更高效可靠地传输 AR 进程数据ARKit 对 Collaboration Data 数据进行了优先级区分由ARSession. CollaborationData. Priority 枚举表示分为两种类型Critical关键和 Optional可选。Critical 数据定期更新对同步 AR体验非常关键应当被可靠地发送到所有参与设备Optional 数据产生频率高几乎每帧产生重要性不及 Critical 数据因此有所丢失也不会有太大影响。标记为 Optional 的数据包括设备位置数据。区分优先级可以允许我们对不同的Collaboration Data 数据采取不同的处理策略提高同步的性能。 6 在使用协作 Session 时有时我们需要知道某个 ARAnchor 是不是由本机设备生成ARAnchor 的创建者属于哪个设备如在某个场合需要在某个参与者退出后清除所有该参与者创建的虚拟物体。 在ARKit 中每个 ARSession 在运行时会都会生成一个 UUIDUniversally Unique Identifier全局唯一 ID用于唯一标识该 Session同时在协作 Session 中每个 ARParticipantAnchor 也都有一个独立且唯一的 Identifier 值标识该参与者ARParticipantAnchor 与 ARAnchor 都有一个 sessionldentifier 属性这个sessionldentifier 值与所在设备的ARSession UUID 值相同。因此利用这些信息我们就可以判断ARAnchor 的创建者并依据结果进行后续处理典型的示例代码所示。 7协作 Session 同步从有参与者参与开始但地图的真正融合开始于参与者物理特征值的匹配即参与者探索过的物理环境有重叠的部分一旦地图融合后每个参与用户都会获得其他参与者探索过的地图同时会同步所有ARAnchor所以为了便于 ARKit 更快地融合地图参与者应当在相同的物理环境中扫描相同的物理区域。 协作 Session 实例 在 ARKit 中使用协作 Session 主要利用 session_didOutputCollaborationData方法跟踪同步所有ARAnchor其中通过网络收发 Collaboration Data 需要开发人员自行处理完整代码如下所示。 // // CooperationSession.swift // ARKitDeamo // // Created by zhaoquan du on 2024/2/27. //import SwiftUI import ARKit import RealityKit import MultipeerConnectivitystruct CooperationSession: View {static var arView:ARView?static var multipeerSession: MultipeerSession?var body: some View {CooperationSessionContent().onDisappear(perform: {CooperationSession.arView?.session.delegate nilCooperationSession.arView?.session.pause()CooperationSession.arView nilCooperationSession.multipeerSession?.endConnect()CooperationSession.multipeerSession nilprint(CooperationSession onDisappear)}).edgesIgnoringSafeArea(.all).navigationTitle(协作Session)} }struct CooperationSessionContent:UIViewRepresentable {func makeUIView(context: Context) - some ARView {let arView ARView(frame: .zero)let config ARWorldTrackingConfiguration()config.isCollaborationEnabled trueconfig.planeDetection .horizontalarView.session.run(config,options: [.resetTracking,.removeExistingAnchors])arView.session.delegate context.coordinatorCooperationSession.arView arViewcontext.coordinator.createPlane()context.coordinator.addGesture()return arView}func updateUIView(_ uiView: UIViewType, context: Context) {}func makeCoordinator() - Coordinator {Coordinator()}class Coordinator: NSObject, ARSessionDelegate {var multipeerSession: MultipeerSession?{return CooperationSession.multipeerSession}var planeEntity : ModelEntity? nilvar raycastResult : ARRaycastResult?var arView: ARView? {return CooperationSession.arView}func createPlane(){CooperationSession.multipeerSession MultipeerSession(serviceType: cooper-session, receivedDataHandler: receiveData(data:from:), peerJoinedHandler: peerJoined(_:), peerLeftHandler: peerLeft(_:), peerDiscoveredHandler: peerDiscovered(_:))let planeMesh MeshResource.generatePlane(width: 0.15, depth: 0.15)let planeMaterial SimpleMaterial(color:.white,isMetallic: false)planeEntity ModelEntity(mesh: planeMesh, materials: [planeMaterial])let planeAnchor AnchorEntity(plane: .horizontal)do {let planeMesh MeshResource.generatePlane(width: 0.15, depth: 0.15)var planeMaterial SimpleMaterial(color: SimpleMaterial.Color.red, isMetallic: false)planeMaterial.color try SimpleMaterial.BaseColor(tint:UIColor.yellow.withAlphaComponent(0.9999), texture: MaterialParameters.Texture(TextureResource.load(named: AR_Placement_Indicator)))planeEntity ModelEntity(mesh: planeMesh, materials: [planeMaterial])planeAnchor.addChild(planeEntity!)arView?.scene.addAnchor(planeAnchor)} catch let error {print(加载文件失败:\(error))}}func addGesture(){let tap UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))arView?.addGestureRecognizer(tap)}objc func handleTap(_ sender: UITapGestureRecognizer? nil) {guard let raycastResult raycastResult else {print(还未检测到平面)return}let anchor ARAnchor(name: objectAnchor, transform: raycastResult.worldTransform)arView?.session.add(anchor: anchor)}//ARSessionDelegatefunc session(_ session: ARSession, didUpdate frame: ARFrame) {guard let arView arView, let result arView.raycast(from: arView.center, allowing: .estimatedPlane, alignment: .horizontal).first else{return}raycastResult resultplaneEntity?.setTransformMatrix(result.worldTransform, relativeTo: nil)}func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {guard let arView arView else {return}for anchor in anchors {if anchor.name objectAnchor{let box ModelEntity(mesh: MeshResource.generateBox(size: 0.1), materials: [SimpleMaterial.init(color: .green, isMetallic: false)])box.position [0,0.05,0]let anchorEntity AnchorEntity(anchor: anchor)anchorEntity.addChild(box)arView.scene.addAnchor(anchorEntity)}}}func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) {guard let multipeerSession multipeerSession else {return}if !multipeerSession.connectedPeers.isEmpty {do {let encodeData try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)multipeerSession.sendToAllPeers(encodeData, reliably: data.priority .critical)} catch {print(encode data faile)}}}func receiveData(data:Data,from peer: MCPeerID){if let data try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARSession.CollaborationData.self, from: data){if data.priority .critical {arView?.session.update(with: data)print( data updated)}}}func peerDiscovered(_ peer: MCPeerID) - Bool {guard let multipeerSession multipeerSession else {return false}if multipeerSession.connectedPeers.count 3 {return false}else{return true}}func peerJoined(_ peer: MCPeerID) {}func peerLeft(_ peer: MCPeerID) {}} }#Preview {CooperationSession() }代码清单8-6 中代码实现的功能如下 1进行平面检测在检测到可用平面时实例化一个指示图标用于指示放置位置。 2添加屏幕单击手势在平面可用时单击屏幕会在指示图标位置放置一个 ARAnchor注意这个ARAnchor 的名字name 属性稍后会详细说明。 3检查所有添加到场景中的 ARAnchor当ARAnchor 名字name 属性为指定值时在 ARAnchor 位置生成一个立方体。 4周期性地向所有参与设备发送本设备的 AR 进程数据Collaboration Data。 5接收来自其他设备的Collaboration Data 数据并更新到本设备的 ARSession 中。 在第2项功能中即 handleTap方法中的代码利用命中点的坐标生成了一个 ARAnchor并将其添加到 ARSession 中这里 ARAnchor 的name 属性很重要因为我们后续需要利用该 ARAnchor 的名字来恢复虚拟元素。 在第3项功能中即 sessiondidAdd方法中代码遍历所有添加的 ARAnchor这里的 ARAnchor既包括本设备的ARAnchor也包括从其他设备同步过来的 ARAnchor当 ARAnchor 名字name 属性为功能2中指定值时在 ARAnchor 位置生成一个立方体。利用该方法既会生成本设备自身的立方体也会生成其他设备共享的立方体即实现了操作同步。 在第4项功能中即 session_didOutputCollaborationData方法中代码首先确保通信可用且有参与者然后利用 let collaborationData try? NSKeyedUnarchiver. unarchivedObject ofClass: ARSession.CollaborationData. self, from: data 语句获取 Collaboration Data 数据并序列化之设置数据通信优先级后将数据发送到所有参与者。 在第5项功能中即 receivedData方法中代码利用 let collaborationData try?NSKeyedUnarchiver.unarchivedObjectofClass: ARSession. CollaborationData. self, from: data 语何获取 Collaboration Data数据并反序列化之然后将其更新到本设备的 ARSession中。 与 ARWorldMap一样Collaboration Data 数据也不包含虚拟元素本身因此需要人工恢复虚拟元素因为虚拟元素总是与ARAnchor 关联利用 ARAnchor 的名字name属性我们就可以恢复关联的虚拟元素通过这种方式可以逐一地恢复所有的虚拟元素从而恢复整个场景达到所有参与方看到完全相同 AR场景的效果即实现了 AR体验的同步。 在两台设备A 和B上同时运行本案例确保两台设备连接到同一个 WiFi网络或者都打开蓝牙在A设备检测到的平面上单击添加立方体在AB连接顺畅的情况下可以看到B设备也会同步出现该立方体并且立方体所在物理世界中的位置与A设备中的一致反之亦然在B设备检测到的平面上单击添加立方体A设备也会同步出现该立方体并且立方体所在物理世界中的位置与B设备中的一致效果如上图 所示。 具体代码地址GitHub - duzhaoquan/ARkitDemo
http://www.w-s-a.com/news/424383/

相关文章:

  • 用电脑做服务器制作网站东莞营销网站建设
  • 网站需要怎么做wordpress 重装
  • 做电影网站赚钱的方法世界500强企业排名2023
  • 领卷网站怎么做的西宁设计网站建设
  • 东莞网站建设价位软件开发税率是13%还是6
  • 企业网站建设一条龙如何在网上推广自己
  • 成品网站制作公司企梦网站建设
  • 网站开发微信授权登录ftp 如何 更新 wordpress
  • icp备案和网站不符查询公司的网站备案
  • 万江营销型网站建设泰安网站建设制作电话号码
  • 做网站是用ps还是ai服饰东莞网站建设
  • 只做一页的网站多少钱网站开发就业趋势
  • 陈村网站建设有哪些网站可以做店面设计
  • 查询网站注册信息wordpress 照片墙
  • 成都网站设计服务商室内设计设计师网站推荐
  • 企业建站系统cms百度网址ip
  • wordpress 代码编辑插件下载搜索引擎优化seo课程总结
  • 韩都衣舍网站建设的改进邯郸公众号小程序制作
  • 上海设计网站建设在线视频制作
  • 东营高端网站建设新建网站如何让百度收录
  • wordpress怎么生成网站地图微网站平台怎样做网站
  • 同安区建设局网站招投标公众号简介有趣的文案
  • 江苏州 网站制作网上宣传方法有哪些
  • 做网站时怎样申请域名郑州制作网站公司
  • 深圳 网站开发公司电话网站关键词快排名
  • 网站建设的工作总结seo同行网站
  • 网站需要兼容哪些浏览器sql数据库做的网站怎么发布
  • 营销型网站的建站步骤是什么意思广州门户网站建设公司
  • 汕尾好网站建设推广计算机软件包含网站开发
  • 建设工程施工许可证在哪个网站办wordpress更换主题白屏