2016-11-03 2 views
0

SceneKit 모델러로 3D 장면을 만든 다음 내 Metal 앱으로 읽어 보겠습니다. 이 작업을 수행하려면 SceneKitModelIO API가 있지만 해당 조각이 어떻게 맞는지 명확하지 않습니다.어떻게 SceneKit .scn 파일을 내 Metal 앱에로드/파싱합니까?

그럼 내가 원하는 파일은 .scn 파일 ->MDL Mesh -> geometry + texture입니다. 내 Metal 쉐이더를 SceneKit 모델러에서 만든 머티리얼과 동기화하는 방법이 확실하지 않습니다.

답변

3

SceneKit 데이터를 ModelIO로 가져오고 ModelIO 데이터를 Metal로 렌더링하는 두 가지 주요 부분이 있습니다.

  1. 는 다음 메쉬로 사용할 개체를 얻을 수 ModelIO의 API를 사용 .scn 파일을로드 ModelIO 먼저 사용 SceneKit의 API (SCNScene 또는 SCNSceneSource에 SceneKit 장면을 얻으려면. 당신은 전체 장면에서 MDLAsset를 만들 수 있습니다 assetWithSCNScene:bufferAllocator:를 사용하고 다음 원하는 메쉬를 찾을 ModelIO에서 자산의 객체 계층 구조를 통해 도보 또는 SceneKit의 노드 계층 구조를 통해 도보가 또는 SCNGeometry 당신이 원하는 SCNNode 발견하고하는 것은 objectWithSCNNode:bufferAllocator: 또는 meshWithSCNGeometry:bufferAllocator:를 사용하여 ModelIO에 메쉬를 얻을.

  2. Metal Apps에서 ModelIO 메쉬를 사용하는 경우 Apple은 ModelIO를 사용하여 OBJ 메쉬를로드하고 MetalKit을 사용하여 메쉬 데이터를 Metal GPU 버퍼로 가져오고 ModelIO에서 가져온 재료 정보를 셰이더에 연결하는 방법을 보여주는 sample code project을 가지고 있습니다 자신의 렌더러에서 사용할 변수.

당신은 함께 다음의 두 가지를 넣어 할 수 있어야한다 : 샘플 코드를 얻기 위해 OBJ를로드 어디 MDLAsset 또는 MDLMesh은, (1) 자산을 취득 또는 SceneKit 밖으로 메쉬의 방법을 사용 파일 대신.

물론 SceneKit 머티리얼 모델은 샘플 코드에서 사용 된 간단한 Phong 쉐이더보다 훨씬 복잡합니다. 그러나 샘플 코드에서는 MDLMaterial의 속성을 반복하고 금속 쉐이더에서 해당 인수를 설정하는 방법을 보여줍니다. 더 복잡한 쉐이더를 만드는 경우 쉐이더의 입력이 무엇이든간에 머티리얼 속성을 매핑하는 동일한 단계를 따르십시오.

+0

아하! 즉, 간단히 말해서 모델러에서 기하학과 재료 이름을 제공합니다 : "내 상자", "시원한 재료"그리고 나서 Traversal 동안 형상/재료 검색 - SceneKit 또는 ModelIO 탐색 방식을 사용합니다. 열쇠는 사물에 라벨을 붙이는 것입니다. 나는 그 권리를 얻었 는가? – dugla

+0

라벨이 붙어 있는지 여부에 관계없이 머티리얼을 반복 할 수 있지만 라벨은 확실히 추적 할 수 있도록 도와줍니다. – rickster

+0

잠깐, 뭐라구? 라벨이없는 장면의 항목을 어떻게 식별합니까? 2 개의 텍스쳐 구체는 4 개의 라벨을 의미합니다 (별개의 재료 설명을 가정 할 경우). – dugla