我已经能够在SceneKit中创建自定义几何体,但我总是得到翻转/反转纹理。
我已经尝试了很多其他人的自定义几何体的示例代码,但最终还是出现了翻转/反转纹理问题。任何帮助将不胜感激!
// 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])
答案 0 :(得分:3)
您想要翻转tcoords
中的纹理坐标。
SceneKit跟随convention,纹理坐标的原点位于纹理的左上角。
在Metal中,帧缓冲附件的像素坐标系的原点定义在左上角。类似地,帧缓冲附件的像素坐标系的原点是左上角。