Machineboy空

RealityKit 입문 - Material 종류들 (Occulusion, Unlit and Video Materials) 본문

언어/swift

RealityKit 입문 - Material 종류들 (Occulusion, Unlit and Video Materials)

안녕도라 2024. 10. 13. 18:15

Occulusion이란? (폐색, 폐쇄, 교합 등)

basically the state of being closed, blocked, occluded meaning something is blocking you so you can really see the other thing.

 

occuding it : physical table, which is hiding the virtual object

 

https://youtube.com/shorts/Z54MMVrD-nE?si=rjsLrlUUhmEPZ_Nw

 


Occulusion Material이란!

// Simple Material
let box = ModelEntity(mesh:MeshResource.generateBox(size: 0.3), materials: [SimpleMaterial(color: .red, isMetallic: false)])

// Occulusion Material
let box = ModelEntity(mesh:MeshResource.generateBox(size: 0.3), materials: [OcclusionMaterial()])

 

Simple Material vs Occulusion Material


Video Material과 AVPlayer

material will have a video playing on it

재생할 비디오 파일 추가하고 불러오기

 

struct ARViewContainer: UIViewRepresentable {
    
    func makeUIView(context: Context) -> ARView {
        
        let arView = ARView(frame: .zero)
        let anchor = AnchorEntity(plane: .horizontal)
        
        guard let url = Bundle.main.url(forResource: "hanju", withExtension: "MOV") else {
            fatalError("Couldn't find the movie file.")
        }
        
        let player = AVPlayer(url: url)
        
        let material = VideoMaterial(avPlayer: player)
        material.controller.audioInputMode = .spatial
        
        let modelEntity = ModelEntity(mesh: MeshResource.generatePlane(width: 1, height: 0.5), materials: [material])
        modelEntity.transform.rotation = simd_quatf(angle: .pi / 2, axis: SIMD3(0, 0, 1))

        player.play()
        
        anchor.addChild(modelEntity)
        arView.scene.addAnchor(anchor)
       
        return arView
    }
    
    func updateUIView(_ uiView: ARView, context: Context) {}

}

 

정말 교육은 단시간 내에 양질의 정보를 얻을 수 있다..


Unlit Material

빛에 영향을 받지 않는 메테리얼.

SimpleMaterial을 사용한 큐브를 빛이 없는 환경에 놓으면, dimmed out 된다.

Unlit Material을 사용한 큐브는 빛이 있든 없는 변하지 않는다.

빛을 임의로 끄지 못해서, unlit material 실행 모습만 찍어둠. SimpleMaterial을 사용한 큐브의 well-lit 환경과 어두운 환경에서의 렌더링을 비교해볼 것!

 


Image Texture으로 Material 만들기(1) - load

 let anchor = AnchorEntity(plane: .horizontal)
        let mesh = MeshResource.generateBox(size: 0.3)
        let box = ModelEntity(mesh: mesh)
        
        let texture = try?TextureResource.load(named: "cat")
        
        if let texture = texture {
            var material = UnlitMaterial()
            material.color = .init(tint: .white, texture: .init(texture))
            
            box.model?.materials = [material]
        }
        
        anchor.addChild(box)
        arView.scene.addAnchor(anchor)

Image Texture으로 Material 만들기(2) - loadAsync , 각면마다 다른 texture

 func setup() {
        guard let arView = arView else { return }
        
        let anchor = AnchorEntity(plane: .horizontal)
        //let mesh = MeshResource.generateBox(size: 0.3) 이렇게 하면 개별면에 접근할 수 없다
        let mesh = MeshResource.generateBox(width: 0.3, height: 0.3, depth: 0.3, cornerRadius: 0, splitFaces: true)
        let box = ModelEntity(mesh: mesh)
        
        
        cancellable = TextureResource.loadAsync(named: "pik1")
            .append(TextureResource.load(named: "pik2"))
            .append(TextureResource.load(named: "cat"))
            .append(TextureResource.load(named: "cat"))
            .append(TextureResource.load(named: "pik2"))
            .append(TextureResource.load(named: "pik1"))
            .collect()
            .sink ( receiveCompletion: { [weak self] completion in
                
                if case let .failure(error) = completion {
                    fatalError("Error: \(error)")
                }
                self?.cancellable?.cancel()
            }, receiveValue: { textures in
                
                var materials: [UnlitMaterial] = []
                
                textures.forEach { texture in
                    var material = UnlitMaterial()
                    material.color = .init(tint:.white, texture: .init(texture))
                    materials.append(material)
                }
                
                box.model?.materials = materials
                anchor.addChild(box)
                arView.scene.addAnchor(anchor)
            })
        
    }

'언어 > swift' 카테고리의 다른 글

RealityKit 입문 - 측정앱 만들기  (0) 2024.10.15
RealityKit 입문 - ARCouchingView 더하기  (0) 2024.10.14
RealityKit 입문 - Reality Composer  (0) 2024.10.13
RealityKit 입문 - Models .usdz  (3) 2024.10.12
RealityKit 입문 - Gestures  (1) 2024.10.11