纹理始终使用SceneKit自定义几何体翻转和反转

时间:2016-11-17 11:56:37

标签: scenekit

我已经能够在SceneKit中创建自定义几何体,但我总是得到翻转/反转纹理。

我已经尝试了很多其他人的自定义几何体的示例代码,但最终还是出现了翻转/反转纹理问题。任何帮助将不胜感激!

this

  // v1 +----+ v0
  //    |    |
  // v2 +----+ v3

let positions: [Float] = [
     5.0,   5.0,  0.0,
    -5.0,   5.0,  0.0,
    -5.0,  -5.0,  0.0,
     5.0,  -5.0,  0.0
]

let normals: [Float] = [
    0.0,  0.0,  1.0,
    0.0,  0.0,  1.0,
    0.0,  0.0,  1.0,
    0.0,  0.0,  1.0
]

let tcoords: [Float] = [
    1.0,  1.0,
    0.0,  1.0,
    0.0,  0.0,
    1.0,  0.0
]

let positionsData = Data(bytes: positions, count: positions.count * 4)

let positionSource = SCNGeometrySource(data: positionsData,
                                       semantic: SCNGeometrySource.Semantic.vertex,
                                       vectorCount: positions.count / 3,
                                       usesFloatComponents: true,
                                       componentsPerVector: 3,
                                       bytesPerComponent: 4,
                                       dataOffset: 0,
                                       dataStride: 12)

let normalsData = Data(bytes: normals, count: normals.count * 4)

let normalSource = SCNGeometrySource(data: normalsData,
                                       semantic: SCNGeometrySource.Semantic.normal,
                                       vectorCount: normals.count / 3,
                                       usesFloatComponents: true,
                                       componentsPerVector: 3,
                                       bytesPerComponent: 4,
                                       dataOffset: 0,
                                       dataStride: 12)

let tcoordsData = Data(bytes: tcoords, count: tcoords.count * 4)

let tcoordSource = SCNGeometrySource(data: tcoordsData,
                                     semantic: SCNGeometrySource.Semantic.texcoord,
                                     vectorCount: tcoords.count / 2,
                                     usesFloatComponents: true,
                                     componentsPerVector: 2,
                                     bytesPerComponent: 4,
                                     dataOffset: 0,
                                     dataStride: 8)

let index: [UInt8] = [0,1,2,0,2,3]

let indexData = Data(bytes: index, count: index.count)

let indexElement = SCNGeometryElement(data: indexData,
                                      primitiveType: SCNGeometryPrimitiveType.triangles,
                                      primitiveCount: index.count / 3,
                                      bytesPerIndex: 1)

let geometry = SCNGeometry(sources: [positionSource, normalSource, tcoordSource],
                           elements: [indexElement])

1 个答案:

答案 0 :(得分:3)

您想要翻转tcoords中的纹理坐标。 SceneKit跟随convention,纹理坐标的原点位于纹理的左上角。

  

在Metal中,帧缓冲附件的像素坐标系的原点定义在左上角。类似地,帧缓冲附件的像素坐标系的原点是左上角。