2017-10-09 4 views
0

은 내가 다음 코드를 사용하여 사용자 정의 SCNGeometry을 만든 거라고 :scenekit, ios에서 사용자 정의 지오메트리에 일반 맵 텍스처를 적용하는 방법?

let data = NSData(bytes: position, length: MemoryLayout<float3>.size * self.objectMesh.pointCount) 
           let vertexSource = SCNGeometrySource(data: data as Data, 
                    semantic: .vertex, 
                    vectorCount: self.objectMesh.pointCount, 
                    usesFloatComponents: true, 
                    componentsPerVector: 3, 
                    bytesPerComponent: MemoryLayout<Float32>.size, 
                    dataOffset: 0, 
                    dataStride: MemoryLayout<float3>.size) 
           let data2 = NSData(bytes: uvs, length: MemoryLayout<float2>.size * self.objectMesh.pointCount) 
           let tSource = SCNGeometrySource(data: data2 as Data, 
                   semantic: .texcoord, 
                   vectorCount: self.objectMesh.pointCount, 
                   usesFloatComponents: true, 
                   componentsPerVector: 2, 
                   bytesPerComponent: MemoryLayout<Float32>.size, 
                   dataOffset: 0, 
                   dataStride: MemoryLayout<float2>.stride) 

           let indexData = NSData(bytes: faces, length: MemoryLayout<Int32>.size * self.objectMesh.faceCount) 
           let element = SCNGeometryElement(
            data: indexData as Data, 
            primitiveType: .triangles, 
            primitiveCount: self.objectMesh.faceCount/3, 
            bytesPerIndex: MemoryLayout<Int32>.size) 
           let Geometry = SCNGeometry(sources: [vertexSource, tSource], elements: [element]) 
           Geometry.firstMaterial?.diffuse.contents = self.MainTexture 
           Geometry.firstMaterial?.normal.contents = self.NormalTexture 

지금 문제가 : 텍스처가 표시되지만 일반 텍스처 맵은 지오메트리에 적용되지 않습니다. 버텍스마다 법선을 사용하지 않을 것입니다. 이 텍스쳐와 normaltexture는 예를 들어 SCNPlane geometry에 적용될 때 작동합니다. 하지만 이제는 내 사용자 정의 지오메트리에 일반 맵 텍스처를 사용하는 방법을 사용하지 않습니다.

답변

0

SCNMaterial의 일반 속성은 탄젠트 공간의 법선 맵을 예상 한 다음 유효 법선은 사용자 정의 지오메트리의 법선 맵과 정점 법선의 조합을 기반으로합니다.

모델 I/O합니다 (SCNGeometry, 사용 addNormals에 기초 MDLMesh를 만들고 MDLMesh에 기초 SCNGeometry을 만드는 대신 그 새로운 SCNGeometry를 사용하여 프로그래밍 법선을 만드는 데 사용될 수있는 addNormals 방법을 제공 MDLMesh 포함). 그러나 이상적으로는 사용자 정의 지오메트리가 포함 된 법선을 포함하는 것이 이상적입니다.