SpriteKit 场景坐标系统不会像图像那样映射到纹理坐标。图像中的像素坐标具有向下增加的 y 轴;在 SpriteKit 场景中,y 轴向上。
如果您只是将 SpriteKit 场景映射到 SCNPlane 上,这一点会更加明显,这是 SceneKit 场景中唯一的东西 - 您会看到图像被翻转了。
左:从包加载的图像,右:填充SKScene 的图像映射到平面(带有注释)
要解决此问题,您需要两步坐标转换:
- 将原点 y 坐标向上平移
SKScene 的高度
- 将 y 坐标按 -1 缩放,这样增加的坐标会向下,而不是向上
您可以在SKScene 或SCNMaterialProperty 中执行此操作,将 SpriteKit 内容纹理映射到 SceneKit 对象。我赞成SCNMaterialProperty 方法——只需为其contentsTransform 属性设置适当的矩阵:
let translate = SCNMatrix4MakeTranslation(0, 1, 0)
let yFlippedTranslate = SCNMatrix4Scale(translate, 1, -1, 1)
material.diffuse.contentsTransform = yFlippedTranslate
请注意,如果您还尝试使用材质的纹理坐标(通过SCNHitTestResult)将触摸/点击事件映射到 SpriteKit 场景,则需要在此处执行类似的转换:
let texcoord = result.textureCoordinatesWithMappingChannel(0)
sprite.position.x = texcoord.x * skScene.size.width
sprite.position.y = (1 - texcoord.y) * skScene.size.height