qq_35903187 2021-04-19 21:09 采纳率: 0%
浏览 21

arkit无法创建垂直面锚点

import SwiftUI
import RealityKit
import AVFoundation  //视频播放需要用到avfoundation

struct ContentView : View {
    var body: some View {
        return ARViewContainer().edgesIgnoringSafeArea(.all)
    }
}



struct ARViewContainer: UIViewRepresentable {
    //实现目标:在垂直面墙体上放置一个tv。
    //动作:点击电视,电视开始播放视频文件
    func updateUIView(_ uiView: ARView, context: Context) {}
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
        
//定义一个电视,包括1外壳和2屏幕部分(播放视频)
        let dimensions:SIMD3<Float>=[1.25,0.05,0.6]
        //屏幕整体,以米做单位定义长宽高
        
        
        //houshing外壳部分:
        let housingMesh = MeshResource.generateBox(size: dimensions)
        let housingMat  = SimpleMaterial(color:.blue,roughness:0.2,isMetallic:true)
        //📺外壳材质,黑色,粗糙程度0.2,材质为金属
        let housingEntity = ModelEntity(mesh:housingMesh,materials:[housingMat])
        //建立外壳实体
        
        
        //screen显示区域部分:
        let screenMesh = MeshResource.generatePlane(width:dimensions.x, depth:dimensions.z )
        let screenMat  = SimpleMaterial( color:.black, roughness:0.1, isMetallic: false)
        //显示区域部分尺寸,屏幕材质,注意,屏幕显示没有厚度
        let screenEntity = ModelEntity(mesh:screenMesh,materials:[screenMat])
        //显示屏实体
        screenEntity.name = "tvScreen"
        //显示屏部分给个名字,方便下方动作调用
        
        housingEntity.addChild(screenEntity)
        //实体合成,将屏幕外壳与屏幕显示部分结合到一起,方便调用
        
        screenEntity.setPosition([0,(dimensions.y)/2+0.01,0],relativeTo:housingEntity)
        //稍微分离屏幕显示和屏幕边框部分,显示出外壳和显示屏的凹陷感
        
        
//在arview添加扫描点
        let anchor = AnchorEntity(plane:.vertical)
        //建立垂直锚点
        anchor.addChild(housingEntity)
        //生成屏幕模型
        arView.scene.addAnchor(anchor)
        
        
//让电视支持点击手势操作
        arView.enableTapGesture()
        housingEntity.generateCollisionShapes(recursive:true)
        return arView
        
    }
    
   
    
}

//定义动作
extension ARView{
    //定义手势识别器
    
     func enableTapGesture(){
        let tapGestureRecognizer = UITapGestureRecognizer(target:self,action:#selector(handleTap(recognize:)))
        self.addGestureRecognizer(tapGestureRecognizer)
    //使用默认动作
     }
        //确认点击的是tv
  @objc    func handleTap(recognize:UITapGestureRecognizer){
            let tapLocation = recognize.location(in:self)
            
            if let entity = self.entity(at: tapLocation) as? ModelEntity,entity.name == "tvScreen"{
            
            //播放视频,调用AVfoundation
                loadVideoMaterial(for:entity)
            }
        }

func loadVideoMaterial(for entity: ModelEntity) {
    let asset = AVAsset(url:Bundle.main.url(forResource:"video1",withExtension:"mp4")!)
    let playerItem = AVPlayerItem(asset:asset)
    
    let player = AVPlayer()
    entity.model? .materials = [VideoMaterial(avPlayer: player)]
    
    player.replaceCurrentItem(with: playerItem)
    
    player.play()
}
        
     }

搜了很多资料,let anchor = AnchorEntity(plane:[.vertical,.horizontal]),可我使用都不行,求大佬解答

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-07-15 22:41
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述:在SwiftUI中使用RealityKit放置一个电视模型,并实现点击电视播放视频的功能。需要以规范的格式解答问题并给出示例和必要的代码。 解答:根据提供的代码,您的目标是在垂直面墙体上放置一个电视模型,并实现点击电视播放视频的功能。您已经定义了一个ARViewContainer结构体和一个ARViewContainer类,在makeUIView方法中创建了一个包含电视模型的ARView,并实现了点击电视播放视频的功能。 要在垂直面墙体上放置一个电视模型,您可以使用以下代码示例:
    import SwiftUI
    import RealityKit
    struct ContentView: View {
        var body: some View {
            return ARViewContainer().edgesIgnoringSafeArea(.all)
        }
    }
    struct ARViewContainer: UIViewRepresentable {
        func updateUIView(_ uiView: ARView, context: Context) {}
        func makeUIView(context: Context) -> ARView {
            let arView = ARView(frame: .zero)
            // 创建电视模型
            let tvEntity = Entity()
            // 将电视模型放置在垂直面墙体上
            let anchor = AnchorEntity(plane: .vertical)
            anchor.addChild(tvEntity)
            arView.scene.addAnchor(anchor)
            // 添加点击手势
            arView.enableTapGesture()
            return arView
        }
    }
    extension ARView {
        func enableTapGesture() {
            let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognize:)))
            self.addGestureRecognizer(tapGestureRecognizer)
        }
        @objc func handleTap(recognize: UITapGestureRecognizer) {
            let tapLocation = recognize.location(in: self)
            if let entity = self.entity(at: tapLocation) {
                // 判断点击的是电视模型
                if entity.name == "tvEntity" {
                    // 播放视频
                    playVideo()
                }
            }
        }
        func playVideo() {
            // 播放视频的操作
            // 可以使用 AVFoundation 或者其他视频播放框架来实现
        }
    }
    

    在这段代码中,您可以根据需要修改tvEntity的创建方式,并在handleTap方法中判断点击的实体是不是电视模型,然后调用playVideo方法来播放视频。 希望这个回答对您有帮助!如果您有任何其他问题,请随时提出。

    评论

报告相同问题?

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。