swift 如何将视频素材添加到ModelEntity?

mwg9r5ms  于 2023-08-02  发布在  Swift
关注(0)|答案(3)|浏览(138)

我用代码在RealityKit中添加了一个图片纹理,效果很好。

  1. var material = SimpleMaterial()
  2. material.baseColor = try! .texture(.load(named: "image.jpg"))

字符串
我尝试使用此代码添加一个视频文件作为纹理,但它崩溃了!!!

  1. guard let url = Bundle.main.url(forResource: "data", withExtension: "mp4") else {
  2. return
  3. }
  4. material.baseColor = try! .texture(.load(contentsOf: url))


如何添加视频文件?

kjthegm6

kjthegm61#

RealityKit视频素材

您可以在RealityKit 2.0及更高版本中使用Video Material。RealityKit v1.0不支持视频素材。下面的代码向您展示了如何应用视频素材:

  • 方法A*
  1. import SwiftUI
  2. import RealityKit
  3. import AVFoundation
  4. struct ARViewContainer : UIViewRepresentable {
  5. let arView = ARView(frame: .zero)
  6. let anchor = AnchorEntity()
  7. func makeUIView(context: Context) -> ARView {
  8. anchor.position.z += 1.0
  9. self.loadVideoMaterial()
  10. return arView
  11. }
  12. func loadVideoMaterial() {
  13. guard let pathToVideo = Bundle.main.path(forResource: "video",
  14. ofType: "mp4")
  15. else { return }
  16. let videoURL = URL(fileURLWithPath: pathToVideo)
  17. let avPlayer = AVPlayer(url: videoURL)
  18. // 16:9 video
  19. let mesh = MeshResource.generatePlane(width: 1.92, height: 1.08)
  20. let material = VideoMaterial(avPlayer: avPlayer)
  21. let planeModel = ModelEntity(mesh: mesh, materials: [material])
  22. anchor.addChild(planeModel)
  23. arView.scene.anchors.append(anchor)
  24. avPlayer.volume = 0.05
  25. avPlayer.play()
  26. }
  27. func updateUIView(_ view: ARView, context: Context) { }
  28. }
  29. struct ContentView : View {
  30. var body: some View {
  31. ARViewContainer().ignoresSafeArea()
  32. }
  33. }

字符串
此外,您可以通过以下方式添加RealityKit的VideoMaterial

  • 方法B*
  1. // AVPLAYER and PlayerItem
  2. let url = Bundle.main.url(forResource: "video", withExtension: "mp4")
  3. let asset = AVAsset(url: url!)
  4. let playerItem = AVPlayerItem(asset: asset)
  5. let avPlayer = AVPlayer()
  6. // ENTITY
  7. let mesh = MeshResource.generateSphere(radius: 1)
  8. let material = VideoMaterial(avPlayer: avPlayer)
  9. let entity = ModelEntity(mesh: mesh, materials: [material])
  10. // ANCHOR
  11. let anchor = AnchorEntity(world: [0,0,-10])
  12. anchor.addChild(entity)
  13. arView.scene.anchors.append(anchor)
  14. // PLAYBACK
  15. avPlayer.replaceCurrentItem(with: playerItem)
  16. avPlayer.play()


的数据

RealityKit的VideoPlayerComponent(visionOS)

在visionOS中,VideoPlayerComponent是创建视频场景的另一种方式(包括具有透明度的HEVC视频)。

  1. import SwiftUI
  2. import AVKit
  3. import RealityKit
  4. struct ContentView: View {
  5. @State var player: AVPlayer?
  6. let screen = Entity()
  7. var body: some View {
  8. RealityView { content in
  9. let url = Bundle.main.url(forResource: "puppets", withExtension: "mov")!
  10. player = AVPlayer(url: url)
  11. screen.components[VideoPlayerComponent.self] = .init(avPlayer: player!)
  12. let anchor = AnchorEntity()
  13. anchor.addChild(screen)
  14. content.add(anchor)
  15. player?.play()
  16. }
  17. }
  18. }
  19. #Preview {
  20. ContentView()
  21. }


SceneKit视频素材

  1. import SwiftUI
  2. import SceneKit
  3. import AVFoundation
  4. struct VRViewContainer : UIViewRepresentable {
  5. let sceneView = SCNView(frame: .zero)
  6. func makeUIView(context: Context) -> SCNView {
  7. sceneView.scene = SCNScene()
  8. sceneView.backgroundColor = .black
  9. sceneView.pointOfView?.position.z += 0.5
  10. sceneView.isPlaying = true
  11. self.loadVideoMaterial()
  12. return sceneView
  13. }
  14. func loadVideoMaterial() {
  15. guard let pathToVideo = Bundle.main.path(forResource: "video",
  16. ofType: "mp4")
  17. else { return }
  18. let videoURL = URL(fileURLWithPath: pathToVideo)
  19. let avPlayer = AVPlayer(url: videoURL)
  20. // 16:9 video
  21. let material = SCNMaterial()
  22. material.diffuse.contents = avPlayer
  23. let mesh = SCNPlane(width: 1.92, height: 1.08)
  24. mesh.materials[0] = material
  25. let planeModel = SCNNode(geometry: mesh)
  26. sceneView.scene?.rootNode.addChildNode(planeModel)
  27. avPlayer.volume = 0.05
  28. avPlayer.play()
  29. }
  30. func updateUIView(_ view: SCNView, context: Context) { }
  31. }
  32. struct ContentView : View {
  33. var body: some View {
  34. VRViewContainer().ignoresSafeArea()
  35. }
  36. }

展开查看全部
nhaq1z21

nhaq1z212#

我找到了解决方法,比如下面的代码

  1. self.arView = arView
  2. let scene = SCNScene()
  3. scnView = SCNView(frame: arView.frame)
  4. scnView?.scene = scene
  5. scnView?.backgroundColor = UIColor.clear
  6. scnView?.scene?.background.contents = UIColor.clear

字符串
然后添加SCN摄像机并从ARFrame设置摄像机变换,例如:

  1. let rotation = SCNMatrix4MakeRotation(.pi / 2.0, 0, 0, 1)
  2. let cameraTransform = simd_mul(frame.camera.transform, simd_float4x4(rotation))
  3. let projectionMatrix = SCNMatrix4(frame.camera.projectionMatrix(for: .portrait,
  4. viewportSize: self.viewBounds!.size,
  5. zNear: 0.001,
  6. zFar: 10000) )
  7. self.arCameraNode?.simdTransform = cameraTransform
  8. self.arCameraNode?.camera?.projectionTransform = projectionMatrix


最后,将SCN视频节点添加到rootNode
不过,有一点转变,我想你可以等待Realitykit支持视频素材。

展开查看全部
uqdfh47h

uqdfh47h3#

我可能错了,但RealityKit目前不支持视频。视频不是普通的纹理,它是一组动画纹理。

相关问题