Я пытаюсь заполнить SKShapeNode текстурой так, чтобы он содержал всю текстуру без обрезки части текстуры. Я видел, что с SKShapeNode было много ошибок, однако есть более простой способ достичь этой цели без создания пользовательской функции. Прямо сейчас мой skScene настроен на содержимое SCNSphere.
class ViewController: UIViewController, SkSceneDelegate {
var scnView: SCNView!
var scnScene: SCNScene!
var sphere: SCNSphere!
var mainskScene: SKScene!
override func viewDidLoad() {
super.viewDidLoad()
setUpInitialScene()
}
func setUpInitialScene() {
scnScene = SCNScene()
sphere = SCNSphere(radius: 1)
sphere.geometry!.firstmaterial!.diffuse.contents = UIImage(named: "blankImage")
scnScene.rootNode.addChildNode(sphere)
sphere.geometry!.firstmaterial!.lightingModel = SCNMaterial.LightingModel.constant
let currentImage = sphere.geometry!.firstmaterial!.diffuse.contents as! UIImage
mainskScene = SKScene(size: currentImage.size)
sphere.geometry!.firstMaterial!.diffuse.contents = mainskScene
sphere.geometry!.firstMaterial!.diffuse.contentsTransform = SCNMatrix4Translate(SCNMatrix4MakeScale(1, -1, 1), 0, 1, 0)
let background = SKSpriteNode(texture: SKTexture(image: currentImage))
background.position = CGPoint(x: mainskScene.frame.midX, y: mainskScene.frame.midY)
mainskScene.addChild(background)
scnView = self.view as? SCNView
scnView.scene = scnScene
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapped))
tapGesture.delegate = self
tapGesture.numberOfTapsRequired = 1
self.scnView.addGestureRecognizer(tapGesture)
}
@objc func tapped(tap: UITapGestureRecognizer) {
let results = scnView.hitTest(tap.location(in: scnView), options: [SCNHitTestOption.firstFoundOnly: true]) as [SCNHitTestResult]
if let result = results.first {
if result.node === sphere {
let channel = sphere.geometry!.firstMaterial!.diffuse.mappingChannel
let texcoord = result.textureCoordinates(withMappingChannel: channel)
let path = UIBezierPath() //Path is not the problem so I felt like didn't need to include points
let shapesprite = SKShapeNode(path: path.cgPath)
let image = UIImage(imageNamed: "steve")
shapesprite.fillTexture = SKTexture(image: image!)
shapesprite.strokeColor = UIColor.green
shapesprite.lineWidth = 1
shapesprite.fillColor = SKColor.white
shapesprite.position.x = texcoord.x
shapesprite.position.y = texcoord.y
mainskScene.addChild(shapesprite)
}
}
}