HIT해

[iOS/SceneKit] SceneView dae 파일 불러오기 본문

Swift/UIKit 개발 노트

[iOS/SceneKit] SceneView dae 파일 불러오기

힛해 2024. 8. 19. 10:12
728x90

 

지난 포스팅에서 블렌더 설정값을 가져오지 못하는 상황을 겪게 되고...

 

fbx 뿐만 아니라 mtl , obj , usdz.... 3D 모델 파일의 대표주자 녀석들 모두 블렌더 설정값을 가져오지 못하는 사태가 발생했다.

 

blender to Swift 로 dae 확장자를 자주 쓰는 것을 확인하고 적용해보니 다른 파일들과는 사뭇 다른 모습이 보였다.

 

 

 

 

바로 Physically Based 를 했을때 블렌더 설정값이 나온다는 것이었다.

 

그럼 dae 파일을 출력하는 방법에 대해 알아보자

 

1. dae 프로젝트 추가하기

dae 파일을 가져올때 obj usdz 파일과 마찬가지로 SceneKit Tool 에 드래그 앤 드랍으로 가져와 scn 파일로 import 해준다.

 

2. Materials 추가하기

 

+ 버튼을 눌러 등록되어있는 재질들을 전부 추가해주자.

 

3. Properties Shading 설정

블렌더 설정값을 가져오기 위해서는 Physically Based 로 설정해주어야한다

Constant는 조명이 없을때의 모습

Shadow Only 는 투명하게

Custom Program 은 설정값을 임의로 변경할 수 있다.

 

모든 Materials 의 설정을 끝마치면 잘 다듬어진 모델을 볼 수 있을 것이다.

 

4. 조명 추가하기

scn 파일을 열어보면 조명이 추가되어있어 빛이 반사되는 것을 볼 수 있다.

그러나 단순히 scn 파일을 불러오면 매우 어두워서 모델이 그림자진것을 볼 수 있다.

 

그래서 우리는 두가지를 추가해주어야한다.

  1. 환경 조명 : 모델 파일 전체 조명
  2. 방향성 조명 : 특정 시점에서 쬐는 조명

 

예시코드

 let scene = SCNScene(named: "Dols.scnassets/last.scn") ?? SCNScene()

        let cameraNode = SCNNode()
           cameraNode.camera = SCNCamera()
           cameraNode.position = SCNVector3(x: 0, y: 0, z: 10)
           cameraNode.camera?.automaticallyAdjustsZRange = true
           scene.rootNode.addChildNode(cameraNode)
        
        // 환경 조명 추가
          let ambientLightNode = SCNNode()
          let ambientLight = SCNLight()
          ambientLight.type = .ambient
          ambientLight.intensity = 1000 // 환경 조명 강도 조절
          ambientLightNode.light = ambientLight
          scene.rootNode.addChildNode(ambientLightNode)
          
          // 방향성 조명 추가
          let directionalLightNode = SCNNode()
          let directionalLight = SCNLight()
          directionalLight.type = .directional
          directionalLight.intensity = 3000 // 방향성 조명 강도 조절
          directionalLight.color = UIColor.white // 조명 색상 설정
          directionalLight.castsShadow = true // 그림자 생성 설정
          directionalLightNode.light = directionalLight
          
          // 방향성 조명의 방향 설정
          directionalLightNode.position = SCNVector3(x: 5, y: 5, z: 10)
            directionalLightNode.look(at: SCNVector3.init(x: 0, y: 0, z: 0)) // 장면의 중심을 향하도록 조명 방향 설정
          scene.rootNode.addChildNode(directionalLightNode)

 

이렇게 추가해주면 파일을 열었을때와 같은 밝기로 볼 수 있다.

 

방향성 조명의 시작점, 밝기, 환경조명의 밝기는 위와같이 커스텀해 맞춤 설정을 할 수 있다!

 

+ 블렌더 설정값 받아오게 하는게 몇시간이 걸렸는지.. 밤을 꼬박 셋다..